当前位置:   article > 正文

opencv函数详解_opencv get(15) = 0.0

opencv get(15) = 0.0

1. split函数

split函数的功能是通道分离

	void split(const Mat& src,Mat *mvBegin)
	void split(InputArray m, OutputArrayOfArrays mv);
  • 1
  • 2

第一个参数为要进行分离的图像矩阵,第二个参数可以是Mat数组的首地址,或者一个vector对象

	std::vector<Mat> channels;
	Mat aChannels[3];
	//src为要分离的Mat对象
	split(src, aChannels);              //利用数组分离
	split(src, channels);             //利用vector对象分离
	 
	imshow("B",channels[0]);
	imshow("G",channels[1]);
	imshow("R",channels[2]);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9


2. ptr(0)指针

	cv::Mat image = cv::Mat(400, 600, CV_8UC1); //宽400,长600
    uchar * pt_img00 = image.ptr<uchar>(0);		//第一行第一个元素的指针
    uchar * pt_img10 = image.ptr<uchar>(1);		//第二行第一个元素的指针
    uchar * pt_img01 = image.ptr<uchar>(0)[1];	//第一行第二个元素的指针
  • 1
  • 2
  • 3
  • 4

3. opencv中rows和cols的含义

rows:行
cols:列
在这里插入图片描述

对于读入的这张1080p的星云图片,分辨率为1920*1080
image.rows = 1080 有1080行像素点
image.cols = 1920 有1920列像素点

	Mat image = imread("星云.jpeg");
	if (image.empty())
	{
		cout << "open file failed!" << endl;
		return -1;
	}
	cout << "image::rows:" << image.rows << ", cols:" << image.cols << endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

4. namedWinsdow

函数原型:void nameWindow(const string& winname,int flags = WINDOW_AUTOSIZE) ;
winname:窗口名称
flags: 0  WINDOW_NORMAL       用户可以改变这个窗口大小
            1  WINDOW_AUTOSIZE     默认窗口大小根据图片实际分辨率设定
             2  WINDOW_OPENGL       窗口创建的时候会支持OpenGL

可以通过resizeWindow()函数修改窗口大小(仅限 WINDOW_NORMAL)
Mat img = imread(“星云.jpeg”);
namedWindow(“图片”, WINDOW_NORMAL);
resizeWindow(“图片”, 480, 270);
imshow(“图片”, img);


5. cv::putText—文字绘制

函数原型:

	void cv::putText(
			cv::Mat& img, // 待绘制的图像
			const string& text, // 待绘制的文字
			cv::Point origin, // 文本框的左下角
			int fontFace, // 字体 (如cv::FONT_HERSHEY_PLAIN)
			double fontScale, // 尺寸因子,值越大文字越大
			cv::Scalar color, // 线条的颜色(RGB)
			int thickness = 1, // 线条宽度
			int lineType = 8, // 线型(4邻域或8邻域,默认8邻域)
			bool bottomLeftOrigin = false // true='origin at lower left'
		);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

附录:RGB颜色对照表
比如蓝色0 0 255,但是调用Scalar(255, 0, 0)

6. rectangle 绘制矩形框

函数原型:

	void rectangle(
			InputOutputArray img, 	//被处理图片
			Point pt1, 				//矩形框左上角坐标
			Point pt2,				//矩形右下角坐标
	        const Scalar& color, 	//矩形框颜色
	        int thickness = 1,		//线条宽度
	        int lineType = LINE_8, 	//线段的类型
	        int shift = 0			//坐标点的小数点位数
	    );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

7. VideoCapture参数

