《Opencv3编程入门》学习笔记—第一章

news2024/12/22 19:15:18

《Opencv3编程入门》学习笔记

记录一下在学习《Opencv3编程入门》这本书时遇到的问题或重要的知识点。

第一章 邂逅opencv

参考推荐软件版本:visual studio2010 opencv2.4.9

  • visual studio安装教程:

https://blog.csdn.net/qq_45768871/article/details/108178858

  • opencv2.4.9下载:(解压到指定文件夹就行)

https://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.9/opencv-2.4.9.exe/download

  • 配置环境变量:将opencv解压路径/build/x64/vc10/bin 添加到Path中

  • Visual studio新建项目配置(参考书p17-p21)
    注意:我这里选择和书上一样使用Win32编译器+x86:

附1:opencv附加依赖项

opencv_calib3d249.lib
opencv_contrib249.lib
opencv_core249.lib
opencv_features2d249.lib
opencv_flann249.lib
opencv_gpu249.lib
opencv_highgui249.lib
opencv_imgproc249.lib
opencv_legacy249.lib
opencv_ml249.lib
opencv_nonfree249.lib
opencv_objdetect249.lib
opencv_ocl249.lib
opencv_photo249.lib
opencv_stitching249.lib
opencv_superres249.lib
opencv_ts249.lib
opencv_video249.lib
opencv_videostab249.lib

opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_ocl249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib

问题:运行报错如下图所示

在这里插入图片描述
解决:这是因为文件路径错误,特别要注意反斜杠(因为直接放在源文件下的图片,无法读取到,所以选择使用文件的绝对路径)

Mat img = imread("D://lili/Desktop/2.jpg");

测试:载入并显示一张图片到窗口中

#include <opencv2\opencv.hpp>
using namespace cv;

int main(){
	//1、读入一张图片
	Mat img = imread("D://lili/Desktop/jpg/opencv/2.jpg");
	//2、在窗口中现实载入的图片
	imshow("【载入的图片】",img);
	//3、等待6000ms后窗口自动关闭
	waitKey(6000);
}

快速上手

(一)图像显示

#include <opencv2\opencv.hpp>
using namespace cv;  //包含cv命名空间

void main(){
	Mat srcImage = imread("D://lili/Desktop/jpg/opencv/2.jpg");
	imshow("【原始图】",srcImage);
	waitKey(0);  //等待任意键按下
}

在这里插入图片描述

(二)图像腐蚀

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;

int main(){
	Mat srcImage = imread("D://lili/Desktop/jpg/opencv/2.jpg");
	imshow("【原图】腐蚀操作",srcImage);
	//拓展1:返回指定形状和尺寸的结构元素
	Mat element = getStructuringElement(MORPH_CROSS,Size(12,12));
	Mat distImage;
	//拓展2
	erode(srcImage,distImage,element);
	imshow("【效果图】腐蚀操作",distImage);
	waitKey(0);

	return 0;
}

在这里插入图片描述

拓展1:getStructuringElement函数

形态学处理函数:获取结构化元素,会返回指定形状和尺寸的结构元素。 (类似卷积核)

Mat getStructuringElement(int shape, Size esize, Point anchor =Point(-1, -1)); 
  • 参数1: 表示内核的形状,有三种: 矩形:MORPH_RECT; 交叉形:MORPH_CROSS; 椭圆形:MORPH_ELLIPSE;

  • 参数2: 表示内核的尺寸。

  • 参数3: 表示锚点的位置。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。

拓展2:erode函数
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );

参数描述

  • 参数1: src 输入图像;通道的数量可以是任意的,但是深度值应该是以下之一: CV_8U, CV_16U, CV_16S, CV_32F,CV_64F.

  • 参数2:dst 和源图像同样大小和类型的输出图像。

  • 参数3:kernel 用于腐蚀的结构元素;如果element=Mat(),是一个3 x 3的矩形结构元素. Kernel可以通过使用getStructuringElement来创建。

  • 参数4:anchor 素中的锚点的位置,默认是值(-1,-1),也就是说锚点在元素的中心位置。

  • 参数5:iterations 腐蚀的迭代次数。

  • 参数6:borderType像素外推方法。参见#BorderTypes, BORDER_WRAP不支持。

  • 参数7:borderValue 固定边缘的情况下的边缘值。

