penCV4 C++ 快速入门视频30讲笔记

OpenCV4快速入门

001-图像读取与显示

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(){
Mat src = imread(“G:/OpenCV/opencv笔记所用图片/bandian.jpg”,1); //默认加载彩色图像,0表示GRAY灰度图,1为BGR彩色图,-1表示加载原图(可能是其他类型如HSV等其他空间)

if (src.empty()){
	cout &lt;&lt; "could not load image..." &lt;&lt; endl;
	getchar();
	return -1;
}

//当我们读取图片太大时,看不到全局,使用窗口函数可以设置大小
namedWindow("input", WINDOW_AUTOSIZE);	//WINDOW_FREERATIO参数可以调整窗口大小。默认图像为WINDOW_AUTOSIZE显示原图,不能调整大小。
imshow("input", src);					//若无namedWindow,只有imshow,显示的图像窗口与图片一样大,无法调整窗口大小
										//imshow只能显示8位和浮点型的

waitKey(0);				//opencv自带阻塞函数,0表示一直阻塞,1表示延迟1毫秒后执行下一步
destroyAllWindows();	//结束程序前将所有窗口销毁
return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

quickDemo类的定义(头文件)

quickDemo.h

#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

class quickDemo
{
public:
void colorSpace_Demo(Mat &image); //002-色彩空间变换(cvtColor)
void mat_creation_demo(Mat &image); //003-图像对象的创建与赋值(m2=m1,clone,copyto)
void pixel_visit_demo(Mat &image); //004-图像像素的读写操作(image.at<uchar>(row, col),image.at<Vec3b>(row, col)[0])
void operators_demo(Mat &image); //005-图像像素的算术操作(+,-,multiply,divide)
void trackbar_demo(Mat &image); //006-trackbar滚动条操作演示-调整图像亮度(add,subtract)
void trackbar_demo2(Mat &image); //007-trackbar滚动条操作演示-参数传递与调整亮度与对比度(addWeighted)
void key_demo(Mat &image); //008-键盘响应操作(waitKey)
void color_style_demo(Mat &image); //009-opencv自带颜色表操作(applyColorMap)
void bitwise_demo(Mat &image); //010-图像像素的逻辑操作(位操作,与、或、非)
void channels_demo(Mat &image); //011-通道分离与合并(split,merge)
void inrange_demo(Mat &image); //012-图像色彩空间转换-变换背景(cvtColor,inRange)
void pixel_static_demo(Mat &image); //013-图像像素值统计(minMaxLoc,meanStdDev)
void drawing_demo(Mat &image); //014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect)
void random_drawing_demo(); //015-随机数与随机颜色
void polyline_drawing_demo(); //016-多边形填充与绘制(fillPoly,polylines,drawContours)
void mouse_drawing_demo(Mat &image); //017-鼠标操作与响应(setMouseCallback)
void norm_demo(Mat &image); //018-图像像素类型转换与归一化(convertTo,normalize)
void resize_demo(Mat &image); //019-图像缩放与插值(resize)
void flip_demo(Mat &image); //020-图像翻转(flip)
void rotate_demo(Mat &image); //021-图像旋转(getRotationMatrix2D,warpAffine)
void video_demo(Mat &image); //022-视频文件摄像头使用(VideoCapture capture)
void video_demo2(Mat &image); //023-视频处理与保存-帧宽高(capture.get)
void showHistogram(Mat &image); //024-图像直方图-绘制直方图(calcHist,normalize,line)
void histogram_2d_demo(Mat &image); //025-二维直方图(calcHist,minMaxLoc)
void histogram_eq_demo(Mat &image); //026 - 直方图均衡化(equalizeHist)
void blur_demo(Mat &image); //027-图像卷积操作-均值模糊(blur)
void gaussian_blur_demo(Mat &image); //028-高斯模糊(GaussianBlur)
void bifilter_demo(Mat &image); //029-高斯双边模糊(bilateralFilter)
void face_detection_demo(); //030-案例:实时人脸检测(采用dnn模块)
};

  • 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

quickDemo类的函数实现

quickDemo.cpp

#include "quickDemo.h"
#include <opencv2/dnn.hpp>		//要使用dnn模块需要引入此头文件

 
 
  • 1
  • 2

002-色彩空间变换(cvtColor)

//002-色彩空间变换
void quickDemo::colorSpace_Demo(Mat &image){
	if (image.channels()==3)
	{
		Mat gray, hsv;
		cvtColor(image, hsv, COLOR_BGR2HSV);		//可在hsv空间调节亮度通道,再变回BGR空间
		cvtColor(image, gray, COLOR_BGR2GRAY);
		imshow("HSV", hsv);
		imshow("gray image", gray);
		imwrite("G:/OpenCV/opencv笔记所用图片/gray.jpg", gray);
		imwrite("G:/OpenCV/opencv笔记所用图片/hsv.jpg", hsv);
	}else if (image.channels()==1)
	{
		return;
	}

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

003-图像对象的创建与赋值(m2=m1,clone,copyto)

//003-图像对象的创建与赋值
void quickDemo::mat_creation_demo(Mat &image){
Mat m1<span class="token punctuation">,</span> m2<span class="token punctuation">;</span>
m1 <span class="token operator">=</span> image<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
image<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>m2<span class="token punctuation">)</span><span class="token punctuation">;</span>

cout <span class="token operator">&lt;&lt;</span> <span class="token string">"m1.size :"</span><span class="token operator">&lt;&lt;</span>m1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>

<span class="token comment">//创建空白图像</span>
Mat m3 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span><span class="token function">Size</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">CV_8UC3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//创建一个8行8列的,CV_8UC1(单通道无符号整型空白图像).CV_8UC3(三通道的)</span>
cout <span class="token operator">&lt;&lt;</span> m3 <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>							<span class="token comment">//将数组打印出来</span>
m3 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">127</span><span class="token punctuation">,</span> <span class="token number">127</span><span class="token punctuation">,</span> <span class="token number">127</span><span class="token punctuation">)</span><span class="token punctuation">;</span>					<span class="token comment">//可以使用此方式给每个通道赋值</span>
<span class="token comment">//cout &lt;&lt; m3 &lt;&lt; endl;							//将数组打印出来</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"width:"</span><span class="token operator">&lt;&lt;</span>m3<span class="token punctuation">.</span>cols<span class="token operator">&lt;&lt;</span><span class="token string">",height:"</span><span class="token operator">&lt;&lt;</span>m3<span class="token punctuation">.</span>rows<span class="token operator">&lt;&lt;</span><span class="token string">",channels:"</span><span class="token operator">&lt;&lt;</span>m3<span class="token punctuation">.</span><span class="token function">channels</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"创建的图像"</span><span class="token punctuation">,</span>m3<span class="token punctuation">)</span><span class="token punctuation">;</span>				<span class="token comment">//因为值都为127,故应是一张全部灰色的图像</span>
m3 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>					<span class="token comment">//可以使用此方式给每个通道赋值</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"创建的图像2"</span><span class="token punctuation">,</span> m3<span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//因为值(255,0,0)(B,G,R),故应是蓝色图像</span>

<span class="token comment">//Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1);	//此时创建的图像的值初始化为1(当为单通道时全部是1,但3通道不同)</span>
<span class="token comment">//cout &lt;&lt; m3 &lt;&lt; endl;</span>
<span class="token comment">//Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3);	//只有在3通道的第1个通道为1,其余为0</span>
<span class="token comment">//cout &lt;&lt; m3 &lt;&lt; endl;</span>

<span class="token comment">//当我们使用mat给另外的对象赋值时,相当于将指针重新赋给了另一个对象如下</span>
<span class="token comment">//	Mat image2 = image1;</span>
<span class="token comment">//当我们修改 image2的值时,也会影响到image1的值,image2就等同于image1.</span>
<span class="token comment">//	而使用clone或者copyto时,才将image1的数据完全的复制出来给image2,而不是给指针。</span>
<span class="token comment">//	Mat image2 = image1.clone();</span>
<span class="token comment">//当我们修改 image2的值时,不会影响到image1的值,只会修改 image2的值。</span>

<span class="token comment">//创建空白图像</span>
Mat m4 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span><span class="token function">Size</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">,</span> <span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">CV_8UC3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
m4 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像m4"</span><span class="token punctuation">,</span> m4<span class="token punctuation">)</span><span class="token punctuation">;</span>
Mat m5<span class="token punctuation">;</span>
m5 <span class="token operator">=</span> m4<span class="token punctuation">;</span>
m5 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//此处修改m5的值也会修改m4的值,使用clone或者copyto就不会改变</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像m4(m5 = m4)"</span><span class="token punctuation">,</span> m4<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像m5"</span><span class="token punctuation">,</span> m5<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//下面这种方式一般在定义卷积核中使用较广</span>
Mat kernel <span class="token operator">=</span> <span class="token punctuation">(</span>Mat_<span class="token operator">&lt;</span>char<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span>
	<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span>
	<span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

004-图像像素的读写操作(image.at(row, col),image.at(row, col)[0])

//004-图像像素的读写操作
void quickDemo::pixel_visit_demo(Mat &image){
	int w = image.cols;		//获取列数
	int h = image.rows;		//获取行数
	int dims = image.channels();	//获取通道数
<span class="token comment">当通道数不同时,遍历像素的方式也不同(使用数组的方式读取像素)</span>
<span class="token comment">//for (int row = 0; row &lt; h; row++){<!-- --></span>
<span class="token comment">//	for (int col = 0; col &lt; w; col++){<!-- --></span>
<span class="token comment">//		if (dims == 1){		//单通道的遍历方式</span>
<span class="token comment">//			int pv = image.at&lt;uchar&gt;(row, col);		//将图像row行col列的值赋值给pv</span>
<span class="token comment">//			//以下操作具有将图像反差化的功能</span>
<span class="token comment">//			image.at&lt;uchar&gt;(row, col) = 255 - pv;	//将255-pv的值重新赋给image图像,image图像中的值就被改变了</span>
<span class="token comment">//		}</span>
<span class="token comment">//		else if (dims == 3){	//三通道的遍历方式</span>
<span class="token comment">//			Vec3b bgr = image.at&lt;Vec3b&gt;(row, col);		//此时一次性的将三通道的值都获取了</span>
<span class="token comment">//			//以下操作具有将图像反差化的功能</span>
<span class="token comment">//			image.at&lt;Vec3b&gt;(row, col)[0] = 255 - bgr[0];</span>
<span class="token comment">//			image.at&lt;Vec3b&gt;(row, col)[1] = 255 - bgr[1];</span>
<span class="token comment">//			image.at&lt;Vec3b&gt;(row, col)[2] = 255 - bgr[2];</span>
<span class="token comment">//		}</span>
<span class="token comment">//	}</span>
<span class="token comment">//}</span>

<span class="token comment">//当通道数不同时,遍历像素的方式也不同(使用指针的方式读取像素,以下功能相当于上面的功能)</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>int row <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> row <span class="token operator">&lt;</span> h<span class="token punctuation">;</span> row<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	uchar<span class="token operator">*</span> current_row <span class="token operator">=</span> image<span class="token punctuation">.</span>ptr<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//得到当前行的指针</span>
	<span class="token keyword">for</span> <span class="token punctuation">(</span>int col <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> col <span class="token operator">&lt;</span> w<span class="token punctuation">;</span> col<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
		<span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>		<span class="token comment">//单通道的遍历方式</span>
			int pv <span class="token operator">=</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span>		<span class="token comment">//将图像row行[0]列的值赋值给pv</span>
			<span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> pv<span class="token punctuation">;</span>	<span class="token comment">//将255-pv的值重新赋给图像row行[0]列,从此开始,指针自加,即列自加,变为[row][1],[row][2]...</span>
		<span class="token punctuation">}</span>
		<span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>	<span class="token comment">//三通道的遍历方式</span>
			<span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span>	<span class="token comment">//此处应为当前列的的第【0】个通道</span>
			<span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span>	<span class="token comment">//此处的*current_row不是上方的*current_row,应是当前列的的第【1】个通道</span>
			<span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span>	<span class="token comment">//此处的*current_row不是上方的*current_row,应是当前列的的第【2】个通道</span>
		<span class="token punctuation">}</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>

<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"像素读写演示"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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
  • 42

005-图像像素的算术操作(+,-,multiply,divide)

//005-图像像素的算术操作
void quickDemo::operators_demo(Mat &image){
	Mat dst;
	dst = image + Scalar(50, 50, 50);	//每个通道加50,图像会变亮
	imshow("加法操作", dst);			
	dst = image - Scalar(50, 50, 50);	//每个通道-50,图像会变暗
	imshow("减法操作", dst);
Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建一个和image大小相同,类型相同,值为0的图片</span>
m <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
dst <span class="token operator">=</span> image <span class="token operator">/</span>m<span class="token punctuation">;</span>	<span class="token comment">//两张大小、类型相同的图片除法操作</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"除法操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//使用opencv自带的api函数进行加减乘除操作</span>
<span class="token comment">//两张大小、类型相同的图片乘法操作不能使用(dst = image *m;),会报错	</span>
<span class="token function">multiply</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//使用multiply可以实现两图像的乘法运算</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"multiply操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">add</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//使用add可以实现两图像的加法运算</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"add操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">subtract</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//使用subtract可以实现两图像的减法运算</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"subtract操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">divide</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//使用divide可以实现两图像的除法运算</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"divide操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//通过对图像像素点的操作实现算术运算</span>
<span class="token comment">//当通道数不同时,遍历像素的方式也不同(使用数组的方式读取像素)</span>
Mat dst2 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//创建一个背景图像</span>
int w <span class="token operator">=</span> image<span class="token punctuation">.</span>cols<span class="token punctuation">;</span>		<span class="token comment">//获取列数</span>
int h <span class="token operator">=</span> image<span class="token punctuation">.</span>rows<span class="token punctuation">;</span>		<span class="token comment">//获取行数</span>
int dims <span class="token operator">=</span> image<span class="token punctuation">.</span><span class="token function">channels</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//获取通道数</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>int row <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> row <span class="token operator">&lt;</span> h<span class="token punctuation">;</span> row<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	<span class="token keyword">for</span> <span class="token punctuation">(</span>int col <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> col <span class="token operator">&lt;</span> w<span class="token punctuation">;</span> col<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
		<span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>		<span class="token comment">//单通道的遍历方式</span>
			int p1 <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//将图像row行col列的值赋值给p1</span>
			int p2 <span class="token operator">=</span> m<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token comment">//以下操作具有将图像反差化的功能</span>
			dst2<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span> <span class="token operator">=</span> saturate_cast<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span> p1 <span class="token operator">+</span> p2<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//将p1和p2的像素点相加赋值给dst2图像(当前行列)</span>
			<span class="token comment">//saturate_cast&lt;uchar&gt;(p1 + p2)可以将p1和p2相加得到的值限制在0~255之间,防止值超过此区间</span>
		<span class="token punctuation">}</span>
		<span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>	<span class="token comment">//三通道的遍历方式</span>
			Vec3b p1 <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>Vec3b<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//image的像素点赋值给p1(当前行列)</span>
			Vec3b p2 <span class="token operator">=</span> m<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>Vec3b<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//m的像素点赋值给p2(当前行列)</span>
			<span class="token comment">//将p1和p2的像素点相加赋值给dst2图像(当前行列)</span>
			dst2<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>Vec3b<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> saturate_cast<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>p1<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">+</span> p2<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			dst2<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>Vec3b<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> saturate_cast<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>p1<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> p2<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			dst2<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>Vec3b<span class="token operator">&gt;</span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> saturate_cast<span class="token operator">&lt;</span>uchar<span class="token operator">&gt;</span><span class="token punctuation">(</span>p1<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">+</span> p2<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token punctuation">}</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"自定义像素点相加"</span><span class="token punctuation">,</span> dst2<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

006-trackbar滚动条操作演示-调整图像亮度(add,subtract)

//006-create-trackbar("Value Bar")的回调函数(此处使用add等算术操作函数调整亮度)
Mat src;			//此处使用全局变量来传递数据src到回调函数中(也可以使用void*来在参数中传递数据)
static void on_track(int lightness, void *userdata){
	Mat m = Mat::zeros(src.size(), src.type());		//创建背景图像
	m = Scalar(lightness, lightness, lightness);	//给此图像赋值
	Mat dst;
	add(src, m, dst);								//两图像相加并输出dst
	//subtract(src, m, dst);						//两图像相减并输出dst
	imshow("亮度调整", dst);						//显示在窗口上
}

//006-trackbar滚动条操作演示-调整图像亮度
void quickDemo::trackbar_demo(Mat &image){
namedWindow(“亮度调整”, WINDOW_AUTOSIZE);
int maxValue = 255;
int lightness = 50;
src = image;
createTrackbar(“Value Bar”, “亮度调整”, &lightness, maxValue,on_track); //创建亮度调整的滑动条
//参数1:滑动条名称,参数2:窗口名称,参数3:滑动条初始值,参数4:滑动条最大范围,参数5:回调函数,参数6:传递数据(万能指针)

<span class="token function">on_track</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//调用一次回调函数,令初始时就有显示(可以不调用),</span>
					<span class="token comment">//此处应注意,第二个参数在上面传递数据时不能为0,若初始化时指针为0,就会报错(空指针在传递数据时不要存在)</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

007-trackbar滚动条操作演示-参数传递与调整亮度与对比度(addWeighted)

//007-create-trackbar("Value Bar")的回调函数(此处使用addWeighted调整亮度)
static void on_track2_1(int lightness, void *image){
	Mat src = *(Mat*)image;			//(Mat*)image将指针image强转Mat类型的,再使用*将里面的值取出,又是赋值操作,此时src就是image
	//此处使用的是createbar自带的传递数据功能,也可以使用全局变量来传递数据
Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> src<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//创建背景图像</span>
m <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span>lightness<span class="token punctuation">,</span> lightness<span class="token punctuation">,</span> lightness<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//给此图像赋值</span>
Mat dst<span class="token punctuation">;</span>
<span class="token function">addWeighted</span><span class="token punctuation">(</span>src<span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">,</span> m<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> lightness<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//两张图以一定的权重相加(src*1+m*0+lightness),此处m图像无用,只对src图像进行加法操作</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"亮度与对比度调整"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>						<span class="token comment">//显示在窗口上</span>

}

//007-create-trackbar(“Value Bar”)的回调函数(此处使用addWeighted调整对比度)
static void on_track2_2(int contrast_value, void image){
Mat src = (Mat)image; //(Mat)image将指针image强转Mat类型的,再使用*将里面的值取出,又是赋值操作,此时src就是image
//此处使用的是createbar自带的传递数据功能,也可以使用全局变量来传递数据

Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> src<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//创建背景图像</span>
Mat dst<span class="token punctuation">;</span>
<span class="token function">addWeighted</span><span class="token punctuation">(</span>src<span class="token punctuation">,</span> contrast_value<span class="token punctuation">,</span> m<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//两张图以一定的权重相加(src*contrast_value+m*0+0),此处m图像无用,只对src图像进行乘法运算,增加其对比度</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"亮度与对比度调整"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>						<span class="token comment">//显示在窗口上</span>

}

//007-trackbar滚动条操作演示-参数传递与调整亮度与对比度
void quickDemo::trackbar_demo2(Mat &image){
namedWindow(“亮度与对比度调整”, WINDOW_AUTOSIZE);
int maxValue = 255;
int lightness = 50;
createTrackbar(“Value Bar”, “亮度与对比度调整”, &lightness, maxValue, on_track2_1, &image); //创建亮度调整的滑动条
//参数1:滑动条名称,参数2:窗口名称,参数3:滑动条初始值,参数4:滑动条最大范围,参数5:回调函数,参数6:传递数据(万能指针)

int contrast_value <span class="token operator">=</span> <span class="token number">1.2</span><span class="token punctuation">;</span>
<span class="token function">createTrackbar</span><span class="token punctuation">(</span><span class="token string">"Contrast Bar"</span><span class="token punctuation">,</span> <span class="token string">"亮度与对比度调整"</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>contrast_value<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> on_track2_2<span class="token punctuation">,</span> <span class="token operator">&amp;</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建对比度调整的滑动条</span>

<span class="token function">on_track2_1</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//调用一次回调函数,令初始时就有显示(可以不调用),此处应注意,第二个参数在上面传递数据时不能为0,若初始化时指针为0,就会报错(空指针在传递数据时不要存在)</span>
<span class="token comment">//on_track2_2(50, &amp;image);	 </span>

}

  • 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

008-键盘响应操作(waitKey)

//008-键盘响应操作
void quickDemo::key_demo(Mat &image){
	Mat dst=Mat::zeros(image.size(),image.type());
	while (true){		//在此循环不断监听键盘操作
		char c = waitKey(100);		//停顿100毫秒,waitKey(100)返回值为100毫秒内键盘按键的ASCII码值。
		//cout << c << endl;			//输出waitekey接收到的键值
	<span class="token comment">//在此无限循环中加入退出机制(按esc退出循环)</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>int<span class="token punctuation">)</span>c <span class="token operator">==</span> <span class="token number">27</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>			<span class="token comment">//此处将c类型强转,或者int c = waitKey(100)</span>
		<span class="token keyword">break</span><span class="token punctuation">;</span>		<span class="token comment">//27为退出键esc的数值</span>
	<span class="token punctuation">}</span>

	<span class="token comment">//判断输入键值,进行一定操作</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>int<span class="token punctuation">)</span>c <span class="token operator">==</span> <span class="token number">49</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>			<span class="token comment">//判断当按下为1时,或者不强转直接c=='1'</span>
		cout <span class="token operator">&lt;&lt;</span> <span class="token string">"you enter key #"</span><span class="token operator">&lt;&lt;</span>c <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
		<span class="token function">cvtColor</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">COLOR_BGR2GRAY</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//将其变为灰度图像</span>
	<span class="token punctuation">}</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>int<span class="token punctuation">)</span>c <span class="token operator">==</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>			<span class="token comment">//判断当按下为2时</span>
		cout <span class="token operator">&lt;&lt;</span> <span class="token string">"you enter key #"</span> <span class="token operator">&lt;&lt;</span> c <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
		<span class="token function">cvtColor</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">COLOR_BGR2HSV</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//将其变为HSV图像</span>
	<span class="token punctuation">}</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">==</span> <span class="token string">'3'</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>			<span class="token comment">//此处也可以使用此种方式判断,或者(int)c == 51</span>
		cout <span class="token operator">&lt;&lt;</span> <span class="token string">"you enter key #"</span> <span class="token operator">&lt;&lt;</span> c <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
		dst <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">add</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"键盘响应"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

009-opencv自带颜色表操作(applyColorMap)

//009-opencv自带颜色表操作
void quickDemo::color_style_demo(Mat &image){
	//COLORMAP_AUTUMN = 0, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hrsIy6mj-1624859124466)(pics/colormaps/colorscale_autumn.jpg)]
	//	COLORMAP_BONE = 1, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7MCZPsi-1624859124471)(pics/colormaps/colorscale_bone.jpg)]
	//	COLORMAP_JET = 2, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCCe16BH-1624859124473)(pics/colormaps/colorscale_jet.jpg)]
	//	COLORMAP_WINTER = 3, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqSaECet-1624859124475)(pics/colormaps/colorscale_winter.jpg)]
	//	COLORMAP_RAINBOW = 4, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUfUV4J1-1624859124484)(pics/colormaps/colorscale_rainbow.jpg)]
	//	COLORMAP_OCEAN = 5, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCySlDdn-1624859124489)(pics/colormaps/colorscale_ocean.jpg)]
	//	COLORMAP_SUMMER = 6, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1CJ1SmdL-1624859124491)(pics/colormaps/colorscale_summer.jpg)]
	//	COLORMAP_SPRING = 7, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfgwFe4x-1624859124494)(pics/colormaps/colorscale_spring.jpg)]
	//	COLORMAP_COOL = 8, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u89z9rEh-1624859124498)(pics/colormaps/colorscale_cool.jpg)]
	//	COLORMAP_HSV = 9, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJjB3X3I-1624859124500)(pics/colormaps/colorscale_hsv.jpg)]
	//	COLORMAP_PINK = 10, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dpg3nlYR-1624859124504)(pics/colormaps/colorscale_pink.jpg)]
	//	COLORMAP_HOT = 11, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Hq6FMJH-1624859124505)(pics/colormaps/colorscale_hot.jpg)]
	//	COLORMAP_PARULA = 12
<span class="token comment">//opencv3.0的版本中的色彩表只有12中类型,在opencv4.1中则高达19种</span>
<span class="token comment">//通过定义一个数组(里面的值实际为整数数字),来在后面实现图片的轮流播放</span>
int colorMap<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span>
	<span class="token constant">COLORMAP_AUTUMN</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaKZUqsV-1624859124507)(pics/colormaps/colorscale_autumn.jpg)]</span>
	<span class="token constant">COLORMAP_BONE</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v23RpPQn-1624859124510)(pics/colormaps/colorscale_bone.jpg)]</span>
	<span class="token constant">COLORMAP_JET</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caZyJ8am-1624859124512)(pics/colormaps/colorscale_jet.jpg)]</span>
	<span class="token constant">COLORMAP_WINTER</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjbQXYsb-1624859124514)(pics/colormaps/colorscale_winter.jpg)]</span>
	<span class="token constant">COLORMAP_RAINBOW</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ct8T7gG6-1624859124518)(pics/colormaps/colorscale_rainbow.jpg)]</span>
	<span class="token constant">COLORMAP_OCEAN</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mIScclOa-1624859124520)(pics/colormaps/colorscale_ocean.jpg)]</span>
	<span class="token constant">COLORMAP_SUMMER</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKHTgwVJ-1624859124522)(pics/colormaps/colorscale_summer.jpg)]</span>
	<span class="token constant">COLORMAP_SPRING</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVO7lbkp-1624859124524)(pics/colormaps/colorscale_spring.jpg)]</span>
	<span class="token constant">COLORMAP_COOL</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vhLRuH9-1624859124528)(pics/colormaps/colorscale_cool.jpg)]</span>
	<span class="token constant">COLORMAP_HSV</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ckFxoCWO-1624859124532)(pics/colormaps/colorscale_hsv.jpg)]</span>
	<span class="token constant">COLORMAP_PINK</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWleieX8-1624859124533)(pics/colormaps/colorscale_pink.jpg)]</span>
	<span class="token constant">COLORMAP_HOT</span><span class="token punctuation">,</span> <span class="token comment">//!&lt; [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQtmzrx1-1624859124535)(pics/colormaps/colorscale_hot.jpg)]</span>
	<span class="token constant">COLORMAP_PARULA</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
