Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

2023-10-31

 效果图◕‿◕:opencv人脸识别效果图(请叫我真爱粉)✌✌✌先看一下效果图勾起你的兴趣! 

文章目录:

一:环境配置搭建

二:图像

1.图像读取与显示

main.cpp 

运行结果

2.图像色彩空间转换

2.1 换色彩 

test.h 

test.cpp

main.cpp  

 运行结果

2.2 照片换背景

test.h       

test.cpp       

main.cpp       

运行结果       

3.图像对象的创建Mat

test.h

test.cpp 

main.cpp

运行结果

4.图像像素 

4.1 图像像素的读写

test.h       

test.cpp   

main.cpp     

运行结果

4.2 图像像素的算术操作

test.h       

test.cpp       

main.cpp       

运行结果       

4.3 图像像素的逻辑操作(或 与 非 异或)

test.h       

test.cpp       

main.cpp       

运行结果       

4.4 图像像素值统计

test.h

test.cpp       

main.cpp       

运行结果       

4.5 图像像素类型的转换与归一化

test.h       

test.cpp       

main.cpp       

运行结果       

5.图像通道分离与合并与混合

test.h       

test.cpp       

main.cpp       

运行结果       

6.图像的放缩与差值

test.h       

test.cpp       

main.cpp       

运行结果       

7.图像的旋转

7.1 定义好的角度

test.h       

test.cpp       

main.cpp       

运行结果

7.2 自定义角度

原理 

test.h       

test.cpp       

main.cpp       

运行结果       

8.图像模糊

8.1 图像卷积操作

test.h

test.cpp       

main.cpp       

运行结果       

8.2 高斯模糊

test.h

test.cpp       

main.cpp       

运行结果       

8.3 高斯双边模糊

test.h

test.cpp       

main.cpp       

运行结果       

三:颜色

1.颜色表操作

test.h       

test.cpp       

main.cpp       

运行结果       

2.随机数与随机颜色

test.h       

test.cpp       

main.cpp       

运行结果       

四:事件响应 

1.滚动条 

1.1 滚动条调整图像亮度

test.h       

test.cpp       

main.cpp       

运行结果   

1.2 滚动条参数传递(亮度和对比度)

test.h       

test.cpp       

main.cpp       

运行结果       

2.键盘响应

test.h       

test.cpp       

main.cpp       

运行结果       

3.鼠标响应

test.h       

test.cpp       

main.cpp       

运行结果       

五:图形

1.图像几何形状绘制

test.h       

test.cpp       

main.cpp       

运行结果       

2.多边形填充与绘制

test.h       

test.cpp       

main.cpp       

运行结果       

六:视频

1.视频文件摄像头使用

test.h       

test.cpp       

main.cpp       

运行结果       

2.视频处理与保存

test.h       

test.cpp       

main.cpp       

运行结果       

七:直方图

1.图像的直方图

test.h       

test.cpp       

main.cpp       

运行结果       

2.二维2D直方图

test.h       

test.cpp       

main.cpp       

运行结果       

3.直方图的均衡化

test.h       

test.cpp       

main.cpp       

运行结果       

Opencv4基于C++的 实时人脸监测


来源: OpenCV4 C++ 快速入门视频30讲 - 系列合集 10小时        资源-sorce-cpp

评价

讲的如何?
    老师讲的很好,有干货!看这门课最好有点点基础,没有基础细心的花点时间仔细学也是可以看懂的!


启示?
    作为入门课程,的确可以打开我们一些眼界,有点新鲜有点意思!


我的笔记:(含注解,知识点分类)
    我是怎么学的?我是零基础,基本上先看代码,自己一行一行的看,不懂的看老师怎么讲,再百度
    看那个?看笔记看test.cpp就可以了,里面都是正在的封装功能函数
    每个知识点可以干什么?我都运行出来了,可以更加直观的看效果    

学多久?
    别看这个课时10来个小时,但是下载软件配置环境,理解代码敲代码我花了2.5天,如果你们不敲代码可能就会快很多的!        

我的代码:点我查看 

学习路线 

入门:OpenCV图象读写、视频读写、基本像素处理、色彩空间转化

初级:OpenCV图象卷积处理、二值图象分析、形态学处理、视频分析

中级:OpenCV图象特征提取与应用、深度神经网络,机器学习

高级:Pytorch深度学习、OpenVINO开发、torchvision对象检测框架
      tensorflow对象检测框架、模型从设计、训练、部署

一:环境配置搭建

OpenCV4基于C++基础入门笔记:OpenCV环境配置搭建

进入“资源属性管理器如”何返回“解决方案资源管理器”?
    点击窗口——>重置窗口布局——>是



注    释: CTRL+K+C 
取消注释: CTRL+K+U

二:图像

1.图像读取与显示

main.cpp 

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow



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

using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_GRAYSCALE);	    //第二个参数代表显示一张灰度图像
	
	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");	
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 
	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果

2.图像色彩空间转换

2.1 换色彩 

test.h 

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge); 
};

test.cpp

这里需要包含工程的目录:点击工程名TestOpenCV右键属性——>VC++目录——>包含目录F:\VC2015\TestOpenCV\TestOpenCV

#include<test.h>

//色彩转换
void QuickDemo::colorSpace_Demo(Mat & image)
{
	Mat a, b;								//定义2个矩阵类的图像a和b,
	cvtColor(image, b, COLOR_BGR2HSV);		//图像转换函数,可以把image转成b,第三个参数是转成的类型	COLOR_BGR2HSV  = 40BGR到HSV
	cvtColor(image, a, COLOR_BGR2GRAY);		//图像转换函数,可以把image转成a,第三个参数是转成的类型	COLOR_BGR2GRAY = 6彩色到灰度

	imshow("HSV", b);
	imshow("灰度", a);

	//保存图片,前面是保存图的地址,后面是保存图的名称
	imwrite("F:/images/hsv.jpg", b);					
	imwrite("F:/images/gray.jpg", a);
}

main.cpp  

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度       黑色轮廓线条(细致)
		//COLOR_GRAY2BGR = 8灰度到彩色    
		//COLOR_BGR2HSV  = 40BGR到HSV        黑白抠图 
		//COLOR_HSV2BGR  = 54HSV到BGR        黑色轮廓线条(粗略)
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 



	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		  qd.colorSpace_Demo(src);



	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

 运行结果

2.2 照片换背景

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像色彩空间转换
	//RGB色彩空间
	//HSV色彩空间
	//YUV色彩空间
	//YCrCb色彩空间
	
	//色彩空间转换:cvtColor(输入图像,输出图像,转换的颜色空间类型)
	//提取指定色彩范围区域:inRange(输入图像,最小值,最大值,提取指定范围的像素)

void QuickDemo::inrange_demo(Mat &image)							//可以替换照片背景,可以从ps相关来理解
{
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);							//色彩空间转换

	Mat mask;
	//自己的照片背景颜色【去除】
		//inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);	//绿色
		inRange(hsv, Scalar(100, 43, 46), Scalar(124, 255, 255), mask);	//绿色
	imshow("mask", hsv);			//原图

	Mat redback = Mat::zeros(image.size(), image.type());
	
	//需要替换的背景颜色【替换】
		//redback = Scalar(40, 40, 200);	//红色
		redback = Scalar(230, 20, 20);		//蓝色

	bitwise_not(mask, mask);		//取反 黑白版图(根据颜色去背景):去掉背景色(无颜色)+抠出人物(人物颜色不一样)
	imshow("mask", mask);	

	image.copyTo(redback, mask);	//蒙版之后的图:换背景=背景颜色+人物图实图								
	imshow("roi区域提取", redback);	
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		qd.inrange_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