/*1. 打开摄像头*/
	VideoCapture capture(0);
	/*获取摄像头参数*/
	brightness = capture.get(cv::CAP_PROP_BRIGHTNESS);
	contrast= capture.get(cv::CAP_PROP_CONTRAST);
	saturation = capture.get(cv::CAP_PROP_SATURATION);
	hue = capture.get(cv::CAP_PROP_HUE);
	gain = capture.get(cv::CAP_PROP_GAIN);
	exposure = capture.get(cv::CAP_PROP_EXPOSURE);
	white_balance = capture.get(cv::CAP_PROP_WHITE_BALANCE_BLUE_U);
	
	std::cout << "---------------------------------------------" << endl;
	std::cout << "摄像头亮度:" << brightness << endl;
	std::cout << "摄像头对比度:" << contrast << endl;
	std::cout << "摄像头饱和度:" << saturation << endl;
	std::cout << "摄像头色调:" << hue << endl;
	std::cout << "摄像头增益:" << gain << endl;
	std::cout << "摄像头曝光度:" << exposure << endl;
	std::cout << "摄像头白平衡:" << white_balance << endl;
	std::cout << "---------------------------------------------" << endl;

/*2. 打开视频*/
	VideoCapture capture(file_name);
	/*获取视频参数*/
	frame_width = capture.get(cv::CAP_PROP_FRAME_WIDTH);
	frame_height = capture.get(cv::CAP_PROP_FRAME_HEIGHT);
	fps = capture.get(cv::CAP_PROP_FPS);
	frame_count = capture.get(cv::CAP_PROP_FRAME_COUNT);
	format = capture.get(cv::CAP_PROP_FORMAT);
	pos_avi_ratio = capture.get(cv::CAP_PROP_POS_AVI_RATIO);
	video_duration = frame_count / fps;
	
	cout << "---------------------------------------------" << endl;
	cout << "视频中的相对位置(范围为0.0到1.0):" << pos_avi_ratio << endl;
	cout << "视频帧的像素宽度:" << frame_width << endl;
	cout << "视频帧的像素高度:" << frame_height << endl;
	cout << "录制视频的帧速率(帧/秒):" << fps << endl;
	cout << "视频文件总帧数:" << frame_count << endl;
	cout << "图像的格式:" << format << endl;
	cout << "视频时长:" << video_duration << endl;
	cout << "---------------------------------------------" << endl;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

VideoCapture.get()函数
函数原型:

	double get(int propId) const;
  • 1

propId编号:
编号1 详细参数 释义 英文说明

编号1详细参数释义英文说明
cv2.VideoCapture.get(0)CV_CAP_PROP_POS_MSEC视频文件的当前位置(播放)以毫秒为单位Current position of the video file in milliseconds or video capture timestamp.
cv2.VideoCapture.get(1)CV_CAP_PROP_POS_FRAMES基于以0开始的被捕获或解码的帧索引0-based index of the frame to be decoded/captured next.
cv2.VideoCapture.get(2)CV_CAP_PROP_POS_AVI_RATIO视频文件的相对位置(播放):0=电影开始,1=影片的结尾。Relative position of the video file: 0 - start of the film, 1 - end of the film.
cv2.VideoCapture.get(3)CV_CAP_PROP_FRAME_WIDTH在视频流的帧的宽度Width of the frames in the video stream.
cv2.VideoCapture.get(4)CV_CAP_PROP_FRAME_HEIGHT在视频流的帧的高度Height of the frames in the video stream.
cv2.VideoCapture.get(5)CV_CAP_PROP_FPS帧速率Frame rate.
cv2.VideoCapture.get(6)CV_CAP_PROP_FOURCC编解码的4字-字符代码4-character code of codec.
cv2.VideoCapture.get(7)CV_CAP_PROP_FRAME_COUNT视频文件中的帧数Number of frames in the video file.
cv2.VideoCapture.get(8)CV_CAP_PROP_FORMAT返回对象的格式Format of the Mat objects returned by retrieve() .
cv2.VideoCapture.get(9)CV_CAP_PROP_MODE返回后端特定的值,该值指示当前捕获模式Backend-specific value indicating the current capture mode.
cv2.VideoCapture.get(10)CV_CAP_PROP_BRIGHTNESS图像的亮度(仅适用于照相机)Brightness of the image (only for cameras).
cv2.VideoCapture.get(11)CV_CAP_PROP_CONTRAST图像的对比度(仅适用于照相机)Contrast of the image (only for cameras).
cv2.VideoCapture.get(12)CV_CAP_PROP_SATURATION图像的饱和度(仅适用于照相机)Saturation of the image (only for cameras).
cv2.VideoCapture.get(13)CV_CAP_PROP_HUE色调图像(仅适用于照相机)Hue of the image (only for cameras).
cv2.VideoCapture.get(14)CV_CAP_PROP_GAIN图像增益(仅适用于照相机)(Gain在摄影中表示白平衡提升)Gain of the image (only for cameras).
cv2.VideoCapture.get(15)CV_CAP_PROP_EXPOSURE曝光(仅适用于照相机)Exposure (only for cameras).
cv2.VideoCapture.get(16)CV_CAP_PROP_CONVERT_RGB指示是否应将图像转换为RGB布尔标志Boolean flags indicating whether images should be converted to RGB.
cv2.VideoCapture.get(17)CV_CAP_PROP_WHITE_BALANCE× 暂时不支持Currently not supported
cv2.VideoCapture.get(18)CV_CAP_PROP_RECTIFICATION立体摄像机的矫正标注(目前只有DC1394 v.2.x后端支持这个功能)Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)





