OpenCV4快速入门
- 001-图像读取与显示
- quickDemo类的定义(头文件)
- quickDemo类的函数实现
-
- 002-色彩空间变换(cvtColor)
- 003-图像对象的创建与赋值(m2=m1,clone,copyto)
- 004-图像像素的读写操作(image.at(row, col),image.at(row, col)[0])
- 005-图像像素的算术操作(+,-,multiply,divide)
- 006-trackbar滚动条操作演示-调整图像亮度(add,subtract)
- 007-trackbar滚动条操作演示-参数传递与调整亮度与对比度(addWeighted)
- 008-键盘响应操作(waitKey)
- 009-opencv自带颜色表操作(applyColorMap)
- 010-图像像素的逻辑操作(位操作,与、或、非)
- 011-通道分离与合并(split,merge)
- 012-图像色彩空间转换-变换背景(cvtColor,inRange)
- 013-图像像素值统计(minMaxLoc,meanStdDev)
- 014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect)
- 015-随机数与随机颜色
- 016-多边形填充与绘制(fillPoly,polylines,drawContours)
- 017-鼠标操作与响应(setMouseCallback)
- 018-图像像素类型转换与归一化(convertTo,normalize)
- 019-图像缩放与插值(resize)
- 020-图像翻转(flip)
- 021-图像旋转(getRotationMatrix2D,warpAffine)
- 022-视频文件摄像头使用(VideoCapture capture)
- 023-视频处理与保存-帧宽高(capture.get)
- 024-图像直方图-绘制直方图(calcHist,normalize,line)
- 025-二维直方图(calcHist,minMaxLoc)
- 026 - 直方图均衡化(equalizeHist)
- 027-图像卷积操作-均值模糊(blur)
- 028-高斯模糊(GaussianBlur)
- 029-高斯双边模糊(bilateralFilter)
- 030-案例:实时人脸检测(采用dnn模块)
- 主程序调用类
001-图像读取与显示
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(){
Mat src = imread(“G:/OpenCV/opencv笔记所用图片/bandian.jpg”,1); //默认加载彩色图像,0表示GRAY灰度图,1为BGR彩色图,-1表示加载原图(可能是其他类型如HSV等其他空间)
if (src.empty()){
cout << "could not load image..." << endl;
getchar();
return -1;
}
//当我们读取图片太大时,看不到全局,使用窗口函数可以设置大小
namedWindow("input", WINDOW_AUTOSIZE); //WINDOW_FREERATIO参数可以调整窗口大小。默认图像为WINDOW_AUTOSIZE显示原图,不能调整大小。
imshow("input", src); //若无namedWindow,只有imshow,显示的图像窗口与图片一样大,无法调整窗口大小
//imshow只能显示8位和浮点型的
waitKey(0); //opencv自带阻塞函数,0表示一直阻塞,1表示延迟1毫秒后执行下一步
destroyAllWindows(); //结束程序前将所有窗口销毁
return 0;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
quickDemo类的定义(头文件)
quickDemo.h
#pragma once
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
class quickDemo
{
public:
void colorSpace_Demo(Mat &image); //002-色彩空间变换(cvtColor)
void mat_creation_demo(Mat &image); //003-图像对象的创建与赋值(m2=m1,clone,copyto)
void pixel_visit_demo(Mat &image); //004-图像像素的读写操作(image.at<uchar>(row, col),image.at<Vec3b>(row, col)[0])
void operators_demo(Mat &image); //005-图像像素的算术操作(+,-,multiply,divide)
void trackbar_demo(Mat &image); //006-trackbar滚动条操作演示-调整图像亮度(add,subtract)
void trackbar_demo2(Mat &image); //007-trackbar滚动条操作演示-参数传递与调整亮度与对比度(addWeighted)
void key_demo(Mat &image); //008-键盘响应操作(waitKey)
void color_style_demo(Mat &image); //009-opencv自带颜色表操作(applyColorMap)
void bitwise_demo(Mat &image); //010-图像像素的逻辑操作(位操作,与、或、非)
void channels_demo(Mat &image); //011-通道分离与合并(split,merge)
void inrange_demo(Mat &image); //012-图像色彩空间转换-变换背景(cvtColor,inRange)
void pixel_static_demo(Mat &image); //013-图像像素值统计(minMaxLoc,meanStdDev)
void drawing_demo(Mat &image); //014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect)
void random_drawing_demo(); //015-随机数与随机颜色
void polyline_drawing_demo(); //016-多边形填充与绘制(fillPoly,polylines,drawContours)
void mouse_drawing_demo(Mat &image); //017-鼠标操作与响应(setMouseCallback)
void norm_demo(Mat &image); //018-图像像素类型转换与归一化(convertTo,normalize)
void resize_demo(Mat &image); //019-图像缩放与插值(resize)
void flip_demo(Mat &image); //020-图像翻转(flip)
void rotate_demo(Mat &image); //021-图像旋转(getRotationMatrix2D,warpAffine)
void video_demo(Mat &image); //022-视频文件摄像头使用(VideoCapture capture)
void video_demo2(Mat &image); //023-视频处理与保存-帧宽高(capture.get)
void showHistogram(Mat &image); //024-图像直方图-绘制直方图(calcHist,normalize,line)
void histogram_2d_demo(Mat &image); //025-二维直方图(calcHist,minMaxLoc)
void histogram_eq_demo(Mat &image); //026 - 直方图均衡化(equalizeHist)
void blur_demo(Mat &image); //027-图像卷积操作-均值模糊(blur)
void gaussian_blur_demo(Mat &image); //028-高斯模糊(GaussianBlur)
void bifilter_demo(Mat &image); //029-高斯双边模糊(bilateralFilter)
void face_detection_demo(); //030-案例:实时人脸检测(采用dnn模块)
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
quickDemo类的函数实现
quickDemo.cpp
#include "quickDemo.h"
#include <opencv2/dnn.hpp> //要使用dnn模块需要引入此头文件
- 1
- 2
002-色彩空间变换(cvtColor)
//002-色彩空间变换
void quickDemo::colorSpace_Demo(Mat &image){
if (image.channels()==3)
{
Mat gray, hsv;
cvtColor(image, hsv, COLOR_BGR2HSV); //可在hsv空间调节亮度通道,再变回BGR空间
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("HSV", hsv);
imshow("gray image", gray);
imwrite("G:/OpenCV/opencv笔记所用图片/gray.jpg", gray);
imwrite("G:/OpenCV/opencv笔记所用图片/hsv.jpg", hsv);
}else if (image.channels()==1)
{
return;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
003-图像对象的创建与赋值(m2=m1,clone,copyto)
//003-图像对象的创建与赋值 void quickDemo::mat_creation_demo(Mat &image){
Mat m1<span class="token punctuation">,</span> m2<span class="token punctuation">;</span> m1 <span class="token operator">=</span> image<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> image<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>m2<span class="token punctuation">)</span><span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"m1.size :"</span><span class="token operator"><<</span>m1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">//创建空白图像</span> Mat m3 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span><span class="token function">Size</span><span class="token punctuation">(</span><span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">CV_8UC3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建一个8行8列的,CV_8UC1(单通道无符号整型空白图像).CV_8UC3(三通道的)</span> cout <span class="token operator"><<</span> m3 <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">//将数组打印出来</span> m3 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">127</span><span class="token punctuation">,</span> <span class="token number">127</span><span class="token punctuation">,</span> <span class="token number">127</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//可以使用此方式给每个通道赋值</span> <span class="token comment">//cout << m3 << endl; //将数组打印出来</span> cout <span class="token operator"><<</span> <span class="token string">"width:"</span><span class="token operator"><<</span>m3<span class="token punctuation">.</span>cols<span class="token operator"><<</span><span class="token string">",height:"</span><span class="token operator"><<</span>m3<span class="token punctuation">.</span>rows<span class="token operator"><<</span><span class="token string">",channels:"</span><span class="token operator"><<</span>m3<span class="token punctuation">.</span><span class="token function">channels</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"创建的图像"</span><span class="token punctuation">,</span>m3<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//因为值都为127,故应是一张全部灰色的图像</span> m3 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//可以使用此方式给每个通道赋值</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"创建的图像2"</span><span class="token punctuation">,</span> m3<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//因为值(255,0,0)(B,G,R),故应是蓝色图像</span> <span class="token comment">//Mat m3 = Mat::zeros(Size(8, 8), CV_8UC1); //此时创建的图像的值初始化为1(当为单通道时全部是1,但3通道不同)</span> <span class="token comment">//cout << m3 << endl;</span> <span class="token comment">//Mat m3 = Mat::zeros(Size(8, 8), CV_8UC3); //只有在3通道的第1个通道为1,其余为0</span> <span class="token comment">//cout << m3 << endl;</span> <span class="token comment">//当我们使用mat给另外的对象赋值时,相当于将指针重新赋给了另一个对象如下</span> <span class="token comment">// Mat image2 = image1;</span> <span class="token comment">//当我们修改 image2的值时,也会影响到image1的值,image2就等同于image1.</span> <span class="token comment">// 而使用clone或者copyto时,才将image1的数据完全的复制出来给image2,而不是给指针。</span> <span class="token comment">// Mat image2 = image1.clone();</span> <span class="token comment">//当我们修改 image2的值时,不会影响到image1的值,只会修改 image2的值。</span> <span class="token comment">//创建空白图像</span> Mat m4 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span><span class="token function">Size</span><span class="token punctuation">(</span><span class="token number">400</span><span class="token punctuation">,</span> <span class="token number">400</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">CV_8UC3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> m4 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像m4"</span><span class="token punctuation">,</span> m4<span class="token punctuation">)</span><span class="token punctuation">;</span> Mat m5<span class="token punctuation">;</span> m5 <span class="token operator">=</span> m4<span class="token punctuation">;</span> m5 <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处修改m5的值也会修改m4的值,使用clone或者copyto就不会改变</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像m4(m5 = m4)"</span><span class="token punctuation">,</span> m4<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像m5"</span><span class="token punctuation">,</span> m5<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//下面这种方式一般在定义卷积核中使用较广</span> Mat kernel <span class="token operator">=</span> <span class="token punctuation">(</span>Mat_<span class="token operator"><</span>char<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
004-图像像素的读写操作(image.at(row, col),image.at(row, col)[0])
//004-图像像素的读写操作 void quickDemo::pixel_visit_demo(Mat &image){ int w = image.cols; //获取列数 int h = image.rows; //获取行数 int dims = image.channels(); //获取通道数
<span class="token comment">当通道数不同时,遍历像素的方式也不同(使用数组的方式读取像素)</span> <span class="token comment">//for (int row = 0; row < h; row++){<!-- --></span> <span class="token comment">// for (int col = 0; col < w; col++){<!-- --></span> <span class="token comment">// if (dims == 1){ //单通道的遍历方式</span> <span class="token comment">// int pv = image.at<uchar>(row, col); //将图像row行col列的值赋值给pv</span> <span class="token comment">// //以下操作具有将图像反差化的功能</span> <span class="token comment">// image.at<uchar>(row, col) = 255 - pv; //将255-pv的值重新赋给image图像,image图像中的值就被改变了</span> <span class="token comment">// }</span> <span class="token comment">// else if (dims == 3){ //三通道的遍历方式</span> <span class="token comment">// Vec3b bgr = image.at<Vec3b>(row, col); //此时一次性的将三通道的值都获取了</span> <span class="token comment">// //以下操作具有将图像反差化的功能</span> <span class="token comment">// image.at<Vec3b>(row, col)[0] = 255 - bgr[0];</span> <span class="token comment">// image.at<Vec3b>(row, col)[1] = 255 - bgr[1];</span> <span class="token comment">// image.at<Vec3b>(row, col)[2] = 255 - bgr[2];</span> <span class="token comment">// }</span> <span class="token comment">// }</span> <span class="token comment">//}</span> <span class="token comment">//当通道数不同时,遍历像素的方式也不同(使用指针的方式读取像素,以下功能相当于上面的功能)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>int row <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> row <span class="token operator"><</span> h<span class="token punctuation">;</span> row<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> uchar<span class="token operator">*</span> current_row <span class="token operator">=</span> image<span class="token punctuation">.</span>ptr<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//得到当前行的指针</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>int col <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> col <span class="token operator"><</span> w<span class="token punctuation">;</span> col<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//单通道的遍历方式</span> int pv <span class="token operator">=</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span> <span class="token comment">//将图像row行[0]列的值赋值给pv</span> <span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> pv<span class="token punctuation">;</span> <span class="token comment">//将255-pv的值重新赋给图像row行[0]列,从此开始,指针自加,即列自加,变为[row][1],[row][2]...</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//三通道的遍历方式</span> <span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span> <span class="token comment">//此处应为当前列的的第【0】个通道</span> <span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span> <span class="token comment">//此处的*current_row不是上方的*current_row,应是当前列的的第【1】个通道</span> <span class="token operator">*</span>current_row<span class="token operator">++</span> <span class="token operator">=</span> <span class="token number">255</span> <span class="token operator">-</span> <span class="token operator">*</span>current_row<span class="token punctuation">;</span> <span class="token comment">//此处的*current_row不是上方的*current_row,应是当前列的的第【2】个通道</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"像素读写演示"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
005-图像像素的算术操作(+,-,multiply,divide)
//005-图像像素的算术操作 void quickDemo::operators_demo(Mat &image){ Mat dst; dst = image + Scalar(50, 50, 50); //每个通道加50,图像会变亮 imshow("加法操作", dst); dst = image - Scalar(50, 50, 50); //每个通道-50,图像会变暗 imshow("减法操作", dst);
Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建一个和image大小相同,类型相同,值为0的图片</span> m <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> dst <span class="token operator">=</span> image <span class="token operator">/</span>m<span class="token punctuation">;</span> <span class="token comment">//两张大小、类型相同的图片除法操作</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"除法操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//使用opencv自带的api函数进行加减乘除操作</span> <span class="token comment">//两张大小、类型相同的图片乘法操作不能使用(dst = image *m;),会报错 </span> <span class="token function">multiply</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//使用multiply可以实现两图像的乘法运算</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"multiply操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">add</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//使用add可以实现两图像的加法运算</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"add操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">subtract</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//使用subtract可以实现两图像的减法运算</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"subtract操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">divide</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> m<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//使用divide可以实现两图像的除法运算</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"divide操作"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//通过对图像像素点的操作实现算术运算</span> <span class="token comment">//当通道数不同时,遍历像素的方式也不同(使用数组的方式读取像素)</span> Mat dst2 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span>image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建一个背景图像</span> int w <span class="token operator">=</span> image<span class="token punctuation">.</span>cols<span class="token punctuation">;</span> <span class="token comment">//获取列数</span> int h <span class="token operator">=</span> image<span class="token punctuation">.</span>rows<span class="token punctuation">;</span> <span class="token comment">//获取行数</span> int dims <span class="token operator">=</span> image<span class="token punctuation">.</span><span class="token function">channels</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取通道数</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>int row <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> row <span class="token operator"><</span> h<span class="token punctuation">;</span> row<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">for</span> <span class="token punctuation">(</span>int col <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> col <span class="token operator"><</span> w<span class="token punctuation">;</span> col<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//单通道的遍历方式</span> int p1 <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将图像row行col列的值赋值给p1</span> int p2 <span class="token operator">=</span> m<span class="token punctuation">.</span>at<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//以下操作具有将图像反差化的功能</span> dst2<span class="token punctuation">.</span>at<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span> <span class="token operator">=</span> saturate_cast<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span> p1 <span class="token operator">+</span> p2<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将p1和p2的像素点相加赋值给dst2图像(当前行列)</span> <span class="token comment">//saturate_cast<uchar>(p1 + p2)可以将p1和p2相加得到的值限制在0~255之间,防止值超过此区间</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dims <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//三通道的遍历方式</span> Vec3b p1 <span class="token operator">=</span> image<span class="token punctuation">.</span>at<span class="token operator"><</span>Vec3b<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//image的像素点赋值给p1(当前行列)</span> Vec3b p2 <span class="token operator">=</span> m<span class="token punctuation">.</span>at<span class="token operator"><</span>Vec3b<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//m的像素点赋值给p2(当前行列)</span> <span class="token comment">//将p1和p2的像素点相加赋值给dst2图像(当前行列)</span> dst2<span class="token punctuation">.</span>at<span class="token operator"><</span>Vec3b<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> saturate_cast<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>p1<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">+</span> p2<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> dst2<span class="token punctuation">.</span>at<span class="token operator"><</span>Vec3b<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> saturate_cast<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>p1<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">+</span> p2<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> dst2<span class="token punctuation">.</span>at<span class="token operator"><</span>Vec3b<span class="token operator">></span><span class="token punctuation">(</span>row<span class="token punctuation">,</span> col<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> saturate_cast<span class="token operator"><</span>uchar<span class="token operator">></span><span class="token punctuation">(</span>p1<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">+</span> p2<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"自定义像素点相加"</span><span class="token punctuation">,</span> dst2<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
006-trackbar滚动条操作演示-调整图像亮度(add,subtract)
//006-create-trackbar("Value Bar")的回调函数(此处使用add等算术操作函数调整亮度)
Mat src; //此处使用全局变量来传递数据src到回调函数中(也可以使用void*来在参数中传递数据)
static void on_track(int lightness, void *userdata){
Mat m = Mat::zeros(src.size(), src.type()); //创建背景图像
m = Scalar(lightness, lightness, lightness); //给此图像赋值
Mat dst;
add(src, m, dst); //两图像相加并输出dst
//subtract(src, m, dst); //两图像相减并输出dst
imshow("亮度调整", dst); //显示在窗口上
}
//006-trackbar滚动条操作演示-调整图像亮度
void quickDemo::trackbar_demo(Mat &image){
namedWindow(“亮度调整”, WINDOW_AUTOSIZE);
int maxValue = 255;
int lightness = 50;
src = image;
createTrackbar(“Value Bar”, “亮度调整”, &lightness, maxValue,on_track); //创建亮度调整的滑动条
//参数1:滑动条名称,参数2:窗口名称,参数3:滑动条初始值,参数4:滑动条最大范围,参数5:回调函数,参数6:传递数据(万能指针)
<span class="token function">on_track</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token operator">&</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//调用一次回调函数,令初始时就有显示(可以不调用),</span>
<span class="token comment">//此处应注意,第二个参数在上面传递数据时不能为0,若初始化时指针为0,就会报错(空指针在传递数据时不要存在)</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
007-trackbar滚动条操作演示-参数传递与调整亮度与对比度(addWeighted)
//007-create-trackbar("Value Bar")的回调函数(此处使用addWeighted调整亮度) static void on_track2_1(int lightness, void *image){ Mat src = *(Mat*)image; //(Mat*)image将指针image强转Mat类型的,再使用*将里面的值取出,又是赋值操作,此时src就是image //此处使用的是createbar自带的传递数据功能,也可以使用全局变量来传递数据
Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> src<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建背景图像</span> m <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span>lightness<span class="token punctuation">,</span> lightness<span class="token punctuation">,</span> lightness<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//给此图像赋值</span> Mat dst<span class="token punctuation">;</span> <span class="token function">addWeighted</span><span class="token punctuation">(</span>src<span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">,</span> m<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> lightness<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//两张图以一定的权重相加(src*1+m*0+lightness),此处m图像无用,只对src图像进行加法操作</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"亮度与对比度调整"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//显示在窗口上</span>
}
//007-create-trackbar(“Value Bar”)的回调函数(此处使用addWeighted调整对比度)
static void on_track2_2(int contrast_value, void image){
Mat src = (Mat)image; //(Mat)image将指针image强转Mat类型的,再使用*将里面的值取出,又是赋值操作,此时src就是image
//此处使用的是createbar自带的传递数据功能,也可以使用全局变量来传递数据
Mat m <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>src<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> src<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建背景图像</span>
Mat dst<span class="token punctuation">;</span>
<span class="token function">addWeighted</span><span class="token punctuation">(</span>src<span class="token punctuation">,</span> contrast_value<span class="token punctuation">,</span> m<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//两张图以一定的权重相加(src*contrast_value+m*0+0),此处m图像无用,只对src图像进行乘法运算,增加其对比度</span>
<span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"亮度与对比度调整"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//显示在窗口上</span>
}
//007-trackbar滚动条操作演示-参数传递与调整亮度与对比度
void quickDemo::trackbar_demo2(Mat &image){
namedWindow(“亮度与对比度调整”, WINDOW_AUTOSIZE);
int maxValue = 255;
int lightness = 50;
createTrackbar(“Value Bar”, “亮度与对比度调整”, &lightness, maxValue, on_track2_1, &image); //创建亮度调整的滑动条
//参数1:滑动条名称,参数2:窗口名称,参数3:滑动条初始值,参数4:滑动条最大范围,参数5:回调函数,参数6:传递数据(万能指针)
int contrast_value <span class="token operator">=</span> <span class="token number">1.2</span><span class="token punctuation">;</span>
<span class="token function">createTrackbar</span><span class="token punctuation">(</span><span class="token string">"Contrast Bar"</span><span class="token punctuation">,</span> <span class="token string">"亮度与对比度调整"</span><span class="token punctuation">,</span> <span class="token operator">&</span>contrast_value<span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> on_track2_2<span class="token punctuation">,</span> <span class="token operator">&</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//创建对比度调整的滑动条</span>
<span class="token function">on_track2_1</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token operator">&</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//调用一次回调函数,令初始时就有显示(可以不调用),此处应注意,第二个参数在上面传递数据时不能为0,若初始化时指针为0,就会报错(空指针在传递数据时不要存在)</span>
<span class="token comment">//on_track2_2(50, &image); </span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
008-键盘响应操作(waitKey)
//008-键盘响应操作 void quickDemo::key_demo(Mat &image){ Mat dst=Mat::zeros(image.size(),image.type()); while (true){ //在此循环不断监听键盘操作 char c = waitKey(100); //停顿100毫秒,waitKey(100)返回值为100毫秒内键盘按键的ASCII码值。 //cout << c << endl; //输出waitekey接收到的键值
<span class="token comment">//在此无限循环中加入退出机制(按esc退出循环)</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>int<span class="token punctuation">)</span>c <span class="token operator">==</span> <span class="token number">27</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//此处将c类型强转,或者int c = waitKey(100)</span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token comment">//27为退出键esc的数值</span> <span class="token punctuation">}</span> <span class="token comment">//判断输入键值,进行一定操作</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>int<span class="token punctuation">)</span>c <span class="token operator">==</span> <span class="token number">49</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//判断当按下为1时,或者不强转直接c=='1'</span> cout <span class="token operator"><<</span> <span class="token string">"you enter key #"</span><span class="token operator"><<</span>c <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token function">cvtColor</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">COLOR_BGR2GRAY</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将其变为灰度图像</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>int<span class="token punctuation">)</span>c <span class="token operator">==</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//判断当按下为2时</span> cout <span class="token operator"><<</span> <span class="token string">"you enter key #"</span> <span class="token operator"><<</span> c <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token function">cvtColor</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">COLOR_BGR2HSV</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将其变为HSV图像</span> <span class="token punctuation">}</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">==</span> <span class="token string">'3'</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//此处也可以使用此种方式判断,或者(int)c == 51</span> cout <span class="token operator"><<</span> <span class="token string">"you enter key #"</span> <span class="token operator"><<</span> c <span class="token operator"><<</span> endl<span class="token punctuation">;</span> dst <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">,</span> <span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">add</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"键盘响应"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
009-opencv自带颜色表操作(applyColorMap)
//009-opencv自带颜色表操作 void quickDemo::color_style_demo(Mat &image){ //COLORMAP_AUTUMN = 0, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hrsIy6mj-1624859124466)(pics/colormaps/colorscale_autumn.jpg)] // COLORMAP_BONE = 1, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F7MCZPsi-1624859124471)(pics/colormaps/colorscale_bone.jpg)] // COLORMAP_JET = 2, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iCCe16BH-1624859124473)(pics/colormaps/colorscale_jet.jpg)] // COLORMAP_WINTER = 3, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FqSaECet-1624859124475)(pics/colormaps/colorscale_winter.jpg)] // COLORMAP_RAINBOW = 4, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gUfUV4J1-1624859124484)(pics/colormaps/colorscale_rainbow.jpg)] // COLORMAP_OCEAN = 5, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JCySlDdn-1624859124489)(pics/colormaps/colorscale_ocean.jpg)] // COLORMAP_SUMMER = 6, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1CJ1SmdL-1624859124491)(pics/colormaps/colorscale_summer.jpg)] // COLORMAP_SPRING = 7, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HfgwFe4x-1624859124494)(pics/colormaps/colorscale_spring.jpg)] // COLORMAP_COOL = 8, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u89z9rEh-1624859124498)(pics/colormaps/colorscale_cool.jpg)] // COLORMAP_HSV = 9, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IJjB3X3I-1624859124500)(pics/colormaps/colorscale_hsv.jpg)] // COLORMAP_PINK = 10, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dpg3nlYR-1624859124504)(pics/colormaps/colorscale_pink.jpg)] // COLORMAP_HOT = 11, //!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Hq6FMJH-1624859124505)(pics/colormaps/colorscale_hot.jpg)] // COLORMAP_PARULA = 12
<span class="token comment">//opencv3.0的版本中的色彩表只有12中类型,在opencv4.1中则高达19种</span> <span class="token comment">//通过定义一个数组(里面的值实际为整数数字),来在后面实现图片的轮流播放</span> int colorMap<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token constant">COLORMAP_AUTUMN</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YaKZUqsV-1624859124507)(pics/colormaps/colorscale_autumn.jpg)]</span> <span class="token constant">COLORMAP_BONE</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v23RpPQn-1624859124510)(pics/colormaps/colorscale_bone.jpg)]</span> <span class="token constant">COLORMAP_JET</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caZyJ8am-1624859124512)(pics/colormaps/colorscale_jet.jpg)]</span> <span class="token constant">COLORMAP_WINTER</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VjbQXYsb-1624859124514)(pics/colormaps/colorscale_winter.jpg)]</span> <span class="token constant">COLORMAP_RAINBOW</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ct8T7gG6-1624859124518)(pics/colormaps/colorscale_rainbow.jpg)]</span> <span class="token constant">COLORMAP_OCEAN</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mIScclOa-1624859124520)(pics/colormaps/colorscale_ocean.jpg)]</span> <span class="token constant">COLORMAP_SUMMER</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKHTgwVJ-1624859124522)(pics/colormaps/colorscale_summer.jpg)]</span> <span class="token constant">COLORMAP_SPRING</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EVO7lbkp-1624859124524)(pics/colormaps/colorscale_spring.jpg)]</span> <span class="token constant">COLORMAP_COOL</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3vhLRuH9-1624859124528)(pics/colormaps/colorscale_cool.jpg)]</span> <span class="token constant">COLORMAP_HSV</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ckFxoCWO-1624859124532)(pics/colormaps/colorscale_hsv.jpg)]</span> <span class="token constant">COLORMAP_PINK</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fWleieX8-1624859124533)(pics/colormaps/colorscale_pink.jpg)]</span> <span class="token constant">COLORMAP_HOT</span><span class="token punctuation">,</span> <span class="token comment">//!< [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gQtmzrx1-1624859124535)(pics/colormaps/colorscale_hot.jpg)]</span> <span class="token constant">COLORMAP_PARULA</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> Mat dst<span class="token punctuation">;</span> int index <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> int c <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">==</span> <span class="token number">27</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">applyColorMap</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> colorMap<span class="token punctuation">[</span>index <span class="token operator">%</span> <span class="token number">12</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//index%12保证此数值一直在12之内</span> cout <span class="token operator"><<</span> <span class="token string">"第"</span> <span class="token operator"><<</span> index <span class="token operator">%</span> <span class="token number">12</span> <span class="token operator"><<</span> <span class="token string">"种颜色风格"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> index<span class="token operator">++</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"颜色风格"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//如果输入键值为s保存当前图像</span> string imagename <span class="token operator">=</span> <span class="token string">"颜色风格-"</span> <span class="token operator">+</span> <span class="token function">to_string</span><span class="token punctuation">(</span>index <span class="token operator">%</span> <span class="token number">12</span><span class="token punctuation">)</span><span class="token operator">+</span><span class="token string">".jpg"</span><span class="token punctuation">;</span> char s <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//String类下valueOf可将任何类型转换成String类型</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>s <span class="token operator">==</span> <span class="token string">'s'</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token function">imwrite</span><span class="token punctuation">(</span>imagename<span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
010-图像像素的逻辑操作(位操作,与、或、非)
//010-图像像素的逻辑操作(位操作,与、或、非)
void quickDemo::bitwise_demo(Mat &image){
Mat m1 = Mat::zeros(Size(256,256), CV_8UC3);
Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
rectangle(m1, Rect(100,100,80,80),Scalar(255,255,0),-1); //绘制矩形并填充
rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1); //绘制矩形并填充
imshow("m1", m1);
imshow("m2", m2);
Mat dst;
bitwise_and(m1, m2, dst); //m1与m2的交集Scalar(255,255,0) && Scalar(0, 255, 255)==Scalar(0, 255, 0),只剩下G通道的值不为0
imshow("m1和m2的与操作", dst);
bitwise_or(m1, m2, dst); //m1与m2的交集Scalar(255,255,0) || Scalar(0, 255, 255)==Scalar(255, 255, 255),BGR通道值全为255,故此区域为白色
imshow("m1和m2的或操作", dst);
bitwise_xor(m1, m2, dst); //m1与m2的交集Scalar(255,255,0) XOR Scalar(0, 255, 255)==Scalar(255,0, 255)
imshow("m1和m2的异或操作", dst);
bitwise_not(image, dst); //对image取反操作(使用~image也可以直接进行取反操作)
imshow("对image的非操作", dst);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
011-通道分离与合并(split,merge)
//011-通道分离与合并 void quickDemo::channels_demo(Mat &image){
<span class="token comment">//通道分离的方式有两种</span> Mat aChannels<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//利用数组分离,此处必须为3,否则会报错(split(image, aChannels); )</span> vector<span class="token operator"><</span>Mat<span class="token operator">></span> mv<span class="token punctuation">;</span> <span class="token comment">//利用vector对象分离</span> <span class="token comment">//src为要分离的Mat对象 </span> <span class="token function">split</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> mv<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//split分离后的是单通道图像</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"蓝色单通道"</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"绿色单通道"</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"红色单通道"</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> Mat dst<span class="token punctuation">;</span> <span class="token function">merge</span><span class="token punctuation">(</span>mv<span class="token punctuation">,</span>dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//对vector对象的合并(和原图像相同三通道)</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"使用vector合并成原图"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//可以对单通道进行某些操作后再进行合并</span> Mat mzero <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建一个和mv[0]单通道大小类型相同的,值为0的单通道图像,通道合并时使用</span> aChannels<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//使用clone不会影响到mv[0]</span> aChannels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">merge</span><span class="token punctuation">(</span>aChannels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//对数组的合并(三通道)</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"蓝色三通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">merge</span><span class="token punctuation">(</span>aChannels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//对数组的合并(三通道),参数2:合并数组的个数</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"绿色三通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> mzero<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> aChannels<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">merge</span><span class="token punctuation">(</span>aChannels<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//对数组的合并(三通道)</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"红色三通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//进行通道的混合,可以对多个图像混合</span> int from_to<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token comment">//表示将第1个图像的[0]通道数据,传递给第2个图像的[2]通道</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token comment">//表示将第1个图像的[1]通道数据,传递给第2个图像的[1]通道</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token comment">//表示将第1个图像的[2]通道数据,传递给第2个图像的[0]通道</span> <span class="token function">mixChannels</span><span class="token punctuation">(</span><span class="token operator">&</span>image<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">&</span>dst<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> from_to<span class="token punctuation">,</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处的dst在上面的变换已经是3通道且大小类型与image相同</span> <span class="token comment">//参数1:输入图像地址,</span> <span class="token comment">//参数2:输入图像的个数1,</span> <span class="token comment">//参数3:输出图像地址,输出图像个数1,</span> <span class="token comment">//参数4:设置输入矩阵的通道对应输出矩阵的通道,</span> <span class="token comment">//参数5:共有几组输入输出通道的关系,此处是3组</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"mixChannels混合通道"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> Mat dst2 <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处dst2的大小类型需和image相同,否则执行mixChannels会报错</span> int from_to2<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token function">mixChannels</span><span class="token punctuation">(</span><span class="token operator">&</span>image<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token operator">&</span>dst2<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> from_to2<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处也能显示蓝色,和上面的蓝色单通道颜色相同</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"蓝色混合通道"</span><span class="token punctuation">,</span> dst2<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
012-图像色彩空间转换-变换背景(cvtColor,inRange)
//012-图像色彩空间转换-背景变换(cvtColor,inRange) void quickDemo::inrange_demo(Mat &image){ Mat hsv; cvtColor(image, hsv, COLOR_BGR2HSV); //hsv色彩空间表https://blog.youkuaiyun.com/leo_888/article/details/88284251 //通过hsv空间表,确定出绿色的范围(H:35-77,S:43-255,V:46-255),使用inrange将此范围提取出来 Mat mask; inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask); //此处提取的是绿色区域部分 imshow("inRange_mask", mask);
Mat redback <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> redback <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">40</span><span class="token punctuation">,</span> <span class="token number">200</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将此创建的背景图片变为红色</span> <span class="token function">bitwise_not</span><span class="token punctuation">(</span>mask<span class="token punctuation">,</span> mask<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处对mask取反得到人物的区域</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"bitwise_not_mask"</span><span class="token punctuation">,</span> mask<span class="token punctuation">)</span><span class="token punctuation">;</span> image<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>redback<span class="token punctuation">,</span> mask<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处将image图像在mask中不为0的点拷贝到redback上,mask为0的区域就不要了</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"redback"</span><span class="token punctuation">,</span> redback<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//显示背景为红色,前景为人的图像</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
013-图像像素值统计(minMaxLoc,meanStdDev)
//013-图像像素值统计(minMaxLoc,meanStdDev) void quickDemo::pixel_static_demo(Mat &image){ double minv, maxv; //最小值,最大值 Point minLoc, maxLoc; //最小值位置,最大值位置 vector<Mat> mv; split(image, mv); for (int i = 0; i < mv.size(); i++){ minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat()); //输入矩阵应为单通道 cout << "No.channels:" << i << ",min value:" << minv << ",max value:" << maxv << endl; } Mat mean, stddev; meanStdDev(image, mean, stddev); //参数1:输入矩阵(1-4通道),参数2:计算均值,参数3:计算方差,参数4:mask(指定ROI区域) cout << "mean:" << mean <<endl<< "stddeve:" << stddev << endl; cout << "mean-type:" << mean.type() << endl << "stddeve-type:" << stddev.type() << endl; //mean和stddev的type都是6,故矩阵类型为CV_64F,数据是double类型的,所以取值时应at<double> //CV_8U=ucahr,CV_8S=cahr,CV_32S=int,CV_32F=float,CV_64F=double
<span class="token comment">//提取单通道的均值及均方差(mean是个单通道的矩阵(使用imagewatch查看其状态),提取其值使用)</span> double meanB <span class="token operator">=</span> mean<span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//一定要注意at<>中的取值类型,不对就会报错,此处用imagewatch调试,看不能使用int,只能使用double类型</span> cout <span class="token operator"><<</span> <span class="token string">"meanB:"</span> <span class="token operator"><<</span> meanB <span class="token operator"><<</span> endl<span class="token punctuation">;</span> double meanG <span class="token operator">=</span> mean<span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//一定要注意at<>中的取值类型,不对就会报错,此处用imagewatch调试,看不能使用int,只能使用double类型</span> cout <span class="token operator"><<</span> <span class="token string">"meanG:"</span> <span class="token operator"><<</span> meanG <span class="token operator"><<</span> endl<span class="token punctuation">;</span> double meanR <span class="token operator">=</span> mean<span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//一定要注意at<>中的取值类型,不对就会报错,此处用imagewatch调试,看不能使用int,只能使用double类型</span> cout <span class="token operator"><<</span> <span class="token string">"meanR:"</span> <span class="token operator"><<</span> meanR <span class="token operator"><<</span> endl<span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect)
//014-图像几何形状绘制(rectangle,Rect,circle,line,ellipse,RotatedRect) void quickDemo::drawing_demo(Mat &image){ Mat bg = Mat::zeros(image.size(), image.type()); //绘制矩形 Rect rect; rect.x = 100; rect.y = 50; rect.width = 200; rect.height = 200; rectangle(bg, rect, Scalar(0, 0, 255), -1,8); //参数4为-1时表示填充 //绘制圆 circle(bg, Point(300, 250), 15, Scalar(255, 0, 0), 2,8); //绘制线 line(bg, Point(100, 50), Point(300, 250), Scalar(0, 255, 0), 2,LINE_AA); //LINE_AA反锯齿(更平滑) //绘制椭圆 RotatedRect rrt; rrt.center = Point(200,100); rrt.size = Size(100, 200); rrt.angle = 45.0; //椭圆角度 ellipse(bg, rrt, Scalar(0, 255, 255), 2, 8); imshow("绘制演示", bg);
Mat dst<span class="token punctuation">;</span> <span class="token function">addWeighted</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> <span class="token number">0.7</span><span class="token punctuation">,</span> bg<span class="token punctuation">,</span> <span class="token number">0.3</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"addWeighted演示"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
015-随机数与随机颜色
//015-随机数与随机颜色 void quickDemo::random_drawing_demo(){ Mat canavas = Mat::zeros(Size(512, 512), CV_8UC3); int w = canavas.cols; int h = canavas.rows; RNG rng(1234); while (true) { int c = waitKey(100); if (c==27){ //当按下ESC键时退出循环 break; }
int x1 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> w<span class="token punctuation">)</span><span class="token punctuation">;</span> int y1 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> h<span class="token punctuation">)</span><span class="token punctuation">;</span> int x2 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> w<span class="token punctuation">)</span><span class="token punctuation">;</span> int y2 <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> h<span class="token punctuation">)</span><span class="token punctuation">;</span> int b <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span> int g <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span> int r <span class="token operator">=</span> rng<span class="token punctuation">.</span><span class="token function">uniform</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">;</span> canavas <span class="token operator">=</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//每次循环将图像变为黑色(刷新图像,可以实现每次绘制一条线,若注释则绘制多条线)</span> <span class="token function">line</span><span class="token punctuation">(</span>canavas<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>x1<span class="token punctuation">,</span> y1<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>x2<span class="token punctuation">,</span> y2<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span>b<span class="token punctuation">,</span> g<span class="token punctuation">,</span> r<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token constant">LINE_AA</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"随机绘制演示"</span><span class="token punctuation">,</span> canavas<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
016-多边形填充与绘制(fillPoly,polylines,drawContours)
//016-多边形填充与绘制(fillPoly,polylines,drawContours) void quickDemo::polyline_drawing_demo(){ Mat canavas = Mat::zeros(Size(512, 512), CV_8UC3); Point p1(100, 100); Point p2(350, 100); Point p3(450, 280); Point p4(320, 450); Point p5(80, 400); vector<Point> pts; pts.push_back(p1); pts.push_back(p2); pts.push_back(p3); pts.push_back(p4); pts.push_back(p5);
<span class="token comment">//fillPoly(canavas, pts, Scalar(255, 255, 0), 8); //此函数专用填充多边形(此种形式opencv3.0一直报错(可以使用其重载),opencv4可以实现)</span> <span class="token comment">//imshow("fillPoly多边形填充", canavas);</span> <span class="token function">polylines</span><span class="token punctuation">(</span>canavas<span class="token punctuation">,</span> pts<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此函数无法将参数5变为-1来填充,会报错</span> <span class="token comment">//参数1:输入输出图像矩阵,参数2:输入点集,参数3:是否封闭,参数4:颜色,参数5:线宽,参数6:线型,参数7:偏置 </span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"polylines多边形绘制"</span><span class="token punctuation">,</span> canavas<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//通过点集绘制轮廓</span> vector<span class="token operator"><</span>vector<span class="token operator"><</span>Point<span class="token operator">>></span> contours<span class="token punctuation">;</span> contours<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>pts<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">drawContours</span><span class="token punctuation">(</span>canavas<span class="token punctuation">,</span> contours<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//参数5位-1时填充</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"drawContours多边形绘制"</span><span class="token punctuation">,</span> canavas<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
017-鼠标操作与响应(setMouseCallback)
//017-定义鼠标事件的回调函数 Point sp(-1, -1); Point ep(-1, -1); Mat temp; //用于保存原图,已完成对之前画有矩形的图片的擦除(所以拖动时永远是最新的矩形了) static void on_draw(int event, int x, int y, int flags, void *userdata){
Mat image <span class="token operator">=</span> <span class="token operator">*</span><span class="token punctuation">(</span><span class="token punctuation">(</span>Mat<span class="token operator">*</span><span class="token punctuation">)</span>userdata<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>event<span class="token operator">==</span><span class="token constant">EVENT_LBUTTONDOWN</span><span class="token punctuation">)</span> <span class="token comment">//当鼠标按下时,得到初始位置</span> <span class="token punctuation">{<!-- --></span> sp<span class="token punctuation">.</span>x <span class="token operator">=</span> x<span class="token punctuation">;</span> sp<span class="token punctuation">.</span>y <span class="token operator">=</span> y<span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"start point:"</span> <span class="token operator"><<</span> sp <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>event <span class="token operator">==</span> <span class="token constant">EVENT_LBUTTONUP</span><span class="token punctuation">)</span> <span class="token comment">//当鼠标抬起时,得到结束位置</span> <span class="token punctuation">{<!-- --></span> ep<span class="token punctuation">.</span>x <span class="token operator">=</span> x<span class="token punctuation">;</span> ep<span class="token punctuation">.</span>y <span class="token operator">=</span> y<span class="token punctuation">;</span> <span class="token comment">//cout << "end point:" << sp << endl;</span> <span class="token comment">//绘制矩形窗</span> int dx <span class="token operator">=</span> ep<span class="token punctuation">.</span>x <span class="token operator">-</span> sp<span class="token punctuation">.</span>x<span class="token punctuation">;</span> int dy <span class="token operator">=</span> ep<span class="token punctuation">.</span>y <span class="token operator">-</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> dx<span class="token operator">></span><span class="token number">0</span> <span class="token operator">&&</span> dy<span class="token operator">></span><span class="token number">0</span> <span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> Rect <span class="token function">box</span><span class="token punctuation">(</span>sp<span class="token punctuation">.</span>x<span class="token punctuation">,</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">,</span> dx<span class="token punctuation">,</span> dy<span class="token punctuation">)</span><span class="token punctuation">;</span> temp<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span> Mat imageBox <span class="token operator">=</span> <span class="token function">image</span><span class="token punctuation">(</span>box<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"ROI区域"</span><span class="token punctuation">,</span> imageBox<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//此处直接截取ROI区域</span> <span class="token function">rectangle</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> box<span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"鼠标绘制"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//绘制完成后要更新</span> <span class="token comment">//结束后,为下一次做准备</span> sp<span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> sp<span class="token punctuation">.</span>y <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>event <span class="token operator">==</span> <span class="token constant">EVENT_MOUSEMOVE</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token comment">//当鼠标移动过程中实时显示矩形大小</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>sp<span class="token punctuation">.</span>x<span class="token operator">></span><span class="token number">0</span> <span class="token operator">&&</span> sp<span class="token punctuation">.</span>y<span class="token operator">></span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token comment">//只有当鼠标按下了,才能有所响应</span> <span class="token punctuation">{<!-- --></span> ep<span class="token punctuation">.</span>x <span class="token operator">=</span> x<span class="token punctuation">;</span> ep<span class="token punctuation">.</span>y <span class="token operator">=</span> y<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>ep<span class="token punctuation">.</span>x<span class="token operator">></span>image<span class="token punctuation">.</span>cols <span class="token operator">||</span> ep<span class="token punctuation">.</span>y<span class="token operator">></span>image<span class="token punctuation">.</span>rows<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> cout <span class="token operator"><<</span> <span class="token string">"无法截取边界,请重新截取"</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">exit</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//当绘制的矩形超出图像坐标时,要退出,否则会报错</span> <span class="token punctuation">}</span> <span class="token comment">//cout << "end point:" << sp << endl;</span> <span class="token comment">//绘制矩形窗</span> int dx <span class="token operator">=</span> ep<span class="token punctuation">.</span>x <span class="token operator">-</span> sp<span class="token punctuation">.</span>x<span class="token punctuation">;</span> int dy <span class="token operator">=</span> ep<span class="token punctuation">.</span>y <span class="token operator">-</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>dx <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">&&</span> dy <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> Rect <span class="token function">box</span><span class="token punctuation">(</span>sp<span class="token punctuation">.</span>x<span class="token punctuation">,</span> sp<span class="token punctuation">.</span>y<span class="token punctuation">,</span> dx<span class="token punctuation">,</span> dy<span class="token punctuation">)</span><span class="token punctuation">;</span> temp<span class="token punctuation">.</span><span class="token function">copyTo</span><span class="token punctuation">(</span>image<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">rectangle</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> box<span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"鼠标绘制"</span><span class="token punctuation">,</span> image<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//绘制完成后要更新</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
}
//017-鼠标操作与响应(setMouseCallback)
void quickDemo::mouse_drawing_demo(Mat &image){
namedWindow(“鼠标绘制”, WINDOW_AUTOSIZE);
setMouseCallback(“鼠标绘制”, on_draw,(void*)(&image));
imshow(“鼠标绘制”, image);
temp = image.clone();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
018-图像像素类型转换与归一化(convertTo,normalize)
//018-图像像素类型转换与归一化(convertTo,normalize) void quickDemo::norm_demo(Mat &image){ //一般在深度学习等预处理图像时将数据归一化 //将image变为float数据类型 Mat dst; cout <<"image.type():"<< image.type() << endl; image.convertTo(image, CV_32F); imshow("浮点型图像", image); //浮点型的图像要想正常显示必须是0-1之间的,否则在0-255之间的浮点数无法正常显示 cout << "image.type():" << image.type() << endl; //CV_8UC3=16,CV_32FC3=21 //CV_8U=ucahr,CV_8S=cahr,CV_32S=int,CV_32F=float,CV_64F=double
<span class="token comment">//将0-255的数据值范围归一化为0-1,要在0-1数据应为浮点型(https://blog.youkuaiyun.com/DP323/article/details/80273996)</span> <span class="token function">normalize</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token number">1.0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//输入数组是浮点型的,输出的和输入的数值类型相同,只是取值范围不同(通过imagewatch查看)</span> <span class="token comment">//image若不转类型,之前是无符号整型,当归一化0-1时,数值都是0.几,就会成为黑色图像</span> <span class="token comment">//参数1:输入数组</span> <span class="token comment">//参数2::输出数组,支持原地运算</span> <span class="token comment">//参数3:range normalization模式的最小值</span> <span class="token comment">//参数4:range normalization模式的最大值,不用于norm normalization(范数归一化)模式。</span> <span class="token comment">//参数5::归一化的类型,可以有以下的取值:</span> <span class="token comment">//NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。</span> <span class="token comment">//NORM_INF : 此类型的定义没有查到,根据OpenCV 1的对应项,可能是归一化数组的C - 范数(绝对值的最大值)</span> <span class="token comment">//NORM_L1 : 归一化数组的L1 - 范数(绝对值的和)</span> <span class="token comment">//NORM_L2 : 归一化数组的(欧几里德)L2 - 范数</span> cout <span class="token operator"><<</span> <span class="token string">"dst.type():"</span> <span class="token operator"><<</span> dst<span class="token punctuation">.</span><span class="token function">type</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"图像数据归一化"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
019-图像缩放与插值(resize)
//019-图像缩放与插值
void quickDemo::resize_demo(Mat &image){
//在深度学习中可能需要将其转换成一定大小的图片,并归一化到0-1
Mat zoomin, zoomout;
int h = image.rows;
int w = image.cols;
resize(image, zoomin, Size(w / 2, h / 2), 0, 0, INTER_LINEAR);
/*参数1:输入图像
参数2:输出图像,形态和输入图相同,当dsize不等于0,输出图尺寸会和dsize相同, 当dsize等于0,输出图尺寸会由输入图尺寸、fx、fy计算而得
参数3:输出图像大小,若为零,则参数4、5不能和其同时为0,dsize = Size(round(fxsrc.cols), round(fysrc.rows))
参数4:水平缩放比例,当输入为0时,fx = (double)dsize.width / src.cols
参数5:垂直缩放比例, 当输入为0时,fy = (double)dsize.height / src.rows
参数6:插值方式,如下
INTER_NEAREST - 最近邻插值
INTER_LINEAR - 线性插值(默认),此种方法要比最近邻插值更平滑
INTER_AREA - 区域插值
INTER_CUBIC - 三次样条插值
INTER_LANCZOS4 - Lanczos插值*/
imshow("zoomin", zoomin);
resize(image, zoomout, Size(w *1.5, h * 1.5), 0, 0, INTER_LINEAR);
imshow("zoomout", zoomout);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
020-图像翻转(flip)
//020-图像翻转(flip)
void quickDemo::flip_demo(Mat &image){
Mat dst;
flip(image, dst, 0);
/*参数1:输入图像
参数2:输出图像
参数3:>0: 沿x - 轴翻转, 0 : 沿y - 轴翻转, <0 : x、y轴同时翻转*/
imshow("图像翻转", dst);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
021-图像旋转(getRotationMatrix2D,warpAffine)
//021-图像旋转(getRotationMatrix2D,warpAffine) void quickDemo::rotate_demo(Mat &image){ Mat dst, M; int w = image.cols; int h = image.rows; //获得旋转矩阵M M = getRotationMatrix2D(Point(w/2,h/2), 45, 1.0); //参数1;确定原图像的旋转中心,参数2:旋转角度,参数3:缩放因子(1.0表示大小不变)
<span class="token comment">//对原图像进行旋转操作1(输出图像大小不变,但旋转的一部分无法全部显示)</span> <span class="token function">warpAffine</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">M</span><span class="token punctuation">,</span> image<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">INTER_LINEAR</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">0</span><span class="token punctuation">,</span><span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">/*.src: 输入图像 .dst : 输出图像,尺寸由dsize指定,图像类型与原图像一致 .M : 2X3的变换矩阵 .dsize : 指定图像输出尺寸 .flags : 插值算法标识符,有默认值INTER_LINEAR .borderMode : 边界像素模式,有默认值BORDER_CONSTANT .borderValue : 边界颜色取值,有默认值Scalar()即0*/</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"旋转演示1"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//旋转操作2,改变输出旋转图像大小,使其将旋转后的图像全部显示</span> <span class="token comment">//M矩阵使用imagewatch查看其内容,2行3列,返回矩阵https://blog.youkuaiyun.com/limit_ing/article/details/61952187</span> <span class="token comment">//</span> <span class="token comment">//确定新的旋转图像大小及偏移</span> double cos <span class="token operator">=</span> <span class="token function">abs</span><span class="token punctuation">(</span><span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//得到角度a的余弦值cos(a) ,abs()求元素的绝对值 ,CV_64F=double</span> double sin <span class="token operator">=</span> <span class="token function">abs</span><span class="token punctuation">(</span><span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//得到角度a的正弦值sin(a)</span> int nw <span class="token operator">=</span> cos<span class="token operator">*</span>w <span class="token operator">+</span> sin<span class="token operator">*</span>h<span class="token punctuation">;</span> <span class="token comment">//获取新的图像宽度</span> int nh <span class="token operator">=</span> sin<span class="token operator">*</span>w <span class="token operator">+</span> cos<span class="token operator">*</span>h<span class="token punctuation">;</span> <span class="token comment">//获取新的图像宽度</span> <span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>nw <span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> w<span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//更改旋转矩阵M中的(0,2)处的值,此处含义类似更改旋转中心宽度</span> <span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token constant">M</span><span class="token punctuation">.</span>at<span class="token operator"><</span>double<span class="token operator">></span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token punctuation">(</span>nh<span class="token operator">/</span> <span class="token number">2</span> <span class="token operator">-</span> h <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//更改旋转矩阵M中的(1,2)处的值,此处含义类似更改旋转中心高度</span> <span class="token function">warpAffine</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> dst<span class="token punctuation">,</span> <span class="token constant">M</span><span class="token punctuation">,</span> <span class="token function">Size</span><span class="token punctuation">(</span>nw<span class="token punctuation">,</span>nh<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token constant">INTER_LINEAR</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"旋转演示2"</span><span class="token punctuation">,</span> dst<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
022-视频文件摄像头使用(VideoCapture capture)
//022-视频文件摄像头使用(VideoCapture) void quickDemo::video_demo(Mat &image){ //VideoCapture capture(0); //初始化一个capture对象用来获取视频摄像头,0表示获取电脑本机摄像头 VideoCapture capture("G:\\OpenCV\\opencv所用视频\\wuDao.avi"); //从指定路径中读取视频 if (!capture.isOpened()) { std::cout << "Read video Failed !" << std::endl; getchar(); return; } Mat frame; while (true) { capture.read(frame); //将视频读取到Mat矩阵中 if (frame.empty()) { break; } imshow("frame",frame); flip(frame, frame, 1);//电脑摄像头的视频有镜像,将其再反转一下 //TODO:do something...(可以在此处做一些对图像的操作) cvtColor(frame, frame, COLOR_BGR2GRAY); imshow("灰度", frame);
<span class="token comment">//当按键为ESC时退出循环</span> int c <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c<span class="token operator">==</span><span class="token number">27</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//资源释放</span> capture<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">另外一种读取视频文件方式(https://blog.youkuaiyun.com/u010368556/article/details/79186992)</span> <span class="token comment">//cv::VideoCapture capture;</span> <span class="token comment">//capture.open("G:\\OpenCV\\opencv所用视频\\wuDao.avi");</span> <span class="token comment">//if (!capture.isOpened())</span> <span class="token comment">//{<!-- --></span> <span class="token comment">// std::cout << "Read video Failed !" << std::endl;</span> <span class="token comment">// getchar();</span> <span class="token comment">// return;</span> <span class="token comment">//}</span> <span class="token comment">//cv::Mat frame;</span> <span class="token comment">//cv::namedWindow("video test");</span> <span class="token comment">//int frame_num = capture.get(cv::CAP_PROP_FRAME_COUNT);</span> <span class="token comment">//std::cout << "total frame number is: " << frame_num << std::endl;</span> <span class="token comment">//for (int i = 0; i < frame_num - 1; ++i)</span> <span class="token comment">//{<!-- --></span> <span class="token comment">// capture >> frame; //第二种方式 </span> <span class="token comment">// //capture.read(frame); </span> <span class="token comment">// imshow("video test", frame);</span> <span class="token comment">// if (cv::waitKey(30) == 'q')</span> <span class="token comment">// {<!-- --></span> <span class="token comment">// break;</span> <span class="token comment">// }</span> <span class="token comment">//}</span> <span class="token comment">//cv::destroyWindow("video test");</span> <span class="token comment">//capture.release();</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
023-视频处理与保存-帧宽高(capture.get)
//023-视频处理与保存-帧宽高(capture.get)(未完成) void quickDemo::video_demo2(Mat &image){ //https://blog.youkuaiyun.com/cv_jason/article/details/54619505 VideoCapture capture(0); //初始化一个capture对象用来获取视频摄像头,0表示获取电脑本机摄像头 //VideoCapture capture("G:\\OpenCV\\opencv所用视频\\wuDao.avi"); //从指定路径中读取视频 if (!capture.isOpened()) { std::cout << "Read video Failed !" << std::endl; getchar(); return; }
<span class="token comment">//set方式可以设置视频宽高,但如果相机不支持此种分辨率输出set也是无法取的</span> int frame_width <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FRAME_WIDTH</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取视频帧的宽</span> int frame_height <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FRAME_HEIGHT</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取视频帧的高</span> int frame_count <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FRAME_COUNT</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取视频总帧数</span> int fps <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FPS</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取视频FPS(FPS表示每秒处理多少帧画面,处理速度越快,性能越好,FPS一种衡量标准)</span> cout <span class="token operator"><<</span> <span class="token string">"frame width:"</span> <span class="token operator"><<</span> frame_width <span class="token operator"><<</span> endl<span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"frame height:"</span> <span class="token operator"><<</span> frame_height <span class="token operator"><<</span> endl<span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"frame count:"</span> <span class="token operator"><<</span> frame_count <span class="token operator"><<</span> endl<span class="token punctuation">;</span> cout <span class="token operator"><<</span> <span class="token string">"fps:"</span> <span class="token operator"><<</span> fps <span class="token operator"><<</span> endl<span class="token punctuation">;</span> int codec <span class="token operator">=</span> capture<span class="token punctuation">.</span><span class="token keyword">get</span><span class="token punctuation">(</span><span class="token constant">CAP_PROP_FOURCC</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//获取视频文件格式</span> <span class="token comment">//cout << "codec:" << codec << endl; //文件格式为10进制的</span> <span class="token comment">//char s[20];</span> <span class="token comment">//sprintf(s, "%x", codec); //将获取的codec转换成16进制的字符串</span> <span class="token comment">//printf("视频文件格式16进制:%s\n", s); //将获取的codec以16进制的形式输出</span> <span class="token comment">//直接输出视频编码格式</span> cout <span class="token operator"><<</span> <span class="token string">"视频文件格式:"</span> <span class="token operator"><<</span> <span class="token function">char</span><span class="token punctuation">(</span>codec<span class="token operator">&</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token function">char</span><span class="token punctuation">(</span><span class="token punctuation">(</span>codec<span class="token operator">>></span><span class="token number">8</span><span class="token punctuation">)</span><span class="token operator">&</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token function">char</span><span class="token punctuation">(</span><span class="token punctuation">(</span>codec<span class="token operator">>></span><span class="token number">16</span><span class="token punctuation">)</span><span class="token operator">&</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator"><<</span> <span class="token function">char</span><span class="token punctuation">(</span><span class="token punctuation">(</span>codec<span class="token operator">>></span><span class="token number">24</span><span class="token punctuation">)</span><span class="token operator">&</span><span class="token number">0xFF</span><span class="token punctuation">)</span> <span class="token operator"><<</span> endl<span class="token punctuation">;</span> <span class="token comment">//&是位操作符,10进制codec的二进制数与16进制0xFF的二进制数进行与操作,而codec的最低8位被保留了下来,其余高位全部变为0,此时再对截断后的8位char就得到字符</span> <span class="token comment">//(11111111 11111111 11111111 10000001) & (0x00000000 00000000 00000000 11111111) = 00000000 00000000 00000000 10000001</span> <span class="token comment">//(codec>>8)&0xFF对codec二进制的第2个高8位进行截断</span> <span class="token comment">//(codec>>16)&0xFF对codec二进制的第3个高8位进行截断</span> <span class="token comment">//(codec>>24)&0xFF对codec二进制的第4个高8位进行截断</span> <span class="token comment">//视频保存大小与获得的视频大小相同(此处使用的opencv4)</span> fps <span class="token operator">=</span> <span class="token number">30</span><span class="token punctuation">;</span> <span class="token comment">//当为打开摄像头设备时,此处fps一定要赋值,否则录制的视频无法打开</span> VideoWriter writer<span class="token punctuation">;</span> writer<span class="token punctuation">.</span><span class="token function">open</span><span class="token punctuation">(</span><span class="token string">"G:\\OpenCV\\opencv所用视频\\wu4.avi"</span><span class="token punctuation">,</span> writer<span class="token punctuation">.</span><span class="token function">fourcc</span><span class="token punctuation">(</span><span class="token string">'M'</span><span class="token punctuation">,</span> <span class="token string">'J'</span><span class="token punctuation">,</span> <span class="token string">'P'</span><span class="token punctuation">,</span> <span class="token string">'G'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> fps<span class="token punctuation">,</span> <span class="token function">Size</span><span class="token punctuation">(</span>frame_width<span class="token punctuation">,</span> frame_height<span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//https://blog.youkuaiyun.com/Day_upon/article/details/85991445</span> <span class="token comment">//以下编码格式在OpenCV4中都可以运行</span> <span class="token comment">//CV_FOURCC('M','J','P','G') 注意此种格式保存的视频一直无法打开(在opencv3下)</span> <span class="token comment">//CV_FOURCC('P', 'I', 'M', '1') = MPEG - 1 codec(无法打开)(在opencv3下)</span> <span class="token comment">// CV_FOURCC('M', 'J', 'P', 'G') = motion - jpeg codec(无法打开)(在opencv3下)</span> <span class="token comment">// CV_FOURCC('M', 'P', '4', '2') = MPEG - 4.2 codec(保存的avi可以打开)(在opencv3下)</span> <span class="token comment">// CV_FOURCC('D', 'I', 'V', '3') = MPEG - 4.3 codec(保存的avi可以打开)(在opencv3下)</span> <span class="token comment">// CV_FOURCC('D', 'I', 'V', 'X') = MPEG - 4 codec(可以打开)(在opencv3下)</span> <span class="token comment">// CV_FOURCC('U', '2', '6', '3') = H263 codec(未测试)</span> <span class="token comment">// CV_FOURCC('I', '2', '6', '3') = H263I codec(未测试)</span> <span class="token comment">// CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec(无法打开)</span> Mat frame<span class="token punctuation">;</span> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> capture<span class="token punctuation">.</span><span class="token function">read</span><span class="token punctuation">(</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//将视频读取到Mat矩阵中</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>frame<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token function">imshow</span><span class="token punctuation">(</span><span class="token string">"frame"</span><span class="token punctuation">,</span> frame<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//flip(frame, frame, 1);//电脑摄像头的视频有镜像,将其再反转一下,当为MJPG编码格式时无需翻转</span> <span class="token comment">//TODO:do something...(可以在此处做一些对图像的操作)</span> <span class="token comment">/*cvtColor(frame, frame, COLOR_BGR2GRAY); imshow("灰度", frame);*/</span> <span class="token comment">//opencv3版本一直保存失败(原因已经明确)</span> writer<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>frame<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//保存视频(opencv只能处理视频不处理音频,处理大小有限制,不要超过2G)</span> <span class="token comment">//writer << frame;</span> <span class="token comment">//当按键为ESC时退出循环</span> int c <span class="token operator">=</span> <span class="token function">waitKey</span><span class="token punctuation">(</span><span class="token number">1000</span><span class="token operator">/</span><span class="token number">30</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">==</span> <span class="token number">27</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token keyword">break</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">//资源释放</span> capture<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> writer<span class="token punctuation">.</span><span class="token function">release</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
024-图像直方图-绘制直方图(calcHist,normalize,line)
//024-图像直方图(calcHist,normalize,line) void quickDemo::showHistogram(Mat &image){
<span class="token comment">//cvtColor(image, image, COLOR_BGR2GRAY);</span> <span class="token comment">//imshow("gray", image);</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>image<span class="token punctuation">.</span><span class="token function">channels</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span> <span class="token comment">//三通道分离</span> vector<span class="token operator"><</span>Mat<span class="token operator">></span> bgr_plane<span class="token punctuation">;</span> <span class="token function">split</span><span class="token punctuation">(</span>image<span class="token punctuation">,</span> bgr_plane<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//定义参数变量</span> <span class="token keyword">const</span> int channels<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">0</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">const</span> int bins<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">256</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> float hranges<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span> <span class="token punctuation">}</span><span class="token punctuation">;</span> <span class="token keyword">const</span> float<span class="token operator">*</span> ranges<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span> hranges <span class="token punctuation">}</span><span class="token punctuation">;</span> Mat b_hist<span class="token punctuation">;</span> Mat g_hist<span class="token punctuation">;</span> Mat r_hist<span class="token punctuation">;</span> <span class="token comment">//计算Blue,green,red通道的直方图</span> <span class="token function">calcHist</span><span class="token punctuation">(</span><span class="token operator">&</span>bgr_plane<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> b_hist<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> bins<span class="token punctuation">,</span> ranges<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">calcHist</span><span class="token punctuation">(</span><span class="token operator">&</span>bgr_plane<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> g_hist<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> bins<span class="token punctuation">,</span> ranges<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">calcHist</span><span class="token punctuation">(</span><span class="token operator">&</span>bgr_plane<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> r_hist<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> bins<span class="token punctuation">,</span> ranges<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//参数1;输入图像地址,参数2:1张图片(指针可以指向多个图),参数3:0表示一个通道,参数4:mask使用Mat()空计算整张图像,</span> <span class="token comment">//参数5:输出,参数6:1维,参数7:bins(256个灰度级别),参数8;ranges直方图范围</span> <span class="token comment">//用mv来接收计算得到直方图数据,在后面的y坐标绘制中会使用到(防止b_hist等中途被修改)</span> Mat mv<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">;</span> mv<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> b_hist<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//在后面的y坐标显示会用到此</span> mv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">=</span> g_hist<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> mv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span> <span class="token operator">=</span> r_hist<span class="token punctuation">.</span><span class="token function">clone</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//opencv的从数据到图像需要自己绘制</span> <span class="token comment">//显示直方图</span> int hist_w <span class="token operator">=</span> <span class="token number">512</span><span class="token punctuation">;</span> int hist_h <span class="token operator">=</span> <span class="token number">400</span><span class="token punctuation">;</span> int bin_w <span class="token operator">=</span> <span class="token function">cvRound</span><span class="token punctuation">(</span><span class="token punctuation">(</span>double<span class="token punctuation">)</span>hist_w <span class="token operator">/</span> bins<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//cvRound():返回跟参数最接近的整数值,即四舍五入;</span> Mat histImage <span class="token operator">=</span> Mat<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">zeros</span><span class="token punctuation">(</span><span class="token number">408</span><span class="token punctuation">,</span> <span class="token number">560</span><span class="token punctuation">,</span> <span class="token constant">CV_8UC3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//创建画布时多余的位置用于坐标显示</span> <span class="token comment">//归一化直方图数据(三个通道计算的最小最大值范围不同,将其归一化到一个范围之间(画布高内),显示的时候不会超出画布范围)</span> <span class="token function">normalize</span><span class="token punctuation">(</span>b_hist<span class="token punctuation">,</span> b_hist<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> histImage<span class="token punctuation">.</span>rows<span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">normalize</span><span class="token punctuation">(</span>g_hist<span class="token punctuation">,</span> g_hist<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> histImage<span class="token punctuation">.</span>rows<span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">normalize</span><span class="token punctuation">(</span>r_hist<span class="token punctuation">,</span> r_hist<span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> histImage<span class="token punctuation">.</span>rows<span class="token punctuation">,</span> <span class="token constant">NORM_MINMAX</span><span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token function">Mat</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//绘制直方图曲线(在一个mat图像上使用line绘制)</span> <span class="token keyword">for</span> <span class="token punctuation">(</span>int i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><</span> bins<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span><span class="token punctuation">{<!-- --></span> <span class="token function">line</span><span class="token punctuation">(</span>histImage<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>b_hist<span class="token punctuation">.</span>at<span class="token operator"><</span>float<span class="token operator">></span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>b_hist<span class="token punctuation">.</span>at<span class="token operator"><</span>float<span class="token operator">></span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">line</span><span class="token punctuation">(</span>histImage<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>g_hist<span class="token punctuation">.</span>at<span class="token operator"><</span>float<span class="token operator">></span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</span>g_hist<span class="token punctuation">.</span>at<span class="token operator"><</span>float<span class="token operator">></span><span class="token punctuation">(</span>i<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token function">Scalar</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token number">255</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token function">line</span><span class="token punctuation">(</span>histImage<span class="token punctuation">,</span> <span class="token function">Point</span><span class="token punctuation">(</span>bin_w<span class="token operator">*</span><span class="token punctuation">(</span>i <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">,</span> hist_h <span class="token operator">-</span> <span class="token function">cvRound</span><span class="token punctuation">(</sp