3.图像对象的创建Mat

test.h

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
};

test.cpp 

#include<test.h>

//图像对象的创建
void QuickDemo::mat_creation_demo(Mat &image)
{
	Mat m1, m2;
	m1 = image.clone();
	image.copyTo(m2);		//复制

	//创建空白图像		ones&zeros是初始化的方法
	Mat m3 = Mat::ones(Size(400,400), CV_8UC3);	//创建400*400;的CV8位的;无符号uU=nsigned char;通道为n=3数据的宽度和长度是由通道数决定的
	m3 = Scalar(255, 0, 0);//改变m3的颜色为蓝色

	//用来查看宽度,高度与通道数
	/*std::cout << "width:"<<m3.cols<<"height"<< m3.rows <<"channels"<<m3.channels()<< std::endl;
	std::cout << m3 << std::endl;*/


	Mat m4 = m3.clone();	 //克隆
	//m3.copyTo(m4);		 //把M3赋值给M4,M4就是蓝色
	m4 = Scalar(0, 255, 255);//改变m4的颜色为黄色

	//这里还有其他的
		//Mat m3 = m4;		//赋值
		//Mat kernel = (Mat_<char>(3,3) << 0, -1, 0,-1,5,-1,0,-1,-1 );


	imshow("图像3", m3);	//标题和图像名称   显示图像m3 纯蓝色
	imshow("图像4", m4);	//标题和图像名称
}

main.cpp

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 



	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		qd.mat_creation_demo(src);



	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果

4.图像像素 

4.1 图像像素的读写

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
};

test.cpp   

#include<test.h>


//图像像素的读写	第一种是数组访问模式
void QuickDemo::pixel_visit_demo1(Mat &image)
{
	int dims = image.channels();
	int h = image.rows;
	int w = image.cols;
	for (int row = 0; row < h; row++)
	{
		for (int col = 0; col < w; col++)
		{
			if (dims == 1) //单通道的灰度图像
			{
				int pv = image.at<uchar>(row, col);  //得到像素值
				image.at<uchar>(row, col) = 255 - pv;//给像素值重新赋值

			}
			if (dims == 3) //三通道的彩色图像
			{
				Vec3b bgr = image.at<Vec3b>(row, col);		//opencv特定的类型,获取三维颜色,3个值
				image.at<Vec3b>(row, col)[0] = 255 - bgr[0];
				image.at<Vec3b>(row, col)[1] = 255 - bgr[1];
				image.at<Vec3b>(row, col)[2] = 255 - bgr[2];//对彩色图像读取它的像素值,并且对像素值进行改写。
			}
		}
	}
	namedWindow("像素读写演示", WINDOW_FREERATIO);
	imshow("像素读写演示", image);
}

//图像像素的读写	第二种为指针访问模式
void QuickDemo::pixel_visit_demo2(Mat &image)
{
	int dims = image.channels();
	int h = image.rows;
	int w = image.cols;
	for (int row = 0; row < h; row++)
	{
		uchar *current_row = image.ptr<uchar>(row);

		for (int col = 0; col < w; col++)
		{
			if (dims == 1) //单通道的灰度图像
			{
				int pv = *current_row;	   //得到像素值
				*current_row++ = 255 - pv; //给像素值重新赋值

			}
			if (dims == 3) //三通道的彩色图像
			{
				*current_row++ = 255 - *current_row; //指针每做一次运算,就向后移动一位
				*current_row++ = 255 - *current_row;
				*current_row++ = 255 - *current_row;
			}
		}
	}
	namedWindow("像素读写演示", WINDOW_FREERATIO);
	imshow("像素读写演示", image);

}

main.cpp     

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		qd.pixel_visit_demo2(src);	//指针



	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果

4.2 图像像素的算术操作

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像像素的算术操作
void QuickDemo::operators_demo(Mat &image)
{
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m   = Mat::zeros(image.size(), image.type());
	dst = image - Scalar(50, 50, 50);	//素点减50
	m = Scalar(50, 50, 50);

	//下面是内部的函数调用
	add(image, m, dst);				//加法操作 api
	imshow("加法操作", dst);
	namedWindow("加法操作", WINDOW_FREERATIO);

	//subtract(image, m, dst);		//减法操作 api
	//imshow("减法操作", dst);

	//multiply(image, m, dst);		//乘法操作 api
	//imshow("乘法操作", dst);

	//divide(image, m, dst);		//除法操作 api
	//imshow("除法操作", dst);


//	//加法操作底层
//	int dims = image.channels();
//	int h = image.rows;
//	int w = image.cols;
//	for (int row = 0; row < h; row++)
//	{
//		for (int col = 0; col < w; col++)
//		{
//			Vec3b p1 = image.at<Vec3b>(row, col); //opencv特定的类型,获取三维颜色,3个值
//			Vec3b p2 = m.at<Vec3b>(row, col);
//			dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);	//saturate_cast用来防爆,小于0就是0,大于255就是255
//			dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);
//			dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);	//对彩色图像读取它的像素值,并且对像素值进行改写。
//		}
//	}
//	imshow("加法操作", dst);
//
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		qd.operators_demo(src);



	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

 

4.3 图像像素的逻辑操作(或 与 非 异或)

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像像素的逻辑操作
void QuickDemo::bitwise_demo(Mat &image)
{
	Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
	Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);

	//图像,形状大小位置,颜色,线宽(>0表示绘制 <0表示填充),线条样式,逆时针方向
	//颜色B G R
	rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);
	rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
	imshow("m1", m1);
	imshow("m2", m2);

	Mat dst;
	bitwise_and(m1, m2, dst);	//位操作与
	bitwise_or(m1, m2, dst);	//位操作或
	bitwise_not(image, dst);	//取反操作
	bitwise_xor(m1, m2, dst);	//异或操作
	imshow("像素位操作", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		qd.bitwise_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}


运行结果       

 

4.4 图像像素值统计

test.h

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像像素值统计
	//最小(min)
	//最大(max)
	//均值(mean)
	//标准方差(standard deviation)
	//最大最小值minMaxLoc
	//计算均值与标准方差meanStdDev

void QuickDemo::pixel_statistic_demo(Mat &image)
{
	double minv, maxv;			//定义最值
	Point minLoc, maxLoc;		//定义最值地址

	std::vector<Mat>mv;			//mv是一个Mat类型的容器 装在这个容器内
	split(image, mv);
	for (int i = 0; i < mv.size(); i++)
	{
		//求出图像的最大值和最小值
		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());	
		std::cout << "通道:" << i << "最小值:" << minv << "最大值:" << maxv << std::endl;
	}

	Mat mean, stddev;
		//求出图像的均值和方差
		Mat redback = Mat::zeros(image.size(), image.type());
	/*	redback = Scalar(40, 40, 200);
		meanStdDev(redback, mean, stddev);
		imshow("redback", redback);*/

		meanStdDev(image, mean, stddev);	
		std::cout << "均值:" << mean << std::endl;
		std::cout << "方差:" << stddev << std::endl;
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		qd.pixel_statistic_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

4.5 图像像素类型的转换与归一化

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像像素类型的转换与归一化
	//将图像或图像中的某个区域(如ROI)的像素值范围缩放到0到1之间,或者根据需要缩放到指定的范围
	//这是一种常用的图像预处理步骤,可以用于图像的对比度拉伸、色彩均衡、直方图均衡化等操作

	//归一化类型有四种,分别是NORM_L2、NORM_L1、NORM_INF、NORM_MINMAX12
	//	NORM_L2:默认值。计算L2范数,使用欧几里得距离
	//	NORM_L1:计算L1范数,即绝对值之和
	//	NORM_INF:计算最大元素的绝对值
	//	NORM_MINMAX:将像素值缩放到[0, 1]的范围内
