opencv4.0学习笔记

Posted 卡拉肖克-X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv4.0学习笔记相关的知识,希望对你有一定的参考价值。

目录

课程来源:哔哩哔哩大学.

第一节课

显示第一张图片

环境配置了一个早上,到10.48分配置完毕,有点难受。还好最后显示出第一张图片。

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

using namespace std;
using namespace cv;
int main() 
{

	Mat src = imread("D:/images/011.jpg",IMREAD_GRAYSCALE);//读取进来的数据以矩阵的形势,第二个参数代表显示一张灰度图像。
	if (src.empty()) 
	{
		printf("could not load image");//如果图片不存在 将无法读取,打印到终端。
	}
	//超过屏幕的图像无法显示时候调用此函数。
	namedWindow("输入窗口", WINDOW_FREERATIO);//创建了一个新窗口,参数1表示名称,第二个参数代表一个自由的比例
	imshow("输入窗口", src);//表示显示在新创建的输入窗口上,第一个参数表示窗口名称,src表示数据对象Mat 
	waitKey(0);//执行到这句,程序阻塞。参数表示延时时间。单位ms
	destroyAllWindows();//销毁前面创建的显示窗口
	return 0;
}

第一节课小结

第一节课介绍了如何读取第一张图片,并且显示出来,通过调用imread函数读取照片,再调用imshow显示图片到窗口。同时,讲述了如何打印灰度图像,图片读取失败的处理方式,代码注释详细介绍了每条语句的意思。

第二节课

显示第一张图片

1、色彩空间转换函数 cvtColor
2、图像的保存

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

class QuickDemo //创建一个QuickDemo对象
{
	public:
		void colorSpace_Demo(Mat &imge); //定义一个类,里面包含输入一个图片,对图片操作
};

#include<quickopencv.h>
void QuickDemo::colorSpace_Demo(Mat &image)
{
	Mat gray, hsv;//定义2个矩阵类的图像gray和hsv,
	cvtColor(image,hsv,COLOR_BGR2HSV);//图像转换函数,可以把image转成hsv,第三个参数是转成的类型
	cvtColor(image,gray,COLOR_BGR2GRAY);//图像转换函数,可以把image转成hsv,第三个参数是转成的类型
	imshow("HSV",hsv);
	imshow("灰度",gray);
	imwrite("D:/hsv.jpg",hsv);//保存图片,前面是保存图的地址,后面是保存图的名称
	imwrite("D:/gray.jpg",gray);
}

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