(三)图像模糊

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;

int main(){
	Mat srcImage = imread("D://lili/Desktop/jpg/opencv/2.jpg");
	imshow("均值滤波【原图】",srcImage);

	Mat distImage;
	blur(srcImage,distImage,Size(11,11));
	imshow("均值滤波【效果图】",distImage);
	waitKey(0);

	return 0;
}

在这里插入图片描述

拓展1:blur函数
void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

参数描述

  • 参数1:InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
  • 参数2:OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
  • 参数3:Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小
  • 参数4:Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。
  • 参数5:int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

(四)canny边缘检测

操作步骤:将原图像转为灰度图——》降噪——》运行canny算子

#include <opencv2\opencv.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace cv;

int main(){
	Mat srcImage = imread("D://lili/Desktop/jpg/opencv/2.jpg");
	imshow("【原图】Canny边缘检测",srcImage);
	Mat distImage,edge,grayImage;

	//1、创建与src同类型和大小的矩阵
	distImage.create(srcImage.size(),srcImage.type());
	//2、将原图像转为灰度图
	cvtColor(srcImage,grayImage,CV_BGR2GRAY);
	//3、3*3内核降噪 模糊去噪:噪声会影响边缘检测的准确性,因此首先要将噪声过滤掉
	blur(grayImage,edge,Size(3,3));
	//4、运行canny算子
	Canny(edge,edge,3,9,3);
	//5、显示效果
	imshow("【效果图】Canny边缘检测",edge);
	waitKey(0);

	return 0;
}

在这里插入图片描述

拓展1:cvtColor函数:图像空间色彩转换
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );

函数参数解释

  • 参数1:src(source):输入的源图像。为矩阵形式。

  • 参数2:dst(destination):输出的目标图像,即经过色彩转后我们需要得到的图像。也为矩阵形式。

  • 参数3:code:颜色空间转换的标识符,表示我们所要进行空间转换的结果。

    code的参数多达200多,在此列举一些常用的参数,更多参数请查阅opencv官方文档
    在这里插入图片描述
    注意!在opencv中彩色图像(RGB图像)按照BGR顺序进行存储。所以以彩色图像为源图像进行颜色空间转换时,注意是“BGR2”

  • 参数4:dstCn:目标图像的通道数。 默认值为0,表示目标图像取源图像的通道数 。

拓展2:Canny边缘检测—Canny函数
void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false)

参数详解:

  • 第一个参数:InputArray类型的image,输入图像,Mat对象节课,需为单通道8位图像。
  • 第二个参数:OutputArray类型的edges,输出的边缘图,需要和输入图像有相同的尺寸和类型。
  • 第三个参数:double类型的threshold1,第一个滞后性阈值。
  • 第四个参数:double类型的threshold2,第二个滞后性阈值。
  • 第五个参数:int类型的apertureSize,表示算子的孔径的大小,默认值时3.
  • 第六个参数:bool类型的L2gradient,一个计算图像梯度复制的标识,默认false。

(五)opencv视频操作基础—读取并播放视频

#include <opencv2\opencv.hpp>
using namespace cv;

int main(){
	//1、读入视频 或者写成:VideoCapture capture;capture.open("XXX.avi");
	VideoCapture capture("D://lili/Desktop/jpg/opencv/1.avi");
	//2、循环显示每一帧
	while(1){
		Mat frame;  //定义一个Mat对象,用于存储每一帧的图像
		capture >> frame; //读取当前帧
		imshow("读取视频",frame); //显示当前帧
		waitKey(30);
	}
	return 0;
}

在这里插入图片描述
注意:当视频播放结束以后,报如下图的错误,问题待解决。
在这里插入图片描述

(六)opencv视频操作基础—调用摄像头采集图像

注:这里由于电脑摄像头不好使,并没有效果图

1、调用摄像头
将指定的视频文件名替换为0,即表示调用摄像头

#include <opencv2\opencv.hpp>
using namespace cv;