Mat dst<span class="token punctuation">;</span>
int index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	int c <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">==</span> <span class="token number">27</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
		<span class="token keyword">break</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token function">applyColorMap</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> colorMap<span class="token punctuation">[</span>index <span class="token operator">%</span> <span class="token number">12</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//index%12保证此数值一直在12之内</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">"第"</span> <span class="token operator">&lt;&lt;</span> index <span class="token operator">%</span> <span class="token number">12</span> <span class="token operator">&lt;&lt;</span> <span class="token string">"种颜色风格"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
	index<span class="token operator">++</span><span class="token punctuation">;</span>
	<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"颜色风格"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//如果输入键值为s保存当前图像</span>
	string imagename <span class="token operator">=</span> <span class="token string">"颜色风格-"</span> <span class="token operator">+</span> <span class="token function">to_string</span><span class="token punctuation">(</span>index <span class="token operator">%</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">".jpg"</span><span class="token punctuation">;</span>
	char s <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">//String类下valueOf可将任何类型转换成String类型</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>s <span class="token operator">==</span> <span class="token string">'s'</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
		<span class="token function">imwrite</span><span class="token punctuation">(</span>imagename<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>

}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

010-图像像素的逻辑操作(位操作,与、或、非)


//010-图像像素的逻辑操作(位操作,与、或、非)
void quickDemo::bitwise_demo(Mat &image){
	Mat m1 = Mat::zeros(Size(256,256), CV_8UC3);
	Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
	rectangle(m1, Rect(100,100,80,80),Scalar(255,255,0),-1);	//绘制矩形并填充
	rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1);	//绘制矩形并填充
	imshow("m1", m1);
	imshow("m2", m2);
	Mat dst;
	bitwise_and(m1, m2, dst);		//m1与m2的交集Scalar(255,255,0) && Scalar(0, 255, 255)==Scalar(0, 255, 0),只剩下G通道的值不为0
	imshow("m1和m2的与操作", dst);
	bitwise_or(m1, m2, dst);		//m1与m2的交集Scalar(255,255,0) || Scalar(0, 255, 255)==Scalar(255, 255, 255),BGR通道值全为255,故此区域为白色
	imshow("m1和m2的或操作", dst);
	bitwise_xor(m1, m2, dst);		//m1与m2的交集Scalar(255,255,0) XOR Scalar(0, 255, 255)==Scalar(255,0, 255)
	imshow("m1和m2的异或操作", dst);
	bitwise_not(image, dst);			//对image取反操作(使用~image也可以直接进行取反操作)
	imshow("对image的非操作", dst);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

011-通道分离与合并(split,merge)

//011-通道分离与合并
void quickDemo::channels_demo(Mat &image){
<span class="token comment">//通道分离的方式有两种</span>
Mat aChannels<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span>				<span class="token comment">//利用数组分离,此处必须为3,否则会报错(split(image, aChannels); )</span>

vector<span class="token operator">&lt;</span>Mat<span class="token operator">&gt;</span> mv<span class="token punctuation">;</span>					<span class="token comment">//利用vector对象分离</span>
<span class="token comment">//src为要分离的Mat对象  </span>
<span class="token function">split</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> mv<span class="token punctuation">)</span><span class="token punctuation">;</span>              <span class="token comment">//split分离后的是单通道图像</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"蓝色单通道"</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"绿色单通道"</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"红色单通道"</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

Mat dst<span class="token punctuation">;</span>
<span class="token function">merge</span><span class="token punctuation">(</span>mv<span class="token punctuation">,</span>dst<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//对vector对象的合并(和原图像相同三通道)</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"使用vector合并成原图"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//可以对单通道进行某些操作后再进行合并</span>
Mat mzero <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//创建一个和mv[0]单通道大小类型相同的,值为0的单通道图像,通道合并时使用</span>
aChannels<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>				<span class="token comment">//使用clone不会影响到mv[0]</span>
aChannels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
aChannels<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">merge</span><span class="token punctuation">(</span>aChannels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//对数组的合并(三通道)</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"蓝色三通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

aChannels<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
aChannels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
aChannels<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">merge</span><span class="token punctuation">(</span>aChannels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//对数组的合并(三通道),参数2:合并数组的个数</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"绿色三通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

aChannels<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
aChannels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
aChannels<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">merge</span><span class="token punctuation">(</span>aChannels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//对数组的合并(三通道)</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"红色三通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//进行通道的混合,可以对多个图像混合</span>
int from_to<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span>		<span class="token comment">//表示将第1个图像的[0]通道数据,传递给第2个图像的[2]通道</span>
				  <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span>		<span class="token comment">//表示将第1个图像的[1]通道数据,传递给第2个图像的[1]通道</span>
				  <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token punctuation">;</span>	<span class="token comment">//表示将第1个图像的[2]通道数据,传递给第2个图像的[0]通道</span>
<span class="token function">mixChannels</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>image<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>dst<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> from_to<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//此处的dst在上面的变换已经是3通道且大小类型与image相同</span>
<span class="token comment">//参数1:输入图像地址,</span>
<span class="token comment">//参数2:输入图像的个数1,</span>
<span class="token comment">//参数3:输出图像地址,输出图像个数1,</span>
<span class="token comment">//参数4:设置输入矩阵的通道对应输出矩阵的通道,</span>
<span class="token comment">//参数5:共有几组输入输出通道的关系,此处是3组</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"mixChannels混合通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

Mat dst2 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//此处dst2的大小类型需和image相同,否则执行mixChannels会报错</span>
int from_to2<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token function">mixChannels</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>image<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">&amp;</span>dst2<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> from_to2<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处也能显示蓝色,和上面的蓝色单通道颜色相同</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"蓝色混合通道"</span><span class="token punctuation">,</span> dst2<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

012-图像色彩空间转换-变换背景(cvtColor,inRange)

//012-图像色彩空间转换-背景变换(cvtColor,inRange)
void quickDemo::inrange_demo(Mat &image){
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);		//hsv色彩空间表https://blog.csdn.net/leo_888/article/details/88284251
	//通过hsv空间表,确定出绿色的范围(H:35-77,S:43-255,V:46-255),使用inrange将此范围提取出来
	Mat mask;
	inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);	//此处提取的是绿色区域部分
	imshow("inRange_mask", mask);		
Mat redback <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
redback <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//将此创建的背景图片变为红色</span>
<span class="token function">bitwise_not</span><span class="token punctuation">(</span>mask<span class="token punctuation">,</span> mask<span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//此处对mask取反得到人物的区域</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"bitwise_not_mask"</span><span class="token punctuation">,</span> mask<span class="token punctuation">)</span><span class="token punctuation">;</span>		
image<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>redback<span class="token punctuation">,</span> mask<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//此处将image图像在mask中不为0的点拷贝到redback上,mask为0的区域就不要了</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"redback"</span><span class="token punctuation">,</span> redback<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//显示背景为红色,前景为人的图像</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

013-图像像素值统计(minMaxLoc,meanStdDev)

//013-图像像素值统计(minMaxLoc,meanStdDev)
void quickDemo::pixel_static_demo(Mat &image){
	double minv, maxv;				//最小值,最大值
	Point minLoc, maxLoc;			//最小值位置,最大值位置
	vector<Mat> mv;
	split(image, mv);
	for (int i = 0; i < mv.size(); i++){
		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());	//输入矩阵应为单通道
		cout << "No.channels:" << i << ",min value:" << minv << ",max value:" << maxv << endl;
	}
	Mat mean, stddev;
	meanStdDev(image, mean, stddev);	//参数1:输入矩阵(1-4通道),参数2:计算均值,参数3:计算方差,参数4:mask(指定ROI区域)
	cout << "mean:" << mean <<endl<< "stddeve:" << stddev << endl;
	cout << "mean-type:" << mean.type() << endl << "stddeve-type:" << stddev.type() << endl;
	//mean和stddev的type都是6,故矩阵类型为CV_64F,数据是double类型的,所以取值时应at<double>
	//CV_8U=ucahr,CV_8S=cahr,CV_32S=int,CV_32F=float,CV_64F=double
<span class="token comment">//提取单通道的均值及均方差(mean是个单通道的矩阵(使用imagewatch查看其状态),提取其值使用)</span>
double meanB <span class="token operator">=</span> mean<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//一定要注意at&lt;&gt;中的取值类型,不对就会报错,此处用imagewatch调试,看不能使用int,只能使用double类型</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"meanB:"</span> <span class="token operator">&lt;&lt;</span> meanB <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
double meanG <span class="token operator">=</span> mean<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//一定要注意at&lt;&gt;中的取值类型,不对就会报错,此处用imagewatch调试,看不能使用int,只能使用double类型</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"meanG:"</span> <span class="token operator">&lt;&lt;</span> meanG <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
double meanR <span class="token operator">=</span> mean<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//一定要注意at&lt;&gt;中的取值类型,不对就会报错,此处用imagewatch调试,看不能使用int,只能使用double类型</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"meanR:"</span> <span class="token operator">&lt;&lt;</span> meanR <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>

}

  • 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

014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect)