void QuickDemo::norm_demo(Mat &image)
{
	Mat dst;
	//打印出来图片的类型
	std::cout << image.type() << std::endl;	

	//将dst数据转换成浮点型float32位数据
	image.convertTo(image, CV_32F);
	std::cout << image.type() << std::endl;

	//图像进行归一化操作:输入图像,输出图像,缩放因子-通常取值为1.0,偏移量-通常取值为0.0,归一化的类型
	normalize(image, dst, 1.0,0.0, NORM_MINMAX);
	std::cout << dst.type() << std::endl;

	imshow("图像的归一化", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		qd.norm_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

5.图像通道分离与合并与混合

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);

};

test.cpp       

#include<test.h>


//通道的分离与合并
void QuickDemo::channels_demo(Mat &image)
{
	//容器
	std::vector<Mat>mv;
	//1.通道分离
	split(image, mv);
	//0,1,2三个通道分别代表BGR
		//imshow("蓝色", mv[0]);
		//imshow("绿色", mv[1]);
		//imshow("红色", mv[2]);

	Mat dst;
	//选择一个通道打开,其他关闭
		mv[0] = 0;
		mv[2] = 0;
	//2.通道合并
	merge(mv, dst);
	imshow("蓝色", dst);

	//3.通道混合
	int from_to[] = { 0,2,1,1,2,0 };				//两两依次一组
	mixChannels(&image, 1, &dst, 1, from_to, 3);	//3表示3个通道
	imshow("通道混合", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		qd.channels_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}


运行结果       

6.图像的放缩与差值

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像的放缩与差值
void QuickDemo::resize_demo(Mat &image)
{
	Mat zoomin, zoomout;

	int h = image.rows;
	int w = image.cols;

	//调整大小的图像,是否需要缩小图像,新的图像大小,在缩小图像时要在哪个位置开始采样,在缩小图像时要在哪个位置开始采样,插值方法
	//resize(image, zoomin, Size(w/2, h/2), 0, 0, INTER_LINEAR);
	//imshow("zoomin", zoomin);

	resize(image, zoomout, Size(w*3 , h*3), 0, 0, INTER_LINEAR);
	imshow("zoomin", zoomout);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		qd.resize_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

 

7.图像的旋转

7.1 定义好的角度

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像的旋转:定义好的
void QuickDemo::flip_demo(Mat &image)
{
	Mat dst;
	flip(image, dst, 0);//上下翻转 x对称

	flip(image, dst, 1);//左右翻转 y对称

	flip(image, dst, -1);//旋转180°

	imshow("图像翻转", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		qd.flip_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果

7.2 自定义角度

原理 

旋转矩阵的第三个元素是0,这是因为在2D平面中进行旋转时,图像在Z轴上的位置没有变化 

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像的旋转:自定义
void QuickDemo::rotate_demo(Mat &image)
{
	Mat dst, M;			//用于存储旋转后的图像和旋转矩阵
	int h = image.rows;	//定义输入图片的高度
	int w = image.cols;	//定义输入图片的宽度

	//旋转矩阵
		//2D旋转的变换矩阵:图像的中心点,旋转的角度(单位是度),旋转的缩放因子(1.0表示不进行缩放)
		M = getRotationMatrix2D(Point(w / 2, h / 2), 45, 1.0);

		//矩阵旋转获取角度	旋转矩阵是一个2x3的矩阵
		//旋转矩阵的第三个元素是0,这是因为在2D平面中进行旋转时,图像在Z轴上的位置没有变化
		//[cos(angle)   sin(angle)  0]
		//[-sin(angle)  cos(angle)  0]
			// 获取旋转矩阵的第一行第一列元素的绝对值,即cos(45度)
			double cos = abs(M.at<double>(0, 0));	
			// 获取旋转矩阵的第一行第二列元素的绝对值,即sin(45度)
			double sin = abs(M.at<double>(0, 1));

		//这里怎么算的:我放了张图
			// 根据旋转矩阵的元素计算旋转后的图像的宽度,等于cos(45度)*原宽度+sin(45度)*原高度
			int nw = cos * w + sin * h;
			// 根据旋转矩阵的元素计算旋转后的图像的高度,等于sin(45度)*原宽度+cos(45度)*原高度
			int nh = sin * w + cos * h;

	// 将旋转矩阵的第三列的第一项加上(旋转后的图像宽度的一半减去原图像宽度的一半),以调整旋转后的图像的中心位置
	M.at<double>(0, 2) += (nw / 2 - w / 2);
	// 将旋转矩阵的第三列的第二项加上(旋转后的图像高度的一半减去原图像高度的一半),以调整旋转后的图像的中心位置
	M.at<double>(1, 2) += (nh / 2 - h / 2);

	//图像进行放射变换:输入图像,输出图像,仿射变换矩阵(决定了图像的变换方式),输出图像的大小,双线性插值法,无填充(0表示无颜色合成),填充颜色
	warpAffine(image, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(255, 255, 0));

	imshow("旋转演示", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		qd.rotate_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

8.图像模糊

blur图像模糊、GaussianBlur高斯模糊和bilateralFilter的高斯双边模糊区别:
	blur				图像模糊:即普通的模糊,对图像进行相同像素之间的融合,得到整个图像都模糊的效果
	GaussianBlur		高斯模糊:图像整体都变模糊,边缘信息丢失严重
	bilateralFilter 高斯双边模糊:图像边缘清晰,中间部分有一定程度的模糊,边缘信息得以保留

8.1 图像卷积操作

test.h

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

		//图像直方图
		void QuickDemo::histogram_demo(Mat &image);

		//二维直方图
		void QuickDemo::histogram_2d_demo(Mat &image);

		//直方图的均衡化
		void QuickDemo::histogram_eq_demo(Mat &image);

		//图像卷积操作
		void QuickDemo::blur_demo(Mat &image);


};

test.cpp       

#include<test.h>


//图像卷积操作
void QuickDemo::blur_demo(Mat &image) {
	Mat dst;

	//原始图像,卷积之后的图像,卷积的矩阵大小,卷积的起始点
	blur(image, dst, Size(15, 15), Point(-1, -1));

	imshow("图像卷积操作 图像模糊", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		//qd.video_demo2(src);

		//图像直方图
		//qd.histogram_demo(src);

		//二维直方图
		//qd.histogram_2d_demo(src);

		//直方图的均衡化
		//qd.histogram_eq_demo(src);

		//图像卷积操作
		qd.blur_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

8.2 高斯模糊

test.h

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

		//图像直方图
		void QuickDemo::histogram_demo(Mat &image);

		//二维直方图
		void QuickDemo::histogram_2d_demo(Mat &image);

		//直方图的均衡化
		void QuickDemo::histogram_eq_demo(Mat &image);

		//图像卷积操作
		void QuickDemo::blur_demo(Mat &image);

		//高斯模糊
		void QuickDemo::gaussian_blur_demo(Mat &image);

};

test.cpp       

#include<test.h>


//高斯模糊
void QuickDemo::gaussian_blur_demo(Mat &image) {
	Mat dst;

	//初始图像,处理后的图像,高斯矩阵大小,sigmaX在X方向上的标准偏差-控制了模糊的程度和模糊的方向
		//较大的sigmaX值会导致更宽的模糊效果,而较小的值则会产生更锐利的模糊效果
	GaussianBlur(image, dst, Size(0, 0), 15);

	imshow("高斯模糊", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		//qd.video_demo2(src);

		//图像直方图
		//qd.histogram_demo(src);

		//二维直方图
		//qd.histogram_2d_demo(src);

		//直方图的均衡化
		//qd.histogram_eq_demo(src);

		//图像卷积操作
		//qd.blur_demo(src);

		//高斯模糊
		qd.gaussian_blur_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

8.3 高斯双边模糊

test.h

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

		//图像直方图
		void QuickDemo::histogram_demo(Mat &image);

		//二维直方图
		void QuickDemo::histogram_2d_demo(Mat &image);

		//直方图的均衡化
		void QuickDemo::histogram_eq_demo(Mat &image);

		//图像卷积操作
		void QuickDemo::blur_demo(Mat &image);

		//高斯模糊
		void QuickDemo::gaussian_blur_demo(Mat &image);

		//高斯双边模糊
		void QuickDemo::bifilter_demo(Mat &image);

};

test.cpp       

#include<test.h>


//高斯双边模糊
void QuickDemo::bifilter_demo(Mat &image) {
	Mat dst;

	//输入图像,输出图像,滤波过程中像素之间的距离,颜色空间中的标准偏差,像素空间中的标准偏差
	bilateralFilter(image, dst, 0, 100, 10);

	imshow("高斯双边模糊", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		//qd.video_demo2(src);

		//图像直方图
		//qd.histogram_demo(src);

		//二维直方图
		//qd.histogram_2d_demo(src);

		//直方图的均衡化
		//qd.histogram_eq_demo(src);

		//图像卷积操作
		//qd.blur_demo(src);

		//高斯模糊
		//qd.gaussian_blur_demo(src);

		//高斯双边模糊
		qd.bifilter_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

三:颜色

1.颜色表操作

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);

};

test.cpp       

#include<test.h>


//opencv自带颜色操作
void QuickDemo::color_style_demo(Mat &image)
{
	//各种色彩
	int colormap[] = {
		COLORMAP_AUTUMN ,
		COLORMAP_BONE,
		COLORMAP_CIVIDIS,
		COLORMAP_DEEPGREEN,
		COLORMAP_HOT,
		COLORMAP_HSV,
		COLORMAP_INFERNO,
		COLORMAP_JET,
		COLORMAP_MAGMA,
		COLORMAP_OCEAN,
		COLORMAP_PINK,
		COLORMAP_PARULA,
		COLORMAP_RAINBOW,
		COLORMAP_SPRING,
		COLORMAP_TWILIGHT,
		COLORMAP_TURBO,
		COLORMAP_TWILIGHT,
		COLORMAP_VIRIDIS,
		COLORMAP_TWILIGHT_SHIFTED,
		COLORMAP_WINTER
	};

	Mat dst;
	int index = 0;
	while (true)
	{
		char c = waitKey(100);		//停顿100ms 做视频处理都是1
		if (c == 27) {			    //esc 退出应用程序
			break;
		}
		if (c == 49)				//key#1 按下按键1时,保存图片到指定位置
		{
			std::cout << "你按下了 #1" << std::endl;
			imwrite("F:/images/gray.jpg", dst);
		}
		applyColorMap(image, dst, colormap[index % 19]);	//循环展示19种图片	(输入图像,输出图像,匹配颜色)
		index++;
		imshow("循环播放", dst);
	}
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		qd.color_style_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}


运行结果       

颜色不停自动变换 

 

2.随机数与随机颜色

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

};

test.cpp       

#include<test.h>


//随机数与随机颜色
void QuickDemo::random_drawing()
{
	Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);
	int w = canvas.cols;
	int h = canvas.rows;

	//初始化
	RNG rng(2);

	while (true)
	{
		int c = waitKey(10);
		if (c == 27)
		{
			break;
		}
		//rng.uniform(low, high)将生成一个在范围[low, high)内的均匀分布的随机数
		int x1 = rng.uniform(0, canvas.cols);
		int y1 = rng.uniform(0, h);
		int x2 = rng.uniform(0, canvas.cols);
		int y2 = rng.uniform(0, h);

		int b = rng.uniform(0, 255);
		int g = rng.uniform(0, 255);
		int r = rng.uniform(0, 255);

		canvas = Scalar(0, 0, 0);

		line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 8, LINE_AA, 0);	
		imshow("随机绘制演示", canvas);
	}
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		qd.random_drawing();


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

不停移动变换颜色 

四:事件响应 

1.滚动条 

1.1 滚动条调整图像亮度

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo(Mat &image);
};

test.cpp       

#include<test.h>


//滚动条调整图像亮度
Mat  src, dst, m;
int lightness = 50;								//定义初始的亮度为50
static void on_track(int, void*)
{
	m = Scalar(lightness, lightness, lightness);//创建调整亮度的数值
	subtract(src, m, dst);						//定义亮度变化为——减
	imshow("亮度调整", dst);					//显示调整亮度之后的图片
}
void QuickDemo::tracking_bar_demo(Mat &image)
{
	namedWindow("亮度调整", WINDOW_AUTOSIZE);
	dst = Mat::zeros(image.size(), image.type());//图片的初始化创建一个和image大小相等,种类相同的图像
	  m = Mat::zeros(image.size(), image.type());//图片的初始化创建一个和image大小相等,种类相同的图像
	src = image;								 //给src赋值
	int max_value = 100;						 //定义最大值为100
	createTrackbar("Value Bar:", "亮度调整", &lightness, max_value, on_track);//调用函数实现功能。
	on_track(50, 0);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		qd.tracking_bar_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}


运行结果   

 

1.2 滚动条参数传递(亮度和对比度)

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);


};

test.cpp       

#include<test.h>


//滚动条参数传递(亮度和对比度)
static void on_lightness(int b, void* userdata)//亮度 目标图像
{
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());

	m = Scalar(b, b, b);

	//第一个图像 第一个图像的权重 第二个图像 第二个图像的权重 加到权重总和上的标量值 目标图像
	addWeighted(image, 1.0, m, 0, b, dst);		//融合两张图
	imshow("亮度&对比度调整", dst);
}
static void on_contrast(int b, void* userdata)  //对比度 目标图像
{
	Mat image = *((Mat*)userdata);
	Mat dst = Mat::zeros(image.size(), image.type());
	Mat m = Mat::zeros(image.size(), image.type());

	double contrast = b / 100.0;

	addWeighted(image, contrast, m, 0.0, 0, dst);//融合两张图
	imshow("亮度&对比度调整", dst);
}
void QuickDemo::tracking_bar_demo2(Mat &image)
{
	namedWindow("亮度&对比度调整", WINDOW_AUTOSIZE);

	int lightness = 50;
	int max_value = 100;
	int contrast_value = 100;

	//				 取名			窗口名			滑块初始值  滚动的最大值 接收回调函数  用户传给回调函数的数据
	createTrackbar("Value Bar:", "亮度&对比度调整", &lightness, max_value, on_lightness, (void*)(&image));
	createTrackbar("Contrast Bar:", "亮度&对比度调整", &contrast_value, 200, on_contrast, (void*)(&image));
	on_lightness(50, &image);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		qd.tracking_bar_demo2(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}


运行结果       

2.键盘响应

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);

};