另外:CV_8UC1,CV_8UC2,CV_8UC3 Vec2b Vec3b Vec4b 含义
在OpenCv中,使用Mat存图像,有专门的数据类型
一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。 其中 U代表 Unsigned 无符号、C代表CvMat 后面的数字代表通道数,最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3)

而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3…
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。

OpenCV 源代码中的定义:
typedef Vec <uchar, 2> Vec2b;
Vec2b—表示每个Vec2b对象中,可以存储2个char(字符型)数据
Vec3b—表示每一个Vec3b对象中,可以存储3个char(字符型)数据,比如可以用这样的对象,去存储RGB图像中的
Vec4b—表示每一个Vec4b对象中,可以存储4个字符型数据,可以用这样的类对象去存储—4通道RGB+Alpha的图

8. Canny()函数 边缘检测

函数原型:

	CV_EXPORTS_W void Canny( InputArray image, 		//输入图像:8-bit
							 OutputArray edges,		//输出边缘图像:单通道,8-bit,size与输入图像一致
	                         double threshold1, 	//低阈值low
	                         double threshold2,		//高阈值high
	                         int apertureSize = 3, 	//Sober算子大小
	                         bool L2gradient = false 	//是否采用更精确的方式计算图像梯度
	                         );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

9. GaussianBlur() 高斯滤波

函数原型:

	void GaussianBlur( InputArray src, 		//输入图像
					   OutputArray dst, 	//输出与图像
					   Size ksize,			//高斯核大小
	                   double sigmaX, 		// X方向上的高斯核标准偏差
	                   double sigmaY = 0,	//Y方向上的高斯核标准差
	                   int borderType = BORDER_DEFAULT	//像素外推方法
	                   );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

其中ksize核是一组权重的集合,会应用到原图像的一个区域,并由此生成图像目标的一个像素、比如大小为7的核意味着没49(7*7)个源图像的像素会产生目标图像的一个像素。在计算完中央像素与周围邻近像素的亮度差之和以后,如果亮度变化很大,中央像素的亮度会增加(反之则不会)。用另一句话就是如果一个像素比他周围的像素更突出,就会提升他的亮度。核越大,滤波后越模糊,边缘检测越稀疏;核越小,滤波越不明显,边缘检测线条越密集。

10. cvThreshold()函数 二值化处理

彩色图像:三个通道0-255,0-255,0-255,所以可以有2^24位空间
灰度图像:一个通道0-255,所以有256种颜色。255全白,0全黑
二值图像:只有两种颜色,黑和白,1白色,0黑色