int main(){
	//1、读入视频
	VideoCapture capture(0);
	//2、循环显示每一帧
	while(1){
		Mat frame;  //定义一个Mat对象,用于存储每一帧的图像
		capture >> frame; //读取当前帧
		imshow("读取视频",frame); //显示当前帧
		waitKey(30);
	}
	return 0;
}

2、canny边缘检测摄像头采集视频
即对每一帧(frame)执行canny边缘检测操作

#include <opencv2\opencv.hpp>
using namespace cv;

int main(){
	//读入视频
	VideoCapture capture(0);
	Mat edges;
	//循环显示每一帧
	while(1){
		//1、读入图像
		Mat frame; 
		capture >> frame; 
		//2、将图像转为灰度图像
		cvtColor(frame,edges,CV_BGR2GRAY);
		//3、降噪
		blur(edges,edges,Size(7,7));
		//4、canny边缘检测
		Canny(edges,edges,0,30,0);
		imshow("被canny后的视频",edges); 
		waitKey(30);
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode链表题(中等)剖析

文章目录 &#x1f490;文章导读&#x1f490;1.合并零之间的结点解题思路 &#x1f490;2.链表中最大孪生和解题思路 &#x1f490;3.链表的随机节点解题思路 &#x1f490;4.复杂链表的复制解题思路 &#x1f490;5.两辆交换两表中的节点解题思路 &#x1f490;文章导读 &…

【深圳触觉智能技术分享】RK3568 RK809电量计电池调试

本文基于IDO-SBC3568主板介绍说明PMIC RK809电量计的调试方法。 IDO-SBC3568-V1是一款基于RK3568的工控主板&#xff0c;采用22nm先进工艺制程&#xff0c;四核A55 CPU&#xff0c;主频高达2.0GHz&#xff0c;支持高达8GB高速LPDDR4&#xff0c;1T算力NPU &#xff0c;4K H.26…

如何在Allegro软件中快速复制走线和过孔?

在PCB设计过程中&#xff0c;快速而准确复制走线和过孔是提高设计效率和减少重复工作的关键所在&#xff0c;因此很多工程师会选择使用Allegro来复制走线和过孔&#xff0c;因为Allegro是一款功能强大且灵活的PCB设计软件&#xff0c;提供了多种工具和功能&#xff0c;自然包括…

springboot+java汽车配件销售业绩管理系统 J2EE平台技术

汽车配件销售类企业近年来得到长足发展,在市场份额不断扩大同时,如何更好地管理企业现有销售项目资源成为摆在该类企业面前的重要课题之一。本次打算开发的springboot汽车配件销售业绩管理系统的开发过程引用 J2EE平台技术,该平台中所包含的JDBC、JNDI等组件,规定访问数据库的形…

swagger页面 doc.html出不来,swagger-ui/index.html能出来

swagger页面 doc.html出不来&#xff0c;swagger-ui/index.html能出来。前前后后折腾了很久&#xff0c;jar包冲突&#xff0c;jar包版本&#xff0c;添加路径啥的都弄了&#xff0c;就是出不来。 后来全局搜索“doc.html”页面发现能出来的项目能搜到这个页面&#xff1a; 定…

大数据测试基础概念和工具

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 大数据已经成为当今的热门话题&#xff0c…

提高客户转介绍率的7个方法,让你的客户成为你的推广大使!

都知道“客户转介绍”&#xff0c;是一种非常有效的商业推广方式。通过客户的口碑传播&#xff0c;我们能够吸引更多潜在客户&#xff0c;并建立起长久稳固的合作关系。 可以说&#xff0c;这种开拓客户的方法&#xff1a;耗时少、成功率高、成本低、客户较优质&#xff0c;称…

掌握Lazada、Shopee店铺运营的黄金法则:测评自养号技巧

在Lazada、Shopee这个东南亚最大的电商平台上&#xff0c;要想成功运营你的店铺并不容易。然而&#xff0c;如果你掌握了以下这些黄金法则&#xff0c;并有效地运用测评自养号的策略&#xff0c;你的店铺就有可能大幅提升销售并在竞争中脱颖而出。 1. 理解你的市场 首先&…

九耶丨阁瑞钛伦特-springmvc(三)

SpringMVC作为一种流行的Java Web框架&#xff0c;是基于Spring之上的。它提供了强大的MVC&#xff08;Model-View-Controller&#xff09;架构&#xff0c;能够快速地实现Java Web开发&#xff0c;高效地与数据交互。如何使用SpringMVC成为开发人员的首要问题。要了解SpringMV…

边缘计算盒子都有哪些规格?一文带你了解边缘计算云服务器 ECS

上一次我们详细讲述了&#xff0c;在日常生活中我们能够随时随地看到的“白色盒子”是边缘服务器 ECS&#xff0c;包括边缘服务器 ECS 具体的用途是什么&#xff0c;也为大家逐一进行了科普。 感兴趣的小伙伴欢迎阅读以往文章&#xff1a; 什么是边缘计算盒子&#xff1f;边缘计…

用代码拔高你对整型提升与unsigned,signed的理解

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C语言》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;希望可以…

Linux下通过 rm -f 删除大量文件时报错:Argument list too long

Linux下通过 rm -f 删除大量的小文件时出现类似如下错误信息&#xff1a; -bash: /bin/rm: Argument list too long 如下图所示&#xff1a; 问题原因 如果待删除文件中包含的小文件数量过多&#xff0c;通常是由于受到 shell 参数个数限制所致。 这个是Linux系统存在的限制&…

若依源码解析:代码生成ruoyi-generator

文章目录 摘要代码生成器的使用数据库连接配置数据库表设计代码生成器配置修改mybatis别名配置&#xff0c;增加对com.cyl包名的识别修改mybatis的mapper扫描包路径 代码生成代码输出模板配置 代码生成器原理模板引擎&#xff1a;Velocity使用Velocity模板引擎的一般流程模板语…

前端技术搭建贪吃蛇小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了井字游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个贪吃蛇游戏&#xff0c;功能也比较简单简单&#xff0c;也…

第四章 Text

目录 TextFontsGlyphsFont TypesThe Font DictionaryEncodings Text StateFont and SizeRendering Mode Drawing TextPositioning TextWhat’s Next Text 在本章中&#xff0c;您将学习如何在页面上绘制文本。 绘图文本是 PDF 图形中最复杂的部分&#xff0c;但它也是帮助 PDF…

【Netty】Netty中的超时处理与心跳机制(十九)

文章目录 前言一、超时监测二、IdleStateHandler类三、ReadTimeoutHandler类四、WriteTimeoutHandler类五、实现心跳机制5.1. 定义心跳处理器5.2. 定义 ChannelInitializer5.3. 编写服务器5.4. 测试 结语 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#…

太坑了,盘点BeanUtils.copyProperties的11个小坑

我们日常开发中&#xff0c;经常涉及到DO、DTO、VO对象属性拷贝赋值&#xff0c;很容易想到org.springframework.beans.BeanUtils的copyProperties 。它会自动通过反射机制获取源对象和目标对象的属性&#xff0c;并将对应的属性值进行复制。可以减少手动编写属性复制代码的工作…

“游蛇”大规模邮件攻击针对中国用户

近半年黑客团伙频频对我国实施攻击活动。研究人员发现&#xff0c;“游蛇”黑产团伙自2022年下半年开始至今&#xff0c;针对中国用户发起了大规模电子邮件攻击活动。 黑客使用电子邮件在内的多种传播方式。 该团伙利用钓鱼邮件、伪造的电子票据下载站、虚假应用程序下载站、…

eclipse固件库生成的操作流程

一.方法介绍 有时候我们需要将某个功能模块封装成一个库&#xff0c;只留出接口供别人使用&#xff0c;那么就需要打包处理&#xff0c;eclipse是如何操作的呢&#xff1f;本文仅仅讨论我所知道的两种方式&#xff0c;倘若还有更简便的方法也非常欢迎网友补充。 1.在已有的工…

【PyQt5】使用QtDesigner创建Splitter

目录 Splitter效果演示 目前在Qt Designer无法检索到QSplitter。 实现方式&#xff1a; 1.同时选中两个需要实现splitter样式的控件&#xff0c;以QTreeWidget和QTableWidget为例&#xff1b; 2.右击–>布局–>使用分裂器&#xff08;根据需求选择水平或垂直布局&#x…