test.cpp       

#include<test.h>


//键盘响应
void QuickDemo::key_demo(Mat &image)	//先要鼠标点击图片再按键盘
{
	Mat dst = Mat::zeros(image.size(), image.type());
	while (true)
	{
		char c = waitKey(100);//停顿100ms 做视频处理都是1
		if (c == 27) {		  //esc 退出应用程序
			break;
		}
		if (c == 49)//key#1
		{
			std::cout << "你按下了 #1" << std::endl;
			cvtColor(image, dst, COLOR_BGR2GRAY);
		}
		if (c == 50)//key#2
		{
			std::cout << "你按下了 #2" << std::endl;
			cvtColor(image, dst, COLOR_BGR2HSV);
		}
		if (c == 51)//key#3
		{
			std::cout << "你按下了 #3" << std::endl;
			dst = Scalar(50, 50, 50);
			add(image, dst, dst);
		}
		imshow("键盘响应", dst);
		std::cout << c << std::endl;
	}
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		qd.key_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}


运行结果       

 

 

3.鼠标响应

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

};

test.cpp       

#include<test.h>


//鼠标操作与响应
	Point sp(-1, -1);//鼠标的开始的位置
	Point ep(-1, -1);//鼠标放下的位置
	Mat temp;

//处理绘图事件:事件,x 和 y表示鼠标的坐标位置,标志或状态信息,指向用户数据的指针
static void on_draw(int event, int x, int y, int flags, void *userdata)
//event:表示发生的事件类型
//	EVENT_MOUSEMOVE(鼠标移动)
//	EVENT_LBUTTONDOWN(鼠标左键按下)
//	EVENT_RBUTTONDOWN(鼠标右键按下)
{
	//获取用户数据
	Mat image = *((Mat*)userdata);
	if (event == EVENT_LBUTTONDOWN)		//如果鼠标的左键按下   显示起点	
	{
		sp.x = x;
		sp.y = y;
		std::cout << "起点" << sp << std::endl;
	}
	else if (event == EVENT_LBUTTONUP)	//鼠标左键弹起事件		在新窗口显示图
	{
		ep.x = x;
		ep.y = y;
		int dx = ep.x - sp.x;
		int dy = ep.y - sp.y;

		if (dx > 0 && dy > 0)
		{
			//区域
			Rect box(sp.x, sp.y, dx, dy);		

			//绘制一个窗口盒子
			rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
			imshow("截取显示区域窗口", image(box));

			//复位,为下一次做准备
			sp.x = -1;
			sp.y = -1;
		}
	}
	else if (event == EVENT_MOUSEMOVE)	//鼠标移动			   在原图附件上面取图
	{
		if (sp.x > 0 && sp.y > 0)
		{
			ep.x = x;
			ep.y = y;
			int dx = ep.x - sp.x;
			int dy = ep.y - sp.y;
			if (dx > 0 && dy > 0)
			{
				//截取绘制区域
				Rect box(sp.x, sp.y, dx, dy);

				//在原图附件上显示绘制的矩形
				rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);
				imshow("鼠标绘制", image);

				//复制到
				temp.copyTo(image);
			}
		}
	}
}
void QuickDemo::mouse_drawing_demo(Mat &image)
{
	//自动调整大小的窗
	namedWindow("鼠标绘制", WINDOW_AUTOSIZE);

	//窗口的名称,回调函数,指向void的指针
	setMouseCallback("鼠标绘制", on_draw, (void*)(&image));

	//原图附件
	imshow("鼠标绘制", image);

	//克隆显示(从原图附件截取的图片 克隆 到新建窗口)
	

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		qd.mouse_drawing_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

五:图形

1.图像几何形状绘制

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像几何形状的绘制
void QuickDemo::drawing_demo(Mat &image)
{//
	矩形
	//	Rect rect;
	//		rect.x = 30;
	//		rect.y = 90;
	//		rect.width = 50;
	//		rect.height = 50;
	//	//输入图像,矩形对象,颜色,线条宽度,线条类型,填充方式(0不填充)
	//	rectangle(image, rect, Scalar(255, 0, 0), 6, 8, 0);
	//	imshow("图形的绘制", image);

	圆形		
	//	//输入图像,圆的中心点坐标(以像素为单位),圆的半径,颜色,线条宽度,线条类型,填充方式
	//	circle(image, Point(50, 90), 15, Scalar(255, 0, 0), 2, LINE_AA, 0);
	//	imshow("图形的绘制", image);
	
	对两个图像进行加权合并
	//	Mat dst;
	//	Mat bg = Mat::zeros(image.size(), image.type());
	//	//输入图像,图像的权重(取值范围为[0,1]),输入图像,图像的权重(取值范围为[0,1]),像素值的加权和(范围为[-128,127]),输出图像
	//	addWeighted(image, 0.7, bg, 0.3, 0, image);
	//	imshow("图形的绘制", image);

	直线
	//	//输入图像,起点,终点,颜色,线条宽度,线条类型,填充方式
	//	line(image, Point(10, 50), Point(100, 50), Scalar(0, 0, 255), 8, LINE_AA, 0);
	//	imshow("图形的绘制", image);
	
	//椭圆
		RotatedRect rtt;
			//指定椭圆的位置、大小和方向
			rtt.center = Point(90, 90);
			rtt.size = Size(20, 50);
			rtt.angle = 0.0;
		//输入图像,位置 大小 方向,颜色,线条宽度,线条类型
		ellipse(image, rtt, Scalar(0, 0, 255), 2, 8);
		imshow("图形的绘制", image);


}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		qd.drawing_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

 

 

 

2.多边形填充与绘制

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

};