函数原型:

	cv::Threshold( const CvArr*  src, 	//输入图像
				 CvArr*  dst,			//输出图像
	             double  threshold, 	//阈值
	             double  max_value,
	             int threshold_type 	//阈值类型
	             );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

第五个参数类型:

	emum{
		THRESH_BINARY = 0,	//当前点值大于阈值时,取Maxval,也就是第四个参数,下面再不说明,否则设置为0
		THRESH_BINARY_INV,	//当前点值大于阈值时,设置为0,否则设置为Maxval
		THRESH_TRUNC,		//当前点值大于阈值时,设置为阈值,否则不改变
		THRESH_TOZERO,		//当前点值大于阈值时,不改变,否则设置为0
		THRESH_TOZERO_INV,	//当前点值大于阈值时,设置为0,否则不改变0
	}threshold_type 	;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

生成关系如下表:
在这里插入图片描述

11. copyMakeBorder图像边缘扩充

扩充src的边缘,将图像变大,然后以各种外插方式自动填充图像边界,这个函数实际上调用了函数cv::borderInterpolate,这个函数最重要的功能就是为了处理边界,比如均值滤波或者中值滤波中,使用copyMakeBorder将原图稍微放大,然后我们就可以处理边界的情况了
函数原型:

	void copyMakeBorder(InputArray src, 	//源图像
						OutputArray dst,	//目标图像
	                    int top, 			
	                    int bottom, 
	                    int left, 
	                    int right,
	                    int borderType, 	//定义要应用的边框类型
	                    const Scalar& value = Scalar() );	//如果_borderType_为_BORDER_CONSTANT_,这是用于填充边框像素的值
	                    
	其中top、bottom、left、right为图像每侧边框的长度(以像素为单位)。我们将它们定义为图像原始大小的5%。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

最后一个参数类型:

	emum{
		BORDER_CONSTANT = 0,	//一个常量像素值(由参数 value给定)填充扩充的边界值
		BORDER_REPLICATE = 1,	//复制最边缘像素的值
	}_borderType_;
  • 1
  • 2
  • 3
  • 4

12. cvtColor 图像颜色转换

函数原型:

	void cvtColor( InputArray src, 		//输入图像
				   OutputArray dst, 	//输出图像
				   int code, 			//转换的代码或标识
				   int dstCn = 0 		//目标图像通道数,其值为0时,则有src和code决定
				   )
  • 1
  • 2
  • 3
  • 4
  • 5

其中,对于code参数;

	COLOR_BGR2RGB	转换为RGB
	COLOR_BGR2GRAY	转换为灰度图
	COLOR_BGR2YUV	转换为YUV
	COLOR_BGR2HSV	转换为HSV
	COLOR_BGR2YCrCb 转换为YCrCb
	COLOR_BGR2HLS	转换为HLS
	COLOR_BGR2XYZ 	转换为XYZ
	COLOR_BGR2LAB	转换为LAB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

各种效果图如下:
在这里插入图片描述

13 VideoWriter图片转视频

函数原型:

	VideoWriter(const String& filename, 	//输出文件名
				int fourcc, 				//编码形式
				double fps,					//输出帧率
	            Size frameSize, 			//输出尺寸
	            bool isColor = true);		//如果为False,可以传入灰度图片
	 
	例如:
	    VideoWriter writer("D:/opencv/pictures//test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

使用实例:

	VideoWriter writer;
	writer.open("‪C:\Users\Desktop\test.avi",CV_FOURCC('M', 'J', 'P', 'G'),
	        rate, //不进行跟踪,定位,只显示、录制时的帧率
	        Size(inFrame.cols,inFrame.rows),
	        true);
	if (!writer.isOpened())
	{
	    return;
	}

	writer<<inFrame;
	writer.release();
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/673165
推荐阅读
相关标签
  

闽ICP备14008679号