using namespace std;
using namespace cv;
int main() 
{

	Mat src = imread("D:/images/1.jpg",IMREAD_ANYCOLOR);//B,G,R实际上0-255三色。3通道
	//读取进来的数据以矩阵的形势,第二个参数代表显示一张灰度图像。
	if (src.empty()) 
	{
		printf("could not load image");//如果图片不存在 将无法读取,打印到终端。
		return -1;
	}
	//超过屏幕的图像无法显示时候调用此函数。
	
	namedWindow("输入窗口", WINDOW_FREERATIO);//创建了一个新窗口,参数1表示名称,第二个参数代表一个自由的比例
	imshow("输入窗口", src);//表示显示在新创建的输入窗口上,第一个参数表示窗口名称,src表示数据对象Mat 
//在主函数中调用之前创建的类对象	
	QuickDemo qd;
	qd.colorSpace_Demo(src);

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

第二节课小结

这节主要介绍了创建一个类对象,然后通过类对象调用函数,在main主函数中进行调用实现类对象中的功能,比如转换成HSV类型图片和GRAY类型图片,最后通过imwrite函数进行图像的保存。

第三节课

图像对象的创建与赋值

1、怎么操作mat
2、怎么访问每一个像素点
3、怎么创建一个空图或者mat

void QuickDemo::mat_creation_demo(Mat &image) 
{
	Mat m1, m2;
	m1 = image.clone();
	image.copyTo(m2);

	//创建空白图像
	Mat m3 = Mat::ones(Size(400, 400), CV_8UC3);//创建8*8的CV8位的无符号的n通道的unsigned char
	//ones&zeros是初始化的方法
	m3 = Scalar(255, 0, 0);//给三个通道都赋值127  ,单通道赋值方法 m3 = 127;
	//m3初始为蓝色
	//数据的宽度和长度是由通道数决定的。
	//std::cout << "width:"<<m3.cols<<"height"<< m3.rows <<"channels"<<m3.channels()<< std::endl;
	//用来查看宽度,高度与通道数。
	/*std::cout << m3 << std::endl;*/
	Mat m4 = m3.clone();//赋值M4就是M3 M4改变了,M3也改变了,没有产生新的自我(M4与M3同体)
	//M4为M3的克隆,M3还是原来的颜色,不会改变。(M4与M3不同体,各自是各自的颜色)
	//m3.copyTo(m4);//把M3赋值给M4,M4就是蓝色
	m4 = Scalar(0, 255, 255);//改变m4的颜色为黄色 ,m4也改变
	imshow("图像3", m3);//标题和图像名称   显示图像m3 纯蓝色
	imshow("图像4", m4);//标题和图像名称
}

第三节课小结

本节课介绍了如何创建一个Mat对象,通过创建新的Mat对象来创建用户的特定的底色画布,创建图像的基本类型有两种一种是ones一种是zeros,ones()中的第一个参数代表图像的大小,第二个参数代表创建几维的图像,UC代表无符号字符型,数组3代表通道数。克隆和赋值的区别,克隆就是产生一个新的对象,新对象改变属性,旧对象属性不变(各自为政)。赋值是二者同体,当新属性发生改变,旧属性也发生改变(二者同体)。

第四节课

图像像素的读写操作

如何遍历和修改每个像素点的数值,分为单通道和多通道。访问模式模式也有两种。第一种是数组访问模式,用最常规的数组下标访问像素值。

void QuickDemo::pixel_visit_demo(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_demo(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);
	
}

第四节课小结

本节主要介绍了通过两种遍历的方式访问图像的像素值,并且改变图像的像素值。

第五节课

图像像素的操作

对图像的各个像素点实现加减乘除的操作。介绍了常用的除爆函数saturate_cast,防止数值过界。

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);
	m = Scalar(50, 50, 50);
	multiply(image,m,dst);//乘法操作 api
	imshow("乘法操作", dst);
	add(image, m, dst);//加法操作 api
	imshow("加法操作", dst);
	subtract(image, m, dst);//减法操作 api
	imshow("减法操作", dst);
	divide(image, m, dst);//除法操作 api
	namedWindow("加法操作", WINDOW_FREERATIO);
	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);
}

第五节课小结

介绍了四种不同的API实现,并且演示了一种加法的算法。

第六节课

滚动条演示操作-调整图片亮度

本节介绍怎么通过createTrackbar来设置一个进度条,实现图片的亮度调节。

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);
}

第七节课

滚动条演示操作-传递参数

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_demo(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);
}

第七节课小结

第八节课

键盘响应操作

本节介绍通过键盘输入,终端能够读取响应的信息。

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 <<"you enter key #1" << std::endl;
			cvtColor(image, dst, COLOR_BGR2GRAY);
		}
		if (c == 50)//key#1
		{
			std::cout << "you enter key #2"  << std::endl;
			cvtColor(image, dst, COLOR_BGR2HSV);
		}
		if (c == 51)//key#1
		{
			std::cout << "you enter key #3" << std::endl;
			dst = Scalar(50, 50, 50);
			add(image,dst,dst);
		}
		imshow("键盘响应",dst);
		std::cout << c << std::endl;
	}
}

第八节课小结

通过键盘输入,在终端得到响应,输入不同的键值,得到不一样的结果。

第九节课

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,
		COLORM

以上是关于opencv4.0学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV4系统化学习路线图与教程

OpenCV4最全系统化学习路线图与教程!

学习笔记:python3,代码片段(2017)

OpenCV4.0正式发布 | 谷歌发布大型机器学习数据集

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等(代码片段

机器学习手册OPENCV基础操作