test.cpp       

#include<test.h>


//多边形填充与绘制
void QuickDemo::polyline_drawing_demo(Mat &image)
{
	Mat canvas = 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);

	//写入到容器
	std::vector<Point>pts;
	pts.push_back(p1);
	pts.push_back(p2);
	pts.push_back(p3);
	pts.push_back(p4);
	pts.push_back(p5);

	//绘制多边形轮廓填充[只能填充]:地方,包含多线段顶点坐标的数组,颜色,线段绘制方式,对齐坐标的位数
	//fillPoly(canvas, pts, Scalar(122, 155, 255), 8, 0);

	//绘制多边形轮廓:地方,包含多线段顶点坐标的数组,线段是否封闭,颜色,线宽,线段绘制方式,对齐坐标的位数
	//polylines(canvas, pts, true, Scalar(0, 0, 255), 2, 8, 0);

	std::vector<std::vector<Point>>contours;
	//把各个点导入数组
	contours.push_back(pts);
	//绘制多边形轮廓填充[能填充,还可以绘制]:地方,包含多线段顶点坐标的数组,-1表示填充(正表示多边形的绘制 为负表示多边形的填充),轮廓的颜色,轮廓的线宽
	drawContours(canvas, contours, -1, Scalar(0, 0, 255), -1);

	imshow("多边形绘制", canvas);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		qd.polyline_drawing_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

六:视频

1.视频文件摄像头使用

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo(Mat &image);

};

test.cpp       

#include<test.h>


//视频文件摄像头使用
void QuickDemo::video_demo(Mat &image)
{
	//读取视频的地址
	VideoCapture capture("F:/images/beauty.mp4");  
	Mat frame;

	while (true)
	{
		//读取视频
		capture.read(frame); 
		if (frame.empty())
		{
			break;
		}

		//图像镜像操作:左右翻转
		//flip(frame, frame, 1);

		imshow("视频播放", frame);

		//对视频调用之前的demo:色彩转换
		//colorSpace_Demo(frame);

		//控制速度
		int c = waitKey(10);

		if (c == 27) { //esc 退出应用程序
			break;
		}
	}

	//释放相机的资源
	capture.release();
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		qd.video_demo(src);


	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

2.视频处理与保存

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

};

test.cpp       

#include<test.h>