//014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect)
void quickDemo::drawing_demo(Mat &image){
	Mat bg = Mat::zeros(image.size(), image.type());
	//绘制矩形
	Rect rect;
	rect.x = 100;
	rect.y = 50;
	rect.width = 200;
	rect.height = 200;
	rectangle(bg, rect, Scalar(0, 0, 255), -1,8);	//参数4为-1时表示填充
	//绘制圆
	circle(bg, Point(300, 250), 15, Scalar(255, 0, 0), 2,8);
	//绘制线
	line(bg, Point(100, 50), Point(300, 250), Scalar(0, 255, 0), 2,LINE_AA);	//LINE_AA反锯齿(更平滑)
	//绘制椭圆
	RotatedRect rrt;
	rrt.center = Point(200,100);
	rrt.size = Size(100, 200);
	rrt.angle = 45.0;					//椭圆角度
	ellipse(bg, rrt, Scalar(0, 255, 255), 2, 8);
	imshow("绘制演示", bg);
Mat dst<span class="token punctuation">;</span>
<span class="token function">addWeighted</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> <span class="token number">0.7</span><span class="token punctuation">,</span> bg<span class="token punctuation">,</span> <span class="token number">0.3</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"addWeighted演示"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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

015-随机数与随机颜色

//015-随机数与随机颜色
void quickDemo::random_drawing_demo(){
	Mat canavas = Mat::zeros(Size(512, 512), CV_8UC3);
	int w = canavas.cols;
	int h = canavas.rows;
	RNG rng(1234);
	while (true)
	{
		int c = waitKey(100);
		if (c==27){					//当按下ESC键时退出循环
			break;
		}
	int x1 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> w<span class="token punctuation">)</span><span class="token punctuation">;</span>
	int y1 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> h<span class="token punctuation">)</span><span class="token punctuation">;</span>
	int x2 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> w<span class="token punctuation">)</span><span class="token punctuation">;</span>
	int y2 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> h<span class="token punctuation">)</span><span class="token punctuation">;</span>
	int b <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	int g <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	int r <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	canavas <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//每次循环将图像变为黑色(刷新图像,可以实现每次绘制一条线,若注释则绘制多条线)</span>
	<span class="token function">line</span><span class="token punctuation">(</span>canavas<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>x1<span class="token punctuation">,</span> y1<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>x2<span class="token punctuation">,</span> y2<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> g<span class="token punctuation">,</span> r<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token constant">LINE_AA</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"随机绘制演示"</span><span class="token punctuation">,</span> canavas<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

}

  • 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

