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(...);
//uchar 表示八位无符号整数
int value = (int)a.at<uchar>(0,0);//单通道
Vec3b vc3 = b.at<Vec3b>(0,0);//三通道
uchar *ptr = b.ptr<uchar>(0);
MatIterator_<uchar> it = a.begin<uchar>();
MatIterator_<uchar> it_end = a.end<uchar>();
创建窗口,可赋予窗口部分属性
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);
}
imwrite()
VideoWriter()
FileStorage() open() write() 处理XML
RGB 0-255
HSV 色度、饱和度、亮度
GRAY 灰度
YUV、Lab
COLOR_BGR2GRAY
COLOR_BGR2HSV
...
####split()、merge()
max() min() 分别比较两幅图像中每一个元素灰度值的大小,保留较大〈较小〉的灰度值
逻辑运算
"非黑即白"图像像素灰度值无论在什么数据类型中都只有最大值和最小值两种取值,因此称为二值图像.
thresh 为阈值,maxval为最大值
显示查找表(LUT).简单来说.LUT就是一个像素灰度值的映射表。
vconcat() 上下连接
hconcat() 左右连接
在 OpenCV 中并没有专门图像旋转的函数,而是通过图像的仿射变换实现图像的旋转。实现图像的旋转,首先需要确定旋转角度和旋转中心,之后确定旋转矩阵,最终通过仿射变换实现图像旋转
1.getRotationMatrix2D()
2.warpAffine()
3.getAffineTransform()
仿射变换又叫三点变换,可利用3个对应像素点来确定变换矩阵 M M M的函数
透射变换又叫四点变换
1.getPerspectiveTransform()
2.warpPerspective()
应用:将相机视线不垂直于二维码平面拍摄的图像经过透视变换成相机视线垂直于二维码平面
circle() line() ellipse() 椭圆
Rect变量,储存左上角像素坐标,矩形长宽
fillPoly() 生成矩形
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);//深拷贝
多种分辨率表示图像,分辨率逐渐降低、变大
pyrDown()
pyrUp()
createTrackbar()
setMouseCallback()
图像直方图就是统计图像中每个灰度值的个数,之后将图像灰度值作为横轴,以灰度值个数或者灰度值所占比率作为纵轴绘制的统计图.
在通常情况下 像素灰度值代表亮暗程度,因此
通过图像直方图可以分析图像亮暗对比度并调整图像的亮暗程度
绘制直方图 通过不断绘制矩形的方式实现直方图的绘制,由于图像中部分灰度值像素数目较多,因此将每个灰度值数目缩小。
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);
...//绘制过程
normalize()
compareHist() 比较直方图相似程度
调整直方图分布提高图像对比度
利用直方图反向投影寻找相同区域
将图像的对比度调整为指定的形式
通过映射关系,将图像中的灰度值范围扩大,增加原来两个灰度值之间的差值,提高图像的对比度,进而将图像中的纹理凸显出来
equalizeHist(src,dst)
用于单通道灰度图
映射成指定分布形式,可凸显某一部分
一般来说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)∣
首先计算某一特征的直方图模型,然后使用该模型去寻找图像中是否存在该特征
calcBackProject()
滑动窗口比较像素灰度值
matchTemplate()
如果卷积模板选取不当,那么极有可能造成卷积结果超过数据范围的情况发生,因此,图像卷积操作常通过缩放使得所有数值的和为1
filter2D()
随机改变图像中的像素值
int a = cvflann::rand()
噪声分布的概率密度函数服从高斯分布(正态分布)
fill(),RNG::fill()
blur() 滤波器的尺寸越大,滤波后图像越模糊
boxFilter() 与blur类似,可以选择输出图像的数据类型及是否进行归一化操作
sqrBoxFilter()
getGaussianKernel()
非线性滤波可能包含排序,逻辑计算,可能通过逻辑判断将噪声过滤掉
线性滤波中噪声不会被消除,而是以更柔和的形式存在
中值滤波就是用滤波器范围内所有像素值的中值来替代滤波器中心位置像索值的滤波方法 基于排序统计原理
保留图像边缘信息 运行时间长,需要合理选择效果 “美颜”效果
像素灰度值突然变化的区域
变化趋势可用导数描述
filter2D()
convertScaleAbs() 计算矩阵中所有数据绝对值
先要高斯模糊
车牌识别、文字识别、目标检测等领域对roi的分割与识别
邻域 4-邻域 8-邻域
腐蚀清除面积较小的连通域
getStructingElement()
腐蚀可去除细小噪声区域,但会将图像主要区域的面积缩小,造成主要区域的形状发生改变
膨胀可以扩充每一个区域的面积,填充较小的空洞,但会增加噪声的面积
主要函数:morphologyEx()
消除较小连通域,保留较大连通域,在两个物体的纤细连接处分离
去除连通域内小型空洞,平滑物体轮廓,连接两个临近的连通域
往往用来分离比邻近点亮一些的斑块
往往用来分离比邻近点暗一些的斑块
主要应用于线条形状组成的物体,常用于文字识别
B站看原理解释 将x-y直线用垂直于他的r-θ直线 r-θ曲线交点
HoughLines()
HoughLinesP() 可以进一步确定直线位置
HoughLinesPointSet() 在二维点集中寻找直线
最小二乘法
霍夫变换 HoughCircles()
轮廓层级关系
四个参数表示 同层下一个,同层上一个,子层第一个,父层
没有的用-1表示
findContors() 在二值图像中检测图像所有轮廓并生成不同轮廓结构关系
drawContours()
contourArea(),arcLength()
boundingRect() 最大外接矩形
minAreaRect() 最小外接矩形
approxPolyDP() 用于寻找逼近轮廓的多边形
minEnclosingTriangle() minEnclosingCircle()
定位 detect() 解码 decode()
detectAndDecode()
将两个矩阵的卷积转换成两个矩阵傅里叶变换结果的乘积
极大提高卷积的计算速度
mulSpectrums() 计算两个复数矩阵的乘积
快速计算图像某些区域像素的平均灰度
将图像中属于某一类的像素点与其他像素点分开
floodFill() 局部分割
全局分割 watershed()
grabCut()
输出 颜色渐变,纹理平缓
pyrMeanShiftFiltering()
图像修复技术就是利用图像中损坏区域边缘的像素,根据像素值的大小以及像素间的结构关系,估计出损坏区域可能的像素排列。
inpaint() 对较少污染进行修复
角点:图像中某些属性突出的像素点
通常可以理解为特征点是关键点与描述子的组合
drawKeypoints() 一次性绘制所有关键点
KeyPoint类
Features2D虚类
类中定义了关键点检测函数,描述子计算函数,描述子类数据类型及读写操作等函数
detect()
compute() detectAndCompute()
计算速度较慢,无法应用于实时的系统中
更快
在两个图像中寻找具有相似描述子的两个特征点
两类,1.计算两个描述子之间的欧氏距离 SIFT SURF
2.计算两个描述子之间的汉明距离 ORB BRISK
相机移动导致成像视场发生改变,同一个物体会出现在图像中的不同位置
特征点匹配可以快速定位物体在新图像中的位置
计算训练描述字迹合中每个描述子与查询描述子之间的距离,之后将所有距离排序,选择距离最小或者距离满足阈值要求的描述子作为匹配结果
BFMatcher()
提高特征点匹配精度
像素坐标系 图像坐标系
小孔成像+凸透镜 畸变
齐次坐标 非齐次坐标
只要知道世界坐标系中 个点的三维坐标和对应图像中的坐标,根据相机内参
矩阵和畸变系数就可以解算世界坐标系与相机坐标系之间的转换关系.
获得空间点的深度信息
通常转换成灰度图像再计算差值,减少复杂性
易受到光照、噪声等干扰的影响---->通过二值化、开闭运算等操作减少影响
absdiff()
鼠标选取目标区域 selectROI()
根据目标的状态更改目标区域的大小
CamShift()
处理慢,难以实时跟踪