//视频处理与保存
void QuickDemo::video_demo2(Mat &image)
{
	//读取视频的地址
	VideoCapture capture("F:/images/beauty.mp4");

	int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);		//获取视频的宽度
	int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);		//获取视频的高度
	int count = capture.get(CAP_PROP_FRAME_COUNT);				//视频总的帧数												 
	double fps = capture.get(CAP_PROP_FPS);						//获取帧率

	std::cout << "宽度" << frame_width << std::endl;
	std::cout << "高度" << frame_height << std::endl;
	std::cout << "帧数" << count << std::endl;
	std::cout << "帧率" << fps << std::endl;

	//保存地址,获取图片的格式,图片的帧数,视频宽高,真
	VideoWriter writer("F:/images/test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);


	Mat frame;
	while (true)
	{
		//读取视频
		capture.read(frame);
		if (frame.empty())
		{
			break;
		}

		//图像镜像操作:左右翻转
		//flip(frame, frame, 1);

		imshow("视频播放", frame);

		//对视频调用之前的demo:色彩转换
		//colorSpace_Demo(frame);

		//控制速度
		int c = waitKey(30);

		if (c == 27) { //esc 退出应用程序
			break;
		}
	}

	capture.release();	//释放相机的资源
	writer.release();	//释放存放的资源
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		qd.video_demo2(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

七:直方图

1.图像的直方图

图像直方图的解释:将一幅图像的每个通道的像素强度分布以直方图的形式展现出来,便于观察和分析图像的亮度分布特征
    是一种用于计算机视觉和图像识别的特征描述符

    直方图主要基于图像局部方块的边缘方向直方图
    它将图像划分为小的细胞单元,每个细胞单元包含9个方向的边缘强度
    然后,将这些边缘强度分布(即直方图)组合起来,形成整个图像的直方图
    这个直方图描述了图像中物体的形状信息


广泛地应用于
    图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类、反向投影跟踪


分类
    灰度直方图
    颜色直方图


优缺点
    直方图的优点是:
        图像平移、旋转、缩放不变性
        它对图像的几何和光照变化具有鲁棒性
        它能够有效地描述物体的边缘和轮廓信息
        它对背景噪声不敏感

    直方图的缺点是:
        直方图通常需要组合许多小块的信息,这可能会导致对图像中物体的部分缺失或变形
        它不能提供物体的空间位置信息
        直方图的计算复杂度较高


作用:
    用于图像分割:对于具有双峰性的图像,可以利用大津法对图像进行分割,这种方法对图像的几何和光照变化具有鲁棒性
    用于图像识别:通过研究质量波动状况之后,就能掌握过程的状况,从而确定在什么地方集中力量进行质量改进工作
    用于行人检测:如果图像中没有人跟有人的直方图是不同的,通过比较两幅图像的直方图,可以判断这两幅图像是否相似

其他概念:
    Bins是指直方图的大小范围
        对于像素值取值在0~255之间的,最少有256个bin
        此外还可以有16、32、48、128等,256除以bin的大小应该是整数倍

    直方图归一化
        是一种图像处理方法,可以将直方图的像素分布调整为均匀分布的状态,使得图像的对比度得到提升

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

		//图像直方图
		void QuickDemo::histogram_demo(Mat &image);

};

test.cpp       

#include<test.h>


//图像直方图
void QuickDemo::histogram_demo(Mat &image) {
	// 三通道分离
		std::vector<Mat> bgr_plane;
		//split函数被用于将一个BGR图像(即具有三个颜色通道的图像)拆分为三个单独的通道,每个通道都包含一个单通道的图像
		split(image, bgr_plane);

	// 定义参数变量
		const int channels[1] = { 0 };
		const int bins[1] = { 256 };			//存储直方图的bin(大小范围)
		float hranges[2] = { 0,255 };			//通道的强度范围
		const float* ranges[1] = { hranges };

	//存储计算得到的直方图
	Mat b_hist;
	Mat g_hist;
	Mat r_hist;
	// 计算Blue, Green, Red通道的直方图:计算图像的直方图
		//1~4:要计算直方图的图像,通道数,直方图的掩膜图像的通道索引,空的掩膜图像(使用掩膜计算直方图的图像区域)
		//5~8:存储计算得到的直方图,直方图的维度是一维,灰度图像的强度值范围为0到255,包含每个通道的强度范围数组
		calcHist(&bgr_plane[0], 1, channels, Mat(), b_hist, 1, bins, ranges);
		//calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);
		calcHist(&bgr_plane[1], 1, channels, Mat(), g_hist, 1, bins, ranges);
		calcHist(&bgr_plane[2], 1, channels, Mat(), r_hist, 1, bins, ranges);


	// 显示直方图:创建一个大小为400x512的黑色图像(所有像素值初始化为0)
		int hist_w = 512;											//直方图的每个条形的宽度
		int hist_h = 400;											//直方图的高度
		int bin_w = cvRound((double)hist_w / bins[0]);				//每个直方图条形的宽度
			//cvRound():返回跟参数最接近的整数值,即四舍五入
			//cvRound()函数转换为整数,以确保绘制的直线端点与像素中心对齐
		Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);		//存储创建的直方图图像
			//将数据类型设置为CV_8UC3。这表示每个像素使用8位无符号整数,并且具有三个通道(红、绿、蓝)
		
	// 对每个通道的直方图进行归一化:像素均匀分布
		//1~4:输入数组进行归一化的直方图数据,输出数组,归一化的最小值,归一化的最大值
		//5~7:归一化类型(将原始数据线性缩放到指定范围),用于存储归一化后的数据的矩阵,传递给函数作为可选的矩阵参数
		normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
		normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
		normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());

	// 画曲线,将直方图数据可视化:绘制出每个通道的直方图,并将它们叠加在同一个图像上,以展示图像的颜色分布
		//方法一:嵌套
		for (int i = 1; i < bins[0]; i++) {		
			//在图像上绘制直线
				line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),		//输入图像,起点,终点
					//计算当前bin的横坐标:列表的索引是从0开始的,所以需要减去1才能对应到bin的索引
					//计算当前bin的纵坐标:b_hist.at<float>(i - 1)获取第i个bin的直方图值,,将纵坐标取反,即从直方图高度减去该值,以得到图像中对应的像素位置
					
					//在给定的代码中,hist_h是直方图的基线(即y=0的位置)是固定的
					//而cvRound(b_hist.at<float>(i - 1))则是第i个直方图的峰值
					//因此,通过减去cvRound(b_hist.at<float>(i - 1)),我们可以将直方图向下移动,使其与基线对齐
					//减去cvRound(b_hist.at<float>(i - 1))是为了将直方图向下移动一定的距离

			//定位直线起点和终点在图像中的位置			起点 终点,颜色,线宽为2个像素,线类型为8,没有像素偏移
				//通过使用Point对象,我们可以方便地指定直线的起点和终点在图像中的准确位置
				Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);	//起点,终点,蓝色

			line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
				Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);	//绿色

			line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
				Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);	//红色
		}
		
		//方法二:这个比较好理解
		for (int i = 0; i < 256; i++) {
			Point p01(bin_w * i, hist_h - cvRound(b_hist.at<float>(i)));
			Point p02(bin_w * i + 1, hist_h - cvRound(b_hist.at<float>(i + 1)));
			line(histImage, p01, p02, Scalar(255, 0, 0), 1, 8, 0);

			Point p11(bin_w * i, hist_h - cvRound(g_hist.at<float>(i)));
			Point p12(bin_w * i + 1, hist_h - cvRound(g_hist.at<float>(i + 1)));
			line(histImage, p11, p12, Scalar(0, 255, 0), 1, 8, 0);

			Point p21(bin_w * i, hist_h - cvRound(r_hist.at<float>(i)));
			Point p22(bin_w * i + 1, hist_h - cvRound(r_hist.at<float>(i + 1)));			
			line(histImage, p21, p22, Scalar(0, 0, 255), 1, 8, 0);

		}


	// 显示直方图
		namedWindow("直方图曲线", WINDOW_AUTOSIZE);
		imshow("直方图曲线", histImage);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		//qd.video_demo2(src);

		//图像直方图
		qd.histogram_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

