当前位置:   article > 正文

OpenCV学习笔记

opencv学习笔记

OpenCV学习笔记

1.基础类型与图像视频读取

1. 基础类型

1. 接口类

OpenCV是一个极其庞大的库,有不可估量的函数数目。受限于类的重载函数数目和种类,内部函数互相调用之间,通常会使用接口类去做隐式类型转换,然后再去进行统一的运算处理这些类通过调用 来进行隐式转换,方便使用。

  • InputArray 输入只读数组传递到 OpenCV 函数的代理类
  • OutputArray这种类型与 非常相似,只是它用于输入/输出和输出函数参数InputArray
  • InputOutputArray继承了OutputArray,作为输入输出接口,增加了一些功能
  • InputArrayOfArrays类型定义InputArray InputArrayOfArrays
  • OutputArrayOfArrays类型定义OutputArray OutputArrayOfArrays
  • InputOutputArrayOfArrays类型定义OutputArray InputOutputArrayOfArrays
2. 垫子图像类

Mat本质是一个n维密集运算数组,是Matrix的简写。相似的有,表示GPU Mat,表示G-APIMat接口。UMat GMat

3. 运算类
  • Matx 定阶矩阵类,即确定规模大小的矩阵类
  • Vec 向量类
4. 定义类
  • Point 二维点类
  • Point3 三维点类
  • Rect 矩形类
  • RotatedRect 旋转矩形类
  • Range 范围类
  • Scalar 通道类
  • Size 规格类

2. 图像视频IO

1.函数
1.伊姆读
Mat cv::imread	(	const String &	filename, 
					int				flags = IMREAD_COLOR
				)	


  • 1
  • 2
  • 3
  • 4
  • 5
2.imwrite
bool cv::imwrite	(	const String &				filename,
					InputArray 					img,
					const std::vector<int>> & 	params = std::vector< int >() 
				)	
  • 1
  • 2
  • 3
  • 4
2.类
1.VideoCapture
// 常用函数
 				VideoCapture (const String &filename, int apiPreference=CAP_ANY) 
 				VideoCapture (int index, int apiPreference=CAP_ANY)

virtual bool 	open (const String &filename, int apiPreference=CAP_ANY)
virtual bool 	open (int index, int apiPreference=CAP_ANY)
virtual bool 	isOpened () const

virtual double 	get (int propId) const
virtual bool 	set (int propId, double value)

virtual void 	read ()
virtual void 	release ()

virtual VideoCapture & 	operator>> (const Mat &image)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

2. 图像显示与GUI

展示图像

void cv::imshow	(	const String &	winname,
					InputArray		mat 
				)
  • 1
  • 2
  • 3

imshow函数在指定窗口中显示图像。如果窗口是使用cv::window_AUTOSIZE标志创建的,则图像将以其原始大小显示,但仍受屏幕分辨率的限制。否则,将缩放图像以适应窗口。

如果图像是8位无符号的,它将按原样显示。
-如果图像是16位无符号或32位整数,则像素除以256。也就是说,值范围[0255*256]映射到[0255]。
-如果图像是32位或64位浮点,则像素值乘以255。也就是说,值范围[0,1]映射到[0255]。

若窗口是使用OpenGL支持创建的,那个么cv::imshow也支持ogl::Bufferogl::Texture2Dcuda::GpuMat作为输入。
如果该窗口不是在此函数之前创建的,则假定使用cv::window\u AUTOSIZE创建窗口。
如果需要显示大于屏幕分辨率的图像,则需要在imshow之前调用namedWindow(“,WINDOW_NORMAL”)

键盘响应

int cv::waitKey ( int delay = 0 )

函数waitKey无限期地等待一个键事件(当延迟<=0时)或延迟毫秒(当它为正时)。由于操作系统在切换线程之间有一个最小的时间间隔,因此函数不会完全延迟ms,它将至少延迟ms,这取决于当时计算机上运行的其他内容。它返回按下的键的代码,如果在指定时间之前没有按下任何键,则返回-1。

此函数是HighGUI中唯一可以获取和处理事件的方法,因此需要定期调用此函数以进行正常的事件处理,除非在负责事件处理的环境中使用HighGUI。

