opencv4
一、数据载入显示和储存
1.Mat类
cv::Mat a(640,480,CN_8UC3); //640*480 3通道
cv::Mat a(Size(480,640),CV_8UC1);
Mat m = a.clone();//克隆
Mat b = (a,Range(2,5),Range(3,5));//截取a中2-5行,3-5列
Mat b(2,2,CV_8UC3,Scalar(0,0,255));//构造时赋值
Mat a = Mat::eye(3,3,CV_8UC1)//构造单位矩阵
Mat::diag(...),Mat::ones(...),Mat::zeros(...);
2.Mat的加减乘除
3.Mat类元素读取
1)at方法
//uchar 表示八位无符号整数
int value = (int)a.at<uchar>(0,0);//单通道
Vec3b vc3 = b.at<Vec3b>(0,0);//三通道
2)指针ptr
uchar *ptr = b.ptr<uchar>(0);
3)迭代器
MatIterator_<uchar> it = a.begin<uchar>();
MatIterator_<uchar> it_end = a.end<uchar>();
4.图形读取和显示
1)imread()
2)namedWindow()
创建窗口,可赋予窗口部分属性
3)imshow()
5.视频加载和摄像头调用
string path = "Resources/video_test.mp4";
//VideoCapture cap(0)调用摄像头
VideoCapture cap(path);
Mat img;
while (1){cap.read(img);//namedWindow("image",WINDOW_FREERATIO);imshow("image",img);waitKey(10);
}
6.数据保存
imwrite()
VideoWriter()
FileStorage() open() write() 处理XML
二、图像基本操作
1.图像颜色空间
RGB 0-255
HSV 色度、饱和度、亮度
GRAY 灰度
YUV、Lab
1)cvtcolor()
COLOR_BGR2GRAY
COLOR_BGR2HSV
...
2)convertTo() 类型转换
2.多通道分离和合并
####split()、merge()
3.图像像素操作处理
1)minMaxLoc() 寻找图像像素最大最小值
2)meanStdDev() 计算图像平均值和标准差
3)两图像间操作
max() min() 分别比较两幅图像中每一个元素灰度值的大小,保留较大〈较小〉的灰度值
逻辑运算
4.图像二值化
"非黑即白"图像像素灰度值无论在什么数据类型中都只有最大值和最小值两种取值,因此称为二值图像.
threshold(src,dst,thresh,maxval,type)
thresh 为阈值,maxval为最大值
adaptiveThreshold()
5.LUT
显示查找表(LUT).简单来说.LUT就是一个像素灰度值的映射表。
6.图像变换
1)图像连接
vconcat() 上下连接
hconcat() 左右连接
2)risize() 尺寸变换
3)flip() 图像翻转变换
4)图像仿射变换
在 OpenCV 中并没有专门图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转,首先需要确定旋转角度和旋转中心,之后确定旋转矩阵,最终通过仿射变换实现图像旋转
1.getRotationMatrix2D()
2.warpAffine()
3.getAffineTransform()
仿射变换又叫三点变换,可利用3个对应像素点来确定变换矩阵 M M M的函数
5)图像透视变换
透射变换又叫四点变换
1.getPerspectiveTransform()
2.warpPerspective()
应用:将相机视线不垂直于二维码平面拍摄的图像经过透视变换成相机视线垂直于二维码平面
6)warpPolar() 极坐标变换
7.绘制几何图形
circle() line() ellipse() 椭圆
矩形 rectangle()
Rect变量,储存左上角像素坐标,矩形长宽
fillPoly() 生成矩形
文字生成 putText()
8.感兴趣区域(ROI)
Rect Range() 深浅拷贝与copyTo()
Mat img = imread("test.png");
img2 = img;//浅拷贝
//深拷贝两种方式
img.copyTo(img_copy2);
copyTo(img,img_copy,img);
Rect rect (206,206,200,200);//定义ROI
ROI1 = img(rect);//截图
ROI2 = img(Range(300,500),Range(300,500));//第二种截图方式
img(range(300,500),range(300,500)).copyTo(ROI2_copy);//深拷贝
9.图像“金字塔”
多种分辨率表示图像,分辨率逐渐降低、变大
1)高斯金字塔
pyrDown()
2)拉普拉斯金字塔
pyrUp()
10.窗口交互操作
1)图像窗口滑动条
createTrackbar()
2)鼠标响应
setMouseCallback()
三、图像直方图与模板匹配
图像直方图就是统计图像中每个灰度值的个数,之后将图像灰度值作为横轴,以灰度值个数或者灰度值所占比率作为纵轴绘制的统计图.
在通常情况下 像素灰度值代表亮暗程度,因此
通过图像直方图可以分析图像亮暗对比度并调整图像的亮暗程度
1.图像直方图绘制
1)calcHist() 建议统计单通道
绘制直方图 通过不断绘制矩形的方式实现直方图的绘制,由于图像中部分灰度值像素数目较多,因此将每个灰度值数目缩小。
Mat hist;//存放直方图计算结果
const int channels[1] = { 0 }//通道索引
float inRanges[2] = {0,255};
const float *ranges[1] = {inRanges};//像素灰度值范围
const int bins[1] = {256};//直方图维度,其实就是像素灰度值最大值
calcHist(&gray,1,channels,Mat(),hist,1,bins,ranges);
...//绘制过程
2.直方图操作
1)直方图归一化
normalize()
2)直方图比较
compareHist() 比较直方图相似程度
3.直方图应用
调整直方图分布提高图像对比度
利用直方图反向投影寻找相同区域
将图像的对比度调整为指定的形式
1)直方图均衡化
通过映射关系,将图像中的灰度值范围扩大,增加原来两个灰度值之间的差值,提高图像的对比度,进而将图像中的纹理凸显出来
equalizeHist(src,dst)
用于单通道灰度图
2)直方图匹配
映射成指定分布形式,可凸显某一部分
一般来说n映射为r,V表示个灰度级的积累概率
满足 n , r = a r g m i n ∣ V 原 ( n ) − V 匹 ( r ) ∣ n,r = argmin|V_原(n) - V_匹(r)| n,r=argmin∣V原(n)−V匹(r)∣
3)直方图反向投影
首先计算某一特征的直方图模型,然后使用该模型去寻找图像中是否存在该特征
calcBackProject()
4.图像的模板匹配
滑动窗口比较像素灰度值
matchTemplate()
四、图像滤波
1.图像卷积
如果卷积模板选取不当,那么极有可能造成卷积结果超过数据范围的情况发生,因此,图像卷积操作常通过缩放使得所有数值的和为1
filter2D()
2.噪声的种类与生成
1)椒盐噪声(脉冲噪声)
随机改变图像中的像素值
int a = cvflann::rand()
2)高斯噪声
噪声分布的概率密度函数服从高斯分布(正态分布)
fill(),RNG::fill()
3.线性滤波
1)均值滤波
blur() 滤波器的尺寸越大,滤波后图像越模糊
2)方框滤波
boxFilter() 与blur类似,可以选择输出图像的数据类型及是否进行归一化操作
sqrBoxFilter()
3)高斯滤波 GaussianBlur()
getGaussianKernel()
4)可分离滤波 sepFilter2D()
4.非线性滤波
非线性滤波可能包含排序,逻辑计算,可能通过逻辑判断将噪声过滤掉
线性滤波中噪声不会被消除,而是以更柔和的形式存在
1)中值滤波 medianBlur()
中值滤波就是用滤波器范围内所有像素值的中值来替代滤波器中心位置像索值的滤波方法 基于排序统计原理
2)双边滤波 bilateralFilter()
保留图像边缘信息 运行时间长,需要合理选择效果 “美颜”效果
5.图像的边缘检测
1)原理
像素灰度值突然变化的区域
变化趋势可用导数描述
filter2D()
convertScaleAbs() 计算矩阵中所有数据绝对值
2)Sobel算子 Sobel()
3)Scharr算子 Scharr() 对较弱边缘提取效果差
4)生成边缘检测滤波器 myGetDerivKernels()
5)Laplacian() 有各方向性的特点(X,Y)
6)Canny算法 不易受噪声影响,能识别图像中弱边缘和强边缘 十分优越
先要高斯模糊
五、图像形态学操作
1.像素距离与连通域
1)图像像素距离变换
2)图像连通域分析
车牌识别、文字识别、目标检测等领域对roi的分割与识别
邻域 4-邻域 8-邻域
2.腐蚀和膨胀
腐蚀清除面积较小的连通域
1)腐蚀 erode()
getStructingElement()
2)膨胀 dilate()
3.形态学应用
腐蚀可去除细小噪声区域,但会将图像主要区域的面积缩小,造成主要区域的形状发生改变
膨胀可以扩充每一个区域的面积,填充较小的空洞,但会增加噪声的面积
主要函数:morphologyEx()
1)开运算:腐蚀后膨胀
消除较小连通域,保留较大连通域,在两个物体的纤细连接处分离
2)闭运算:膨胀后腐蚀
去除连通域内小型空洞,平滑物体轮廓,连接两个临近的连通域
3)形态学梯度
4)顶帽运算:原图像与开运算结果之间的差值
往往用来分离比邻近点亮一些的斑块
5)黑帽运算
往往用来分离比邻近点暗一些的斑块
6)击中击不中变换
7)图像细化 thinning()
主要应用于线条形状组成的物体,常用于文字识别
六、目标检测
1.形状检测
1)霍夫变换
B站看原理解释 将x-y直线用垂直于他的r-θ直线 r-θ曲线交点
HoughLines()
HoughLinesP() 可以进一步确定直线位置
HoughLinesPointSet() 在二维点集中寻找直线
2)直线拟合 fitLine()
最小二乘法
3)圆形检测
霍夫变换 HoughCircles()
2.轮廓检测
1)轮廓发现与绘制
轮廓层级关系
四个参数表示 同层下一个,同层上一个,子层第一个,父层
没有的用-1表示
findContors() 在二值图像中检测图像所有轮廓并生成不同轮廓结构关系
drawContours()
2)轮廓面积,周长
contourArea(),arcLength()
3)轮廓外接多边形
boundingRect() 最大外接矩形
minAreaRect() 最小外接矩形
approxPolyDP() 用于寻找逼近轮廓的多边形
4)点到轮廓距离 pointPolygonTest()
5)凸包检测
3.矩的计算
1)几何矩与中心矩
2)Hu矩与基于Hu矩的轮廓匹配
4.点集拟合
minEnclosingTriangle() minEnclosingCircle()
QR二维码检测
定位 detect() 解码 decode()
detectAndDecode()
七、图像分析与修复
1.傅里叶变换
1)离散傅里叶变换
2)傅里叶变换进行卷积
将两个矩阵的卷积转换成两个矩阵傅里叶变换结果的乘积
极大提高卷积的计算速度
mulSpectrums() 计算两个复数矩阵的乘积
3)离散余弦变换 dct() idct()
2.积分图像
快速计算图像某些区域像素的平均灰度
3.图像分割
将图像中属于某一类的像素点与其他像素点分开
1)漫水填充法
floodFill() 局部分割
2)分水岭法
全局分割 watershed()
3)Grabcut法
grabCut()
4)Mean-Shift法
输出 颜色渐变,纹理平缓
pyrMeanShiftFiltering()
4.图像修复
图像修复技术就是利用图像中损坏区域边缘的像素,根据像素值的大小以及像素间的结构关系,估计出损坏区域可能的像素排列。
inpaint() 对较少污染进行修复
八、特征点检测与匹配
1.角点检测
角点:图像中某些属性突出的像素点
1)显示关键点
通常可以理解为特征点是关键点与描述子的组合
drawKeypoints() 一次性绘制所有关键点
KeyPoint类
2)Harris角点检测
3)Shi-Tomas角点检测
4)亚像素级别角点检测
2.特征点检测
1)关键点
Features2D虚类
类中定义了关键点检测函数,描述子计算函数,描述子类数据类型及读写操作等函数
detect()
2)描述子
compute() detectAndCompute()
3)SIFT特征点检测
计算速度较慢,无法应用于实时的系统中
4)SURF特征点检测
5)ORB特征点检测
更快
3.特征点匹配
在两个图像中寻找具有相似描述子的两个特征点
两类,1.计算两个描述子之间的欧氏距离 SIFT SURF
2.计算两个描述子之间的汉明距离 ORB BRISK
相机移动导致成像视场发生改变,同一个物体会出现在图像中的不同位置
特征点匹配可以快速定位物体在新图像中的位置
1)DescriptorMatcher类
2)暴力匹配
计算训练描述字迹合中每个描述子与查询描述子之间的距离,之后将所有距离排序,选择距离最小或者距离满足阈值要求的描述子作为匹配结果
BFMatcher()
3)显示特征点匹配结果 drawmathces()
4)FLANN匹配 FlannBasedMatcher()
5)RANSAC优化特征点匹配
提高特征点匹配精度
九、立体视觉
1.单目视觉
1)单目相机模型
像素坐标系 图像坐标系
小孔成像+凸透镜 畸变
齐次坐标 非齐次坐标
2)标定板角点提取
3)单目相机标定
4)单目相机校正
5)单目投影
6)单目位姿估计
只要知道世界坐标系中 个点的三维坐标和对应图像中的坐标,根据相机内参
矩阵和畸变系数就可以解算世界坐标系与相机坐标系之间的转换关系.
2.双目视觉
获得空间点的深度信息
1)双目相机模型
2)双目相机标定
3)双目相机校正
十、视频分析
1.差值法检测移动物体
通常转换成灰度图像再计算差值,减少复杂性
易受到光照、噪声等干扰的影响---->通过二值化、开闭运算等操作减少影响
absdiff()
2.均值迁移法目标跟踪
1) meanShift()
鼠标选取目标区域 selectROI()
2)自适应均值迁移法
根据目标的状态更改目标区域的大小
CamShift()
3.光流法目标跟踪
1)Farneback多项式扩展算法
处理慢,难以实时跟踪