2.二维2D直方图

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

		//图像直方图
		void QuickDemo::histogram_demo(Mat &image);

		//二维直方图
		void QuickDemo::histogram_2d_demo(Mat &image);

};

test.cpp       

#include<test.h>


//二维2D直方图
void QuickDemo::histogram_2d_demo(Mat &image) {
		Mat hsv,hs_hist;	//输入输出图像
		cvtColor(image, hsv, COLOR_BGR2HSV);

		int hbins = 30, sbins = 32;							//h30行,s32列
		int hist_bins[] = { hbins, sbins };					//直方图的bin数量

		float h_range[] = { 0, 180 };
		float s_range[] = { 0, 256 };
		const float* hs_ranges[] = { h_range, s_range };	//包含每个通道的取值范围的数组

	//计算一维数组的直方图
		int hs_channels[] = { 0, 1 };
		//计算一维数组的直方图:1~5:输入图像的指针,直方图的通道数,包含通道名称的数组,存储计算得到的直方图,输出图像即直方
		//					  6~10:直方图的维度-2D,直方图的bin数量,包含每个通道的取值范围的数组,是否将输入图像归一化,是否计算累积分布函数
		calcHist(&hsv, 1, hs_channels, Mat(), hs_hist, 2, hist_bins, hs_ranges, true, false);

	//存储下面画的矩形
		double maxVal = 0;
		//这个函数的作用是在给定的数组或矩阵中寻找元素的最大值,并返回它们的位置
			//参数:计算最小值和最大值的输入数组或图像,要计算的维度或轴的参数- 0表示在第一个维度,存储计算得到的最大值,范围或边界,范围或边界
			minMaxLoc(hs_hist, 0, &maxVal, 0, 0);

		int scale = 10;
		//sbins*scale行和hbins*scale列,数据类型为CV_8UC3,即8位无符号整数(每个通道一个)
		Mat hist2d_image = Mat::zeros(sbins*scale, hbins * scale, CV_8UC3);

	//叠加矩形
		for (int h = 0; h < hbins; h++) {
			for (int s = 0; s < sbins; s++)
			{
				//位于横h,列s处的频次
				float binVal = hs_hist.at<float>(h, s);
				//颜色
				int intensity = cvRound(binVal * 255 / maxVal);

				//画矩形
				rectangle(hist2d_image,									//输入图像
						 Point(h*scale, s*scale),						//左上角的坐标
						 Point((h + 1)*scale - 1, (s + 1)*scale - 1),	//右下角的坐标
						Scalar::all(intensity),							//颜色
						-1);											//线条宽度
			}
		}

		//将灰度图像转换为彩色图像,以便更好地可视化直方图数据
		//通过对每个像素应用颜色映射来将灰度值映射为彩色值,从而将灰度图像转换为彩色图像
		//输入的2D直方图图像-通常为灰度图像,输出图像-即应用颜色映射后的图像,颜色映射类型-这里使用的是JET颜色映射
		applyColorMap(hist2d_image, hist2d_image, COLORMAP_JET);

	// 显示直方图
		imshow("二维直方图", hist2d_image);
		//imwrite("F:/images/zhifangtu.jpg", hist2d_image);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		//qd.video_demo2(src);

		//图像直方图
		//qd.histogram_demo(src);

		//二维直方图
		qd.histogram_2d_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

3.直方图的均衡化

test.h       

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

//创建一个QuickDemo对象
class QuickDemo 
{
	public:
		//色彩转换
		void colorSpace_Demo(Mat &imge);
		//图像对象的创建
		void mat_creation_demo(Mat &imge);
		//图像像素的读写
		void pixel_visit_demo1(Mat &image);	//数组
		void pixel_visit_demo2(Mat &image);	//指针
		//图像像素的算术操作
		void operators_demo(Mat &image);
		//滚动条调整图像亮度
		void tracking_bar_demo1(Mat &image);
		//滚滚动条参数传递(亮度和对比度)
		void tracking_bar_demo2(Mat &image);
		//键盘响应
		void key_demo(Mat &image);
		//opencv自带颜色操作
		void color_style_demo(Mat &image);
		//图像像素的逻辑操作
		void bitwise_demo(Mat &image);
		//通道的分离与合并
		void channels_demo(Mat &image);
		//图像色彩空间转换
		void inrange_demo(Mat &image);

		//图像像素值统计
		void pixel_statistic_demo(Mat &image);

		//图像几何形状的绘制
		void drawing_demo(Mat &image);

		//随机数与随机颜色
		void QuickDemo::random_drawing();

		//多边形填充与绘制
		void QuickDemo::polyline_drawing_demo(Mat &image);

		//鼠标操作与响应
		void QuickDemo::mouse_drawing_demo(Mat &image);

		//图像像素类型的转换与归一化
		void QuickDemo::norm_demo(Mat &image);

		//图像的放缩与差值
		void QuickDemo::resize_demo(Mat &image);

		//图像的旋转:定义好的
		void QuickDemo::flip_demo(Mat &image);

		//图像的旋转:自定义
		void QuickDemo::rotate_demo(Mat &image);

		//视频文件摄像头使用
		void QuickDemo::video_demo1(Mat &image);

		//视频处理与保存
		void QuickDemo::video_demo2(Mat &image);

		//图像直方图
		void QuickDemo::histogram_demo(Mat &image);

		//二维直方图
		void QuickDemo::histogram_2d_demo(Mat &image);

		//直方图的均衡化
		void QuickDemo::histogram_eq_demo(Mat &image);

};

test.cpp       

#include<test.h>


//直方图的均衡化
void QuickDemo::histogram_eq_demo(Mat &image) {
	Mat gray;

	//图像转换
	cvtColor(image, gray, COLOR_BGR2GRAY);
	imshow("灰度图像", gray);

	Mat dst;
	//输入,输出
	equalizeHist(gray, dst);
	imshow("直方图均衡化演示", dst);
}

main.cpp       

//知识点	IM表示图片
	//读取图像:imread
	//显示图像:imshow
	//色彩空间转换函数(B G R):cvtColor
		//COLOR_BGR2GRAY = 6彩色到灰度
		//COLOR_GRAY2BGR = 8灰度到彩色
		//COLOR_BGR2HSV  = 40BGR到HSV
		//COLOR_HSV2BGR  = 54HSV到BGR
	//保存图片:imwrite(保存路径,内存对象)



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


using namespace std;
using namespace cv;
int main()
{
	//读取进来的数据以矩阵的形势
	Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二个参数代表显示一张灰度图像

																	//看是否是空图片
	if (src.empty())
	{
		printf("图片不存在");
		return -1;
	}
	//创建了一个新窗口:超过屏幕的图像无法显示时候调用此函数
	namedWindow("输入窗口", WINDOW_FREERATIO);					   //参数1表示名称,参数二代表窗口自由显示

	//表示显示在新创建的输入窗口上
	imshow("输入窗口", src);									   //第一个参数表示窗口名称,src表示数据对象Mat 


	//在主函数中调用之前创建的类对象	
	QuickDemo qd;
		//色彩转换
		//qd.colorSpace_Demo(src);

		//图像对象的创建
		//qd.mat_creation_demo(src);

		//图像像素的读写
		//qd.pixel_visit_demo1(src);	//数组
		//qd.pixel_visit_demo2(src);	//指针

		//图像像素的算术操作
		//qd.operators_demo(src);

		//滚动条调整图像亮度
		//qd.tracking_bar_demo1(src);

		//滚动条参数传递(亮度和对比度)
		//qd.tracking_bar_demo2(src);

		//键盘响应
		//qd.key_demo(src);

		//opencv自带颜色操作
		//qd.color_style_demo(src);

		//图像像素的逻辑操作
		//qd.bitwise_demo(src);

		//通道的分离与合并
		//qd.channels_demo(src);

		//图像色彩空间转换
		//qd.inrange_demo(src);

		//图像像素值统计
		//qd.pixel_statistic_demo(src);

		//图像几何形状的绘制
		//qd.drawing_demo(src);

		//随机数与随机颜色
		//qd.random_drawing();

		//多边形填充与绘制
		//qd.polyline_drawing_demo(src);

		//鼠标操作与响应
		//qd.mouse_drawing_demo(src);

		//图像像素类型的转换与归一化
		//qd.norm_demo(src);

		//图像的放缩与差值
		//qd.resize_demo(src);

		//图像的旋转:定义好的
		//qd.flip_demo(src);

		//图像的旋转:自定义
		//qd.rotate_demo(src);

		//视频文件摄像头使用
		//qd.video_demo1(src);

		//视频处理与保存
		//qd.video_demo2(src);

		//图像直方图
		//qd.histogram_demo(src);

		//二维直方图
		//qd.histogram_2d_demo(src);

		//直方图的均衡化
		qd.histogram_eq_demo(src);

	waitKey(0);													   //执行到这句,程序阻塞。参数表示延时时间。单位ms毫秒
	destroyAllWindows();										   //销毁前面创建的显示窗口
	return 0;
}

运行结果       

Opencv4基于C++的 实时人脸监测

Opencv4基于C++的 实时人脸监测

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将布尔参数传递给 SQL Server 存储过程

    我早些时候问过这个问题 我以为我找到了问题所在 但我没有 我在将布尔参数传递给存储过程时遇到问题 这是我的 C 代码 public bool upload false protected void showDate object sende
  • 如果使用 SingleOrDefault() 并在数字列表中搜索不在列表中的数字,如何返回 null?

    使用查询正数列表时SingleOrDefault 当在列表中找不到数字时 如何返回 null 或像 1 这样的自定义值 而不是类型的默认值 在本例中为 0 你可以使用 var first theIntegers Cast
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 使用 libcurl 检查 SFTP 站点上是否存在文件

    我使用 C 和 libcurl 进行 SFTP FTPS 传输 在上传文件之前 我需要检查文件是否存在而不实际下载它 如果该文件不存在 我会遇到以下问题 set up curlhandle for the public private ke
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • (python编程)k-shell的实现

    一 k shell 算法 改错 他发的代码报错 def kshell graph importance dict ks 1 while graph nodes temp node degrees dict for i in graph de
  • python之标准库使用

    目录 一 标准库 二 字符串操作 三 字符串类型 四 时间操作 五 文件基本方法及操作 文件基本方法 文件操作 一 标准库 Python 标准库非常庞大 所提供的组件涉及范围十分广泛 正如以下内容目录所显示的 这个库包含了 Python中的
  • Activiti7 监听器【十四】

    Activiti 7系列文章目录 文章代码下载 Activiti7 工作流设计器 一 Activiti7 创建表 二 Activiti7 表结构介绍 三 Activiti7 设计器创建流程 四 Activiti7 部署流程 五 Activi
  • maven打包出错:Failed to execute goal org.sp

    Failed to execute goal org springframework boot spring boot maven plugin 2 2 13 RELEASE repackage default on project bla
  • 数学建模——数据分析方法

    一 常见数据分析软件 Excel office三件套之一 R语言 Eviews origin 图形分析工具 SPSS 统计分析与数据挖掘 MATLAB 墙裂推荐 python 墙裂推荐 SAS 二 统计性描述 均值 mean x
  • 第一次参加蓝桥杯的心得

    随着我的4道题的答案提交后 蓝桥杯第十届比赛落下帷幕 这其中我也是参赛者 对于这次比赛 虽然我是一位小白 但是我也有不少的感悟 因为这一次也是我从小到大参加的第一次大型竞赛 所以我做了以下的总结 这次的比赛是在长沙理工大学比赛 所以对于我来
  • Swin-Unet:Swin Transformer在医学分割上的首次尝试

    Swin Unet Swin Transformer在医学分割上的首次尝试 前言 最近小编主要在搞一些医学图像分割的工作 也跑了一下Swin Unet 之前看到也看到过这篇Swin Unet 其实五月份就看到了hhhh 决定搬运过来 实际上
  • 前端报错500

    后台代码错误无法返回值 检查后台代码
  • log4j:WARN No appenders could be found for logger 的解决方法

    一 SSH在使用Log4j进行日志管理时常会遇到这个异常 log4j WARN No appenders could be found for logger org springframework web context ContextLo
  • STM32F103使用硬件IIC驱动SHT30温湿度传感器

    文章目录 前言 一 SHT30温湿度传感器原理图 二 代码部分 1 SHT30 c文件 2 SHT30 h文件 总结 前言 SHT30是一种常见的温湿度传感器 该传感器广泛应用于各种场景 小米的温湿度传感器就是使用的SHT30 本文是已硬件
  • java Consumer接口与示例

    目录 一 consumer使用 示例代码1 示例代码2 示例代码3 示例代码4 二 BiConsumer使用 示例代码一 示例代码二 三 其他和Consumer相关的接口 Java 8 中的 Consumer 是一个函数接口 它可以接受一个
  • opc matlab gui,OPC Server/Client Demo

    Hi thanks a lot for posting this app I m a student and my assignment is to create a simple OPC client server application
  • 牛顿法/递归法实现开方的函数功能

    Filename sqrt method cpp Description Version 1 0 Created 12 27 2016 03 15 18 PM Revision none Compiler gcc Author YOUR N
  • 英语口语413之每日二十个英语单词

    2020 09 01每日二十个英语单词 synchronization 同步化 synchronization multiprocessor 多处理器同步化 synchronized multimedia integration langu
  • buctoj-python 2022.6.19

    A 对指定r计算圆的面积 题目描述 编写函数getCircleArea 对给定的参数r计算圆的面积 并返回 首先读入n n gt 0 然后依次读入n个半径r1 r2 rn 以这些半径为参数依次调用getCircleArea函数 得到对应圆的
  • 管理员权限运行批处理的几种方法

    废话不说 解决win7运行批处理出错不能注册dll等问题 1 在批处理的第一行加入 cd d dp0 然后在批处理上右键选择使用管理员权限运行 2 右键任务栏 选择资源管理器 进程选项卡 显示所有用户的进程 结束explorer 文件 新建
  • HJ59 找出字符串中第一个只出现一次的字符

    描述 找出字符串中第一个只出现一次的字符 数据范围 输入的字符串长度满足 1 le n le 1000 1 n 1000 输入描述 输入一个非空字符串 输出描述 输出第一个只出现一次的字符 如果不存在输出 1 示例1 输入 asdfasdf
  • linux下查看文件大小:ls或du

    方法1 ls lh 参数解释 l 除文件名称外 亦将文件型态 权限 拥有者 文件大小等资讯详细列出 h human readable 与 l 一起 以易于阅读的格式输出文件大小 例如 1K 234M 2G t 文件显示以修改时间排序 最新修
  • Android 中的CreatePackageContext()

    http blog csdn net wangbole article details 22876179 java view plain copy print Return a new Context object for the give
  • Opencv4基于C++基础入门笔记:图像 颜色 事件响应 图形 视频 直方图

    效果图 opencv人脸识别效果图 请叫我真爱粉 先看一下效果图勾起你的兴趣 文章目录 一 环境配置搭建 二 图像 1 图像读取与显示 main cpp 运行结果 2 图像色彩空间转换 2 1 换色彩 test h test cpp mai