016-多边形填充与绘制(fillPoly,polylines,drawContours)


//016-多边形填充与绘制(fillPoly,polylines,drawContours)
void quickDemo::polyline_drawing_demo(){
	Mat canavas = Mat::zeros(Size(512, 512), CV_8UC3);
	Point p1(100, 100);
	Point p2(350, 100);
	Point p3(450, 280);
	Point p4(320, 450);
	Point p5(80, 400);
	vector<Point> pts;
	pts.push_back(p1);
	pts.push_back(p2);
	pts.push_back(p3);
	pts.push_back(p4);
	pts.push_back(p5);
<span class="token comment">//fillPoly(canavas, pts, Scalar(255, 255, 0), 8);			//此函数专用填充多边形(此种形式opencv3.0一直报错(可以使用其重载),opencv4可以实现)</span>
<span class="token comment">//imshow("fillPoly多边形填充", canavas);</span>

<span class="token function">polylines</span><span class="token punctuation">(</span>canavas<span class="token punctuation">,</span> pts<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//此函数无法将参数5变为-1来填充,会报错</span>
<span class="token comment">//参数1:输入输出图像矩阵,参数2:输入点集,参数3:是否封闭,参数4:颜色,参数5:线宽,参数6:线型,参数7:偏置	</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"polylines多边形绘制"</span><span class="token punctuation">,</span> canavas<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//通过点集绘制轮廓</span>
vector<span class="token operator">&lt;</span>vector<span class="token operator">&lt;</span>Point<span class="token operator">&gt;&gt;</span> contours<span class="token punctuation">;</span>
contours<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>pts<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">drawContours</span><span class="token punctuation">(</span>canavas<span class="token punctuation">,</span> contours<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//参数5位-1时填充</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"drawContours多边形绘制"</span><span class="token punctuation">,</span> canavas<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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

017-鼠标操作与响应(setMouseCallback)

//017-定义鼠标事件的回调函数
Point sp(-1, -1);
Point ep(-1, -1);
Mat temp;		//用于保存原图,已完成对之前画有矩形的图片的擦除(所以拖动时永远是最新的矩形了)
static void on_draw(int event, int x, int y, int flags, void *userdata){
Mat image <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token punctuation">(</span>Mat<span class="token operator">*</span><span class="token punctuation">)</span>userdata<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token operator">==</span><span class="token constant">EVENT_LBUTTONDOWN</span><span class="token punctuation">)</span>		<span class="token comment">//当鼠标按下时,得到初始位置</span>
<span class="token punctuation">{<!-- --></span>
	sp<span class="token punctuation">.</span>x <span class="token operator">=</span> x<span class="token punctuation">;</span>
	sp<span class="token punctuation">.</span>y <span class="token operator">=</span> y<span class="token punctuation">;</span>
	cout <span class="token operator">&lt;&lt;</span> <span class="token string">"start point:"</span> <span class="token operator">&lt;&lt;</span> sp <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>event <span class="token operator">==</span> <span class="token constant">EVENT_LBUTTONUP</span><span class="token punctuation">)</span>							<span class="token comment">//当鼠标抬起时,得到结束位置</span>
<span class="token punctuation">{<!-- --></span>
	ep<span class="token punctuation">.</span>x <span class="token operator">=</span> x<span class="token punctuation">;</span>
	ep<span class="token punctuation">.</span>y <span class="token operator">=</span> y<span class="token punctuation">;</span>
	<span class="token comment">//cout &lt;&lt; "end point:" &lt;&lt; sp &lt;&lt; endl;</span>
	<span class="token comment">//绘制矩形窗</span>
	int dx <span class="token operator">=</span> ep<span class="token punctuation">.</span>x <span class="token operator">-</span> sp<span class="token punctuation">.</span>x<span class="token punctuation">;</span>
	int dy <span class="token operator">=</span> ep<span class="token punctuation">.</span>y <span class="token operator">-</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span> dx<span class="token operator">&gt;</span><span class="token number">0</span> <span class="token operator">&amp;&amp;</span> dy<span class="token operator">&gt;</span><span class="token number">0</span> <span class="token punctuation">)</span>
	<span class="token punctuation">{<!-- --></span>
		Rect <span class="token function">box</span><span class="token punctuation">(</span>sp<span class="token punctuation">.</span>x<span class="token punctuation">,</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">,</span> dx<span class="token punctuation">,</span> dy<span class="token punctuation">)</span><span class="token punctuation">;</span>
		temp<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span>
		Mat imageBox <span class="token operator">=</span> <span class="token function">image</span><span class="token punctuation">(</span>box<span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"ROI区域"</span><span class="token punctuation">,</span> imageBox<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//此处直接截取ROI区域</span>
		<span class="token function">rectangle</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> box<span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"鼠标绘制"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//绘制完成后要更新</span>

		<span class="token comment">//结束后,为下一次做准备</span>
		sp<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
		sp<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>		
<span class="token punctuation">}</span>
<span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>event <span class="token operator">==</span> <span class="token constant">EVENT_MOUSEMOVE</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>			<span class="token comment">//当鼠标移动过程中实时显示矩形大小</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>sp<span class="token punctuation">.</span>x<span class="token operator">&gt;</span><span class="token number">0</span> <span class="token operator">&amp;&amp;</span> sp<span class="token punctuation">.</span>y<span class="token operator">&gt;</span><span class="token number">0</span><span class="token punctuation">)</span>		<span class="token comment">//只有当鼠标按下了,才能有所响应</span>
	<span class="token punctuation">{<!-- --></span>
		ep<span class="token punctuation">.</span>x <span class="token operator">=</span> x<span class="token punctuation">;</span>
		ep<span class="token punctuation">.</span>y <span class="token operator">=</span> y<span class="token punctuation">;</span>

		<span class="token keyword">if</span> <span class="token punctuation">(</span>ep<span class="token punctuation">.</span>x<span class="token operator">&gt;</span>image<span class="token punctuation">.</span>cols <span class="token operator">||</span> ep<span class="token punctuation">.</span>y<span class="token operator">&gt;</span>image<span class="token punctuation">.</span>rows<span class="token punctuation">)</span>
		<span class="token punctuation">{<!-- --></span>
			cout <span class="token operator">&lt;&lt;</span> <span class="token string">"无法截取边界,请重新截取"</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
			<span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token function">exit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//当绘制的矩形超出图像坐标时,要退出,否则会报错</span>
		<span class="token punctuation">}</span>
		<span class="token comment">//cout &lt;&lt; "end point:" &lt;&lt; sp &lt;&lt; endl;</span>
		<span class="token comment">//绘制矩形窗</span>
		int dx <span class="token operator">=</span> ep<span class="token punctuation">.</span>x <span class="token operator">-</span> sp<span class="token punctuation">.</span>x<span class="token punctuation">;</span>
		int dy <span class="token operator">=</span> ep<span class="token punctuation">.</span>y <span class="token operator">-</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">;</span>
		<span class="token keyword">if</span> <span class="token punctuation">(</span>dx <span class="token operator">&gt;</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> dy <span class="token operator">&gt;</span> <span class="token number">0</span><span class="token punctuation">)</span>
		<span class="token punctuation">{<!-- --></span>
			Rect <span class="token function">box</span><span class="token punctuation">(</span>sp<span class="token punctuation">.</span>x<span class="token punctuation">,</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">,</span> dx<span class="token punctuation">,</span> dy<span class="token punctuation">)</span><span class="token punctuation">;</span>
			temp<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token function">rectangle</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> box<span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"鼠标绘制"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//绘制完成后要更新</span>
		<span class="token punctuation">}</span>
	<span class="token punctuation">}</span>

<span class="token punctuation">}</span>

}

//017-鼠标操作与响应(setMouseCallback)
void quickDemo::mouse_drawing_demo(Mat &image){
namedWindow(“鼠标绘制”, WINDOW_AUTOSIZE);
setMouseCallback(“鼠标绘制”, on_draw,(void*)(&image));
imshow(“鼠标绘制”, image);
temp = image.clone();
}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71

018-图像像素类型转换与归一化(convertTo,normalize)

//018-图像像素类型转换与归一化(convertTo,normalize)
void quickDemo::norm_demo(Mat &image){
	//一般在深度学习等预处理图像时将数据归一化
	//将image变为float数据类型
	Mat dst;
	cout <<"image.type():"<< image.type() << endl;
	image.convertTo(image, CV_32F);
	imshow("浮点型图像", image);						//浮点型的图像要想正常显示必须是0-1之间的,否则在0-255之间的浮点数无法正常显示
	cout << "image.type():" << image.type() << endl;
	//CV_8UC3=16,CV_32FC3=21
	//CV_8U=ucahr,CV_8S=cahr,CV_32S=int,CV_32F=float,CV_64F=double
<span class="token comment">//将0-255的数据值范围归一化为0-1,要在0-1数据应为浮点型(https://blog.csdn.net/DP323/article/details/80273996)</span>
<span class="token function">normalize</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//输入数组是浮点型的,输出的和输入的数值类型相同,只是取值范围不同(通过imagewatch查看)</span>
											<span class="token comment">//image若不转类型,之前是无符号整型,当归一化0-1时,数值都是0.几,就会成为黑色图像</span>
<span class="token comment">//参数1:输入数组</span>
<span class="token comment">//参数2::输出数组,支持原地运算</span>
<span class="token comment">//参数3:range normalization模式的最小值</span>
<span class="token comment">//参数4:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。</span>
<span class="token comment">//参数5::归一化的类型,可以有以下的取值:</span>
<span class="token comment">//NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。</span>
<span class="token comment">//NORM_INF : 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C - 范数(绝对值的最大值)</span>
<span class="token comment">//NORM_L1 : 归一化数组的L1 - 范数(绝对值的和)</span>
<span class="token comment">//NORM_L2 : 归一化数组的(欧几里德)L2 - 范数</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"dst.type():"</span> <span class="token operator">&lt;&lt;</span> dst<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像数据归一化"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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

019-图像缩放与插值(resize)

//019-图像缩放与插值
void quickDemo::resize_demo(Mat &image){
	//在深度学习中可能需要将其转换成一定大小的图片,并归一化到0-1
	Mat zoomin, zoomout;
	int h = image.rows;
	int w = image.cols;
	resize(image, zoomin, Size(w / 2, h / 2), 0, 0, INTER_LINEAR);
		/*参数1:输入图像
		参数2:输出图像,形态和输入图相同,当dsize不等于0,输出图尺寸会和dsize相同, 当dsize等于0,输出图尺寸会由输入图尺寸、fx、fy计算而得
		参数3:输出图像大小,若为零,则参数4、5不能和其同时为0,dsize = Size(round(fxsrc.cols), round(fysrc.rows))
		参数4:水平缩放比例,当输入为0时,fx = (double)dsize.width / src.cols
		参数5:垂直缩放比例, 当输入为0时,fy = (double)dsize.height / src.rows
		参数6:插值方式,如下
		INTER_NEAREST - 最近邻插值
		INTER_LINEAR - 线性插值(默认),此种方法要比最近邻插值更平滑
		INTER_AREA - 区域插值
		INTER_CUBIC - 三次样条插值
		INTER_LANCZOS4 - Lanczos插值*/
	imshow("zoomin", zoomin);
	resize(image, zoomout, Size(w *1.5, h * 1.5), 0, 0, INTER_LINEAR);
	imshow("zoomout", zoomout);
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

020-图像翻转(flip)

//020-图像翻转(flip)
void quickDemo::flip_demo(Mat &image){
	Mat dst;
	flip(image, dst, 0);
	/*参数1:输入图像
	  参数2:输出图像
	  参数3:>0: 沿x - 轴翻转, 0 : 沿y - 轴翻转, <0 : x、y轴同时翻转*/
	imshow("图像翻转", dst);
}

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

021-图像旋转(getRotationMatrix2D,warpAffine)

//021-图像旋转(getRotationMatrix2D,warpAffine)
void quickDemo::rotate_demo(Mat &image){
	Mat dst, M;
	int w = image.cols;
	int h = image.rows;
	//获得旋转矩阵M
	M = getRotationMatrix2D(Point(w/2,h/2), 45, 1.0);	//参数1;确定原图像的旋转中心,参数2:旋转角度,参数3:缩放因子(1.0表示大小不变)
<span class="token comment">//对原图像进行旋转操作1(输出图像大小不变,但旋转的一部分无法全部显示)</span>
<span class="token function">warpAffine</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">M</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">INTER_LINEAR</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token comment">/*.src: 输入图像
	.dst : 输出图像,尺寸由dsize指定,图像类型与原图像一致
	.M : 2X3的变换矩阵
	.dsize : 指定图像输出尺寸
	.flags : 插值算法标识符,有默认值INTER_LINEAR
	.borderMode : 边界像素模式,有默认值BORDER_CONSTANT
	.borderValue : 边界颜色取值,有默认值Scalar()即0*/</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"旋转演示1"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

<span class="token comment">//旋转操作2,改变输出旋转图像大小,使其将旋转后的图像全部显示</span>
<span class="token comment">//M矩阵使用imagewatch查看其内容,2行3列,返回矩阵https://blog.csdn.net/limit_ing/article/details/61952187</span>
<span class="token comment">//</span>
<span class="token comment">//确定新的旋转图像大小及偏移</span>
double cos <span class="token operator">=</span> <span class="token function">abs</span><span class="token punctuation">(</span><span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//得到角度a的余弦值cos(a)	,abs()求元素的绝对值 ,CV_64F=double</span>
double sin <span class="token operator">=</span> <span class="token function">abs</span><span class="token punctuation">(</span><span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//得到角度a的正弦值sin(a)</span>
int nw <span class="token operator">=</span> cos<span class="token operator">*</span>w <span class="token operator">+</span> sin<span class="token operator">*</span>h<span class="token punctuation">;</span>					<span class="token comment">//获取新的图像宽度</span>
int nh <span class="token operator">=</span> sin<span class="token operator">*</span>w <span class="token operator">+</span> cos<span class="token operator">*</span>h<span class="token punctuation">;</span>					<span class="token comment">//获取新的图像宽度</span>
<span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>nw <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> w<span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//更改旋转矩阵M中的(0,2)处的值,此处含义类似更改旋转中心宽度</span>
<span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator">&lt;</span>double<span class="token operator">&gt;</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>nh<span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> h <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//更改旋转矩阵M中的(1,2)处的值,此处含义类似更改旋转中心高度</span>
<span class="token function">warpAffine</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">M</span><span class="token punctuation">,</span> <span class="token function">Size</span><span class="token punctuation">(</span>nw<span class="token punctuation">,</span>nh<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">INTER_LINEAR</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"旋转演示2"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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

022-视频文件摄像头使用(VideoCapture capture)

//022-视频文件摄像头使用(VideoCapture)
void quickDemo::video_demo(Mat &image){
	//VideoCapture capture(0);	//初始化一个capture对象用来获取视频摄像头,0表示获取电脑本机摄像头
	VideoCapture capture("G:\\OpenCV\\opencv所用视频\\wuDao.avi");	//从指定路径中读取视频
	if (!capture.isOpened())
	{
		std::cout << "Read video Failed !" << std::endl;
		getchar();
		return;
	}
	Mat frame;
	while (true)
	{
		capture.read(frame);	//将视频读取到Mat矩阵中
		if (frame.empty())
		{
			break;
		}
		imshow("frame",frame);
		flip(frame, frame, 1);//电脑摄像头的视频有镜像,将其再反转一下
		//TODO:do something...(可以在此处做一些对图像的操作)
		cvtColor(frame, frame, COLOR_BGR2GRAY);
		imshow("灰度", frame);
	<span class="token comment">//当按键为ESC时退出循环</span>
	int c <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>c<span class="token operator">==</span><span class="token number">27</span><span class="token punctuation">)</span>
	<span class="token punctuation">{<!-- --></span>
		<span class="token keyword">break</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">//资源释放</span>
capture<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>


<span class="token comment">另外一种读取视频文件方式(https://blog.csdn.net/u010368556/article/details/79186992)</span>
<span class="token comment">//cv::VideoCapture capture;</span>
<span class="token comment">//capture.open("G:\\OpenCV\\opencv所用视频\\wuDao.avi");</span>

<span class="token comment">//if (!capture.isOpened())</span>
<span class="token comment">//{<!-- --></span>
<span class="token comment">//	std::cout &lt;&lt; "Read video Failed !" &lt;&lt; std::endl;</span>
<span class="token comment">//	getchar();</span>
<span class="token comment">//	return;</span>
<span class="token comment">//}</span>

<span class="token comment">//cv::Mat frame;</span>
<span class="token comment">//cv::namedWindow("video test");</span>

<span class="token comment">//int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);</span>
<span class="token comment">//std::cout &lt;&lt; "total frame number is: " &lt;&lt; frame_num &lt;&lt; std::endl;</span>

<span class="token comment">//for (int i = 0; i &lt; frame_num - 1; ++i)</span>
<span class="token comment">//{<!-- --></span>
<span class="token comment">//	capture &gt;&gt; frame;		//第二种方式  </span>
<span class="token comment">//	//capture.read(frame); </span>
<span class="token comment">//	imshow("video test", frame);</span>
<span class="token comment">//	if (cv::waitKey(30) == 'q')</span>
<span class="token comment">//	{<!-- --></span>
<span class="token comment">//		break;</span>
<span class="token comment">//	}</span>
<span class="token comment">//}</span>

<span class="token comment">//cv::destroyWindow("video test");</span>
<span class="token comment">//capture.release();</span>

}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66

023-视频处理与保存-帧宽高(capture.get)

//023-视频处理与保存-帧宽高(capture.get)(未完成)
void quickDemo::video_demo2(Mat &image){
	//https://blog.csdn.net/cv_jason/article/details/54619505
	VideoCapture capture(0);	//初始化一个capture对象用来获取视频摄像头,0表示获取电脑本机摄像头
	//VideoCapture capture("G:\\OpenCV\\opencv所用视频\\wuDao.avi");	//从指定路径中读取视频
	if (!capture.isOpened())
	{
		std::cout << "Read video Failed !" << std::endl;
		getchar();
		return;
	}
<span class="token comment">//set方式可以设置视频宽高,但如果相机不支持此种分辨率输出set也是无法取的</span>
int frame_width <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FRAME_WIDTH</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//获取视频帧的宽</span>
int frame_height <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FRAME_HEIGHT</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//获取视频帧的高</span>
int frame_count <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FRAME_COUNT</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//获取视频总帧数</span>
int fps <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FPS</span><span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//获取视频FPS(FPS表示每秒处理多少帧画面,处理速度越快,性能越好,FPS一种衡量标准)</span>

cout <span class="token operator">&lt;&lt;</span> <span class="token string">"frame width:"</span> <span class="token operator">&lt;&lt;</span> frame_width <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"frame height:"</span> <span class="token operator">&lt;&lt;</span> frame_height <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"frame count:"</span> <span class="token operator">&lt;&lt;</span> frame_count <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"fps:"</span> <span class="token operator">&lt;&lt;</span> fps <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>

int codec <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FOURCC</span><span class="token punctuation">)</span><span class="token punctuation">;</span>			<span class="token comment">//获取视频文件格式</span>
<span class="token comment">//cout &lt;&lt; "codec:" &lt;&lt; codec &lt;&lt; endl;					//文件格式为10进制的</span>
<span class="token comment">//char s[20];</span>
<span class="token comment">//sprintf(s, "%x", codec);						//将获取的codec转换成16进制的字符串</span>
<span class="token comment">//printf("视频文件格式16进制:%s\n", s);				//将获取的codec以16进制的形式输出</span>

<span class="token comment">//直接输出视频编码格式</span>
cout <span class="token operator">&lt;&lt;</span> <span class="token string">"视频文件格式:"</span> <span class="token operator">&lt;&lt;</span> <span class="token function">char</span><span class="token punctuation">(</span>codec<span class="token operator">&amp;</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token function">char</span><span class="token punctuation">(</span><span class="token punctuation">(</span>codec<span class="token operator">&gt;&gt;</span><span class="token number">8</span><span class="token punctuation">)</span><span class="token operator">&amp;</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token function">char</span><span class="token punctuation">(</span><span class="token punctuation">(</span>codec<span class="token operator">&gt;&gt;</span><span class="token number">16</span><span class="token punctuation">)</span><span class="token operator">&amp;</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> <span class="token function">char</span><span class="token punctuation">(</span><span class="token punctuation">(</span>codec<span class="token operator">&gt;&gt;</span><span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">&amp;</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator">&lt;&lt;</span> endl<span class="token punctuation">;</span>
<span class="token comment">//&amp;是位操作符,10进制codec的二进制数与16进制0xFF的二进制数进行与操作,而codec的最低8位被保留了下来,其余高位全部变为0,此时再对截断后的8位char就得到字符</span>
<span class="token comment">//(11111111 11111111 11111111 10000001) &amp; (0x00000000 00000000 00000000 11111111) = 00000000 00000000 00000000 10000001</span>
<span class="token comment">//(codec&gt;&gt;8)&amp;0xFF对codec二进制的第2个高8位进行截断</span>
<span class="token comment">//(codec&gt;&gt;16)&amp;0xFF对codec二进制的第3个高8位进行截断</span>
<span class="token comment">//(codec&gt;&gt;24)&amp;0xFF对codec二进制的第4个高8位进行截断</span>

<span class="token comment">//视频保存大小与获得的视频大小相同(此处使用的opencv4)</span>
fps <span class="token operator">=</span> <span class="token number">30</span><span class="token punctuation">;</span>				<span class="token comment">//当为打开摄像头设备时,此处fps一定要赋值,否则录制的视频无法打开</span>
VideoWriter writer<span class="token punctuation">;</span>
writer<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"G:\\OpenCV\\opencv所用视频\\wu4.avi"</span><span class="token punctuation">,</span> writer<span class="token punctuation">.</span><span class="token function">fourcc</span><span class="token punctuation">(</span><span class="token string">'M'</span><span class="token punctuation">,</span> <span class="token string">'J'</span><span class="token punctuation">,</span> <span class="token string">'P'</span><span class="token punctuation">,</span> <span class="token string">'G'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> fps<span class="token punctuation">,</span> <span class="token function">Size</span><span class="token punctuation">(</span>frame_width<span class="token punctuation">,</span> frame_height<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//https://blog.csdn.net/Day_upon/article/details/85991445</span>

<span class="token comment">//以下编码格式在OpenCV4中都可以运行</span>
<span class="token comment">//CV_FOURCC('M','J','P','G')  注意此种格式保存的视频一直无法打开(在opencv3下)</span>
<span class="token comment">//CV_FOURCC('P', 'I', 'M', '1') = MPEG - 1 codec(无法打开)(在opencv3下)</span>
<span class="token comment">//	CV_FOURCC('M', 'J', 'P', 'G') = motion - jpeg codec(无法打开)(在opencv3下)</span>
<span class="token comment">//	CV_FOURCC('M', 'P', '4', '2') = MPEG - 4.2 codec(保存的avi可以打开)(在opencv3下)</span>
<span class="token comment">//	CV_FOURCC('D', 'I', 'V', '3') = MPEG - 4.3 codec(保存的avi可以打开)(在opencv3下)</span>
<span class="token comment">//	CV_FOURCC('D', 'I', 'V', 'X') = MPEG - 4 codec(可以打开)(在opencv3下)</span>
<span class="token comment">//	CV_FOURCC('U', '2', '6', '3') = H263 codec(未测试)</span>
<span class="token comment">//	CV_FOURCC('I', '2', '6', '3') = H263I codec(未测试)</span>
<span class="token comment">//	CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec(无法打开)</span>

Mat frame<span class="token punctuation">;</span>
<span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
	capture<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">//将视频读取到Mat矩阵中</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>frame<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
		<span class="token keyword">break</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
	<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"frame"</span><span class="token punctuation">,</span> frame<span class="token punctuation">)</span><span class="token punctuation">;</span>		
	<span class="token comment">//flip(frame, frame, 1);//电脑摄像头的视频有镜像,将其再反转一下,当为MJPG编码格式时无需翻转</span>
	<span class="token comment">//TODO:do something...(可以在此处做一些对图像的操作)</span>
	<span class="token comment">/*cvtColor(frame, frame, COLOR_BGR2GRAY);
	imshow("灰度", frame);*/</span>

	<span class="token comment">//opencv3版本一直保存失败(原因已经明确)</span>
	writer<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span>					<span class="token comment">//保存视频(opencv只能处理视频不处理音频,处理大小有限制,不要超过2G)</span>
	<span class="token comment">//writer &lt;&lt; frame;</span>
	<span class="token comment">//当按键为ESC时退出循环</span>
	int c <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token operator">/</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">==</span> <span class="token number">27</span><span class="token punctuation">)</span>
	<span class="token punctuation">{<!-- --></span>
		<span class="token keyword">break</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token comment">//资源释放</span>
capture<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
writer<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 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
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79

024-图像直方图-绘制直方图(calcHist,normalize,line)

//024-图像直方图(calcHist,normalize,line)
void quickDemo::showHistogram(Mat &image){
<span class="token comment">//cvtColor(image, image, COLOR_BGR2GRAY);</span>
<span class="token comment">//imshow("gray", image);</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">channels</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span>
<span class="token punctuation">{<!-- --></span>
	<span class="token comment">//三通道分离</span>
	vector<span class="token operator">&lt;</span>Mat<span class="token operator">&gt;</span> bgr_plane<span class="token punctuation">;</span>
	<span class="token function">split</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> bgr_plane<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">//定义参数变量</span>
	<span class="token keyword">const</span> int channels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
	<span class="token keyword">const</span> int bins<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">256</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
	float hranges<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span> <span class="token punctuation">}</span><span class="token punctuation">;</span>
	<span class="token keyword">const</span> float<span class="token operator">*</span> ranges<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> hranges <span class="token punctuation">}</span><span class="token punctuation">;</span>
	Mat b_hist<span class="token punctuation">;</span>
	Mat g_hist<span class="token punctuation">;</span>
	Mat r_hist<span class="token punctuation">;</span>
	<span class="token comment">//计算Blue,green,red通道的直方图</span>
	<span class="token function">calcHist</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>bgr_plane<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> b_hist<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> bins<span class="token punctuation">,</span> ranges<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">calcHist</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>bgr_plane<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> g_hist<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> bins<span class="token punctuation">,</span> ranges<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">calcHist</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>bgr_plane<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> r_hist<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> bins<span class="token punctuation">,</span> ranges<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">//参数1;输入图像地址,参数2:1张图片(指针可以指向多个图),参数3:0表示一个通道,参数4:mask使用Mat()空计算整张图像,</span>
	<span class="token comment">//参数5:输出,参数6:1维,参数7:bins(256个灰度级别),参数8;ranges直方图范围</span>

	<span class="token comment">//用mv来接收计算得到直方图数据,在后面的y坐标绘制中会使用到(防止b_hist等中途被修改)</span>
	Mat mv<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
	mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> b_hist<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//在后面的y坐标显示会用到此</span>
	mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> g_hist<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> r_hist<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token comment">//opencv的从数据到图像需要自己绘制</span>
	<span class="token comment">//显示直方图</span>
	int hist_w <span class="token operator">=</span> <span class="token number">512</span><span class="token punctuation">;</span>
	int hist_h <span class="token operator">=</span> <span class="token number">400</span><span class="token punctuation">;</span>
	int bin_w <span class="token operator">=</span> <span class="token function">cvRound</span><span class="token punctuation">(</span><span class="token punctuation">(</span>double<span class="token punctuation">)</span>hist_w <span class="token operator">/</span> bins<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//cvRound():返回跟参数最接近的整数值,即四舍五入;</span>
	Mat histImage <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span><span class="token number">408</span><span class="token punctuation">,</span> <span class="token number">560</span><span class="token punctuation">,</span> <span class="token constant">CV_8UC3</span><span class="token punctuation">)</span><span class="token punctuation">;</span>		<span class="token comment">//创建画布时多余的位置用于坐标显示</span>
	<span class="token comment">//归一化直方图数据(三个通道计算的最小最大值范围不同,将其归一化到一个范围之间(画布高内),显示的时候不会超出画布范围)</span>
	<span class="token function">normalize</span><span class="token punctuation">(</span>b_hist<span class="token punctuation">,</span> b_hist<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> histImage<span class="token punctuation">.</span>rows<span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">normalize</span><span class="token punctuation">(</span>g_hist<span class="token punctuation">,</span> g_hist<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> histImage<span class="token punctuation">.</span>rows<span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token function">normalize</span><span class="token punctuation">(</span>r_hist<span class="token punctuation">,</span> r_hist<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> histImage<span class="token punctuation">.</span>rows<span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token comment">//绘制直方图曲线(在一个mat图像上使用line绘制)</span>
	<span class="token keyword">for</span> <span class="token punctuation">(</span>int i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> bins<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span>
		<span class="token function">line</span><span class="token punctuation">(</span>histImage<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>b_hist<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
			<span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>b_hist<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">line</span><span class="token punctuation">(</span>histImage<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>g_hist<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
			<span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>g_hist<span class="token punctuation">.</span>at<span class="token operator">&lt;</span>float<span class="token operator">&gt;</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token function">line</span><span class="token punctuation">(</span>histImage<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</sp
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值