全文目录
-
- 1.图片的读取与显示
- 2.图像色彩空间转换
- 3.图像的创建与复制
- 4.图像像素的读写操作
- 5.图像像素的基本操作
- 6.滚动条演示图像 TrackBar
- 7.滚动条操作之二,参数传递 调整亮度和对比度
- 8.键盘响应操作 — 按不同键实现图片的转换
- 9.opencv自带颜色表操作
- 10.图像像素的逻辑操作
- 11.通道分离与合并
- 12.图像色彩空间转换 —— 抠图 —— 将图像空间转换到HSV,提取颜色
- 13. 图像像素值统计 —— 均值、方差
- 14.图像的几何图像绘制
- 15.随机数与随机函数
- 16.多边形填充与绘制
- 17.鼠标操作与响应
- 18.图像像素的类型转换与归一化
- 19.图像的放缩与插值
- 20.图像翻转 flip(imput src, output dst, flipCode)
- 21.图像旋转 —— 计算新画布大小,计算偏移量
- 22.视频摄像头文件使用
- 23.视频处理与保存
- 24.图像直方图:颜色直方图、灰度直方图——可以快速统计图像特征
- 25.图像卷积操作
- 26. 高斯模糊
- 27.opencv实现人脸检测
1.图片的读取与显示
- 描述
- imread-读取图像
- 读取的图像均为Mat数据
- 参数(地址,加载图片的模式) 模式——彩色、灰度、透明通道、浮点加载
- 有时候通过上述函数显示的图片过大,所以要进行下面的操作
nameWindow("输入窗口", WINDOW_FREERATIO)
——自动将图像调整,并完整的显示出来
- imshow-显示图像
- 窗口名称,待显示对象
- waitkey(0) 程序运行到该位置阻塞,图像一直显示
- waitkey(1) 图像显示1ms,之后消失
- destroyAllWindows() 销毁所有窗口
- imread-读取图像
2.图像色彩空间转换
- 色彩空间转换函数—cvtColor
- cvtColor(image, hsv, COLOR_BGR2HSV) 从BGR转换到HSV
- H 0~180 S,V 0·255 取值
- H:色调,S:饱和度,V:亮度
- 如果对图片的亮度进行调节,那么先进入HSV空间,之后对V通道进行调节即可。
- cvtColor(image, gray, COLOR_BGR2GRAY) 从BGR转换到GRAY
- cvtColor(image, hsv, COLOR_BGR2HSV) 从BGR转换到HSV
- 图像保存—imwrite
- imwrite(保存路径,保存的图片Mat)
3.图像的创建与复制
-
两种图像的创建方式
-
Mat m1 = Mat::zeros(Size(8,8), CV_8UC1)
- 创建了8*8的空白(全0)图像,该图像的数据类型为uchar,1通道
-
Mat m2 = Mat::ones(Size(8,8), CV_8UC3)
-
创建了8*8的图像(其中只有第一通道全为1,其余通道为0),该图像的数据类型为uchar,3通道
-
每一个位置有三个数值,并且排列在一起
-
若想将剩余的位置填入数值,可以使用
m2 = Scalar(127, 127, 127)
,此时m2为:
-
-
-
图像的赋值
-
浅复制
Mat m1; m1 = Scalar(0, 0, 255); //红色 Mat m2 = m1; m2 = Scalar(0, 255, 255); //黄色,此时m1也变为黄色
-
深复制
Mat m1; m1 = Scalar(0, 0, 255); //红色 Mat m2 = m1.clone(); //等价于m1.copyTo(m2); m2 = Scalar(0, 255, 255); //黄色,此时m1仍为红色;
-
4.图像像素的读写操作
-
图像遍历之指针
-
图像在(row, col)处的像素值
image.at<uchar>(row, col)
— uchar代表数据类型- 利用指针遍历
uchar* current_row = image.ptr<uchar>(row)
— 代表图像第row行的地址- *current_row代表取第row行首元素的值
- *current_row++代表取第row行首元素的值,之后地址+1
image.ptr<uchar>(row, col)
— 错误,只能写到行
Mat image; for(int row = 0; row < rows; row++) { uchar* current_row = image.ptr<uchar>(row); for(int col = 0; col < cols; col++) { if(image.channels() == 1) { int pv = *current_row; *current_row++ = 255 - pv; } if(image.channels() == 3) { *current_row++ = 255 - *current_row; *current_row++ = 255 - *current_row; *current_row++ = 255 - *current_row; } } }
- 利用指针遍历
-
-
图像遍历之数组
-
当通道为3时,提取某个位置的数据时,该数据类型为:Vec3b
Mat image; for(int row = 0; row < rows; row++) { for(int col = 0; col < cols; col++) { if(image.channels() == 1) { int pv = image.at<uchar>(row, col); image.at<uchar>(row, col) = 255 - pv; } if(image.channels() == 3) { Vec3b bgr = image.at<Vec3b>(roe, col); 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]; } } }
-