仅当至少创建了一个HighGUI窗口且该窗口处于活动状态时,该函数才起作用。如果有多个HighGUI窗口,则其中任何一个都可以处于活动状态。

3. 图像色彩学

在OpenCV中,每一个图像对象被抽象成为n维矩阵,而图像对象可以是一张图片,视频里的某一帧,摄像头读取到的数据流中的一个数据部分,或者人为赋值产生的一个数据矩阵。在opencv-python中,借助了Numpy进行运算,在C++中可以使用Eigen进行运算加速。

常用函数

double cv::threshold	(	InputArray 		src,
							OutputArray 	dst,
							double 			thresh,
							double 			maxval,
							int 			type 
 	)	
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

此外,特殊值#THRESH_OTSU或#THRESH_TRIANGLE可与上述值之一组合。在这些情况下,函数使用大津算法或三角形算法确定最佳阈值,并使用它代替指定的阈值。

请注意,目前,大津和三角形方法仅适用于8位单通道图像。

色彩空间转换函数

void cv::cvtColor	(	InputArray 		src,
						OutputArray 	dst,
						int 			code,
						int 			dstCn = 0 
					)
  • 1
  • 2
  • 3
  • 4
  • 5

该函数用于将输入图像从一个颜色空间转换为另一个颜色空间。如果从RGB颜色空间转换为,则应明确指定通道的顺序(RGB或BGR)。请注意,OpenCV中的默认颜色格式通常称为RGB,但实际上是BGR(字节颠倒)。因此,标准(24位)彩色图像中的第一个字节将是8位蓝色分量,第二个字节将是绿色,第三个字节将是红色。第四、第五和第六个字节将是第二个像素(蓝色、绿色、红色),依此类推。

在线性变换的情况下,范围并不重要。但在非线性变换的情况下,输入的RGB图像应规格化为适当的值范围,以获得正确的结果,例如RGB→ Luv*变换。例如,如果您有一个从8位图像直接转换而来的32位浮点图像,而不进行任何缩放,那么它将具有0…255值范围,而不是函数假定的0…1。因此,在调用cvtColor之前,首先需要缩小图像的比例:

img *= 1./255;
cvtColor(img, img, COLOR_BGR2Luv);
  • 1
  • 2

如果对8位图像使用#cvtColor,转换过程中会丢失一些信息。对于许多应用程序,这一点并不明显,但建议在需要全套颜色的应用程序中使用32位图像,或在操作前转换图像,然后再转换回图像的应用程序中使用32位图像。
如果转换添加alpha通道,其值将设置为相应通道范围的最大值:CV_8U为255,CV_16U为65535,CV_32F为1。

图像通道分割

void cv::split	(	const Mat & 	src,
					Mat * 			mvbegin 
				)	
  • 1
  • 2
  • 3

如果需要提取单个通道或进行其他复杂的通道排列,请使用MixChannel。

如何将3通道矩阵拆分为3个单通道矩阵。

char d[] = {1,2,3,4,5,6,7,8,9,10,11,12};
Mat m(2, 2, CV_8UC3, d);
	 Mat channels[3];
 split(m, channels);
	 channels[0] =
	 [  1,   4;
	7,  10]
	 channels[1] =
	 [  2,   5;
	8,  11]
	 channels[2] =
	 [  3,   6;
	9,  12]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

通道合并

void cv::merge	(	const Mat* 		mv, 
					size_t 			count, 
					OutputArray 	dst
				)
  • 1
  • 2
  • 3
  • 4

从多个单通道阵列中创建一个多通道阵列。

函数cv::merge将多个数组合并为一个多通道数组。也就是说,输出数组的每个元素都是输入数组元素的串联,其中第i个输入数组的元素被视为mv[i].channels()-元素向量。

函数cv::split执行相反的操作。如果需要以其他高级方式裁剪排序通道,请使用cv::MixChannel

通道混合

void cv::mixChannels	(	const Mat * 	src,
							size_t 			nsrcs,
							Mat * 			dst,
							size_t 			ndsts,
							const int * 	fromTo,
							size_t 			npairs 
						)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

将指定通道从输入阵列复制到输出阵列的指定通道。

函数cv::mixChannels提供了一种洗牌图像通道的高级机制。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/554624
推荐阅读
相关标签
  

闽ICP备14008679号