OPENCV函数汇总(哈哈不全版)

@OPENCV函数汇总(哈哈不全版)

Mat img = imread(“E:\imagelib\02.jpg”);
namedWindow(“杨超越”, WINDOW_NORMAL);
imshow(“杨超越”, img);
waitKey(0);

VideoCapture capture(0);//opencv调用摄像头读取视频
while (1)
{
Mat frame;
capture >> frame;
imshow(“读取视频”, frame);
if (waitKey(30) == 27)//按下Esc键退出读取视频操作
break;
}

cvtColor(frame, edges, CV_BGR2GRAY);
blur(edges, edges, Size(7, 7));
Canny(edges, edges, 0, 30, 3);

函数:void namedWindow(“名称”,int flags=WINDOW_AUTOSIZE);
WINDOW_AUTOSIZE:窗口大小不可调。
WINDOW_NORMAL:窗口大小可调。

滑动条的创建和使用
函数:int createTrackbar(轨迹条名字,依附的窗口名,int* value(滑块位置),int count,TrackbarCallback onChange=0(回调函数),void* userdata=0)
回调函数void on_Trackbar(int,void*)

鼠标操作
函数:void setMouseCallback(窗口名称,MouseCallback onMouse(回调函数),void* userdata=0(用户传递到回调函数的参数))
回调函数void Foo(int event,int x,int y,int flags,void* param)

第二部分 初探core组件

Mat M = (2, 2, CV_8UC3, Scalar(0, 0, 255));
2,2为二维矩阵的大小
CV_[位数][带符号与否][类型前缀]C[通道数]
Scalar(a,b,c,d)四个参数,是一个类。表示颜色
在RGB中,前三个依次为B,G,R,最后一个可不写。
输出Mat矩阵
cout << “M =” << endl << " " << M << endl << endl;

颜色的表示:Scalar类
Scalar(0,0,255)

点的表示:Point类
Point point;
Point.x=10;
Point.y=8;
或者Point point(10,8);

尺寸的表示:Size类
Size(5,5)

矩形的表示:Rect类
Rect类的成员变量有下x,y,width,height,分别为左上角点的坐标和矩形的宽和高。常用的成员函数有:Size()返回值为Size();area()返回矩形的面积。Constrins(Point)判断点是否在矩形内;inside(Rect)函数判断矩形是否在矩形内;tl返回左上角点的坐标;br()返回右下角点的坐标。还可对矩形进行交集、并集、平移和缩放操作。

cvtColor()函数
cvtColor(原图,目标图,标号,通道数(可不写))
绘图函数

颜色空间缩减
对每个像素实施Inew=(Iold/div)*div,可将颜色空间所见div的立方倍
函数为:colorReduce(srcImage,dstImage,div);

计时函数
double time0 = static_cast(getTickCount());

time0 = ((double)getTickCount() - time0) / getTickFrequency();//计算算法运行时间

访问图像中像素的三类方法:
指针访问:C操作符[]
迭代器 iterator
动态地址计算

线性混合操作
函数:addWeighted(输入图像1,占比,输入图像2,占比,整体偏移量,输出图像,int dtype=-1

通道分离:split(srcImage,channels)
通道合并:merge(channels,通道数(可以省略),srcImage)

离散傅里叶变换
函数:void dft(srcImage,dstImage,int flags=0(可选择做哪种傅里叶变换),int nonzeroRows=0(选择自己想要处理的非零行,比如输出矩阵C.rows))
其他一些可能用到的函数:
返回DFT最优尺寸大小:getOptimalDFTSize()函数
扩充图像边界:copyMakeBorder()函数
计算二维矢量的幅值:magnitude()函数 138
计算自然对数:log()函数
矩阵归一化:normalize()函数

第三部分 掌握imgproc组件

方框滤波:邻域像素平均值
函数:boxFilter()
均值滤波:邻域像素平均值+归一化
函数:blur()
高斯滤波:邻域像素加权平均值,处理高斯噪声
函数:GaussianBlur()

非线性滤波:中值滤波、双边滤波
中值滤波:领域像素中值,去除脉冲噪声、散粒噪声、椒盐噪声
函数:medianBlur()
双边滤波:比高斯滤波多了一个高斯方差
函数:bilateralFilter()

对于一幅二值化图片,认为前景是高亮部分(灰度值较高),背景是灰暗部分(灰度值较低)。
膨胀:寻找邻域内灰度最大值代替该点灰度值,相当于高亮部分增多,所以称为膨胀。
函数:dilate()
腐蚀:寻找邻域内灰度最小值代替该点灰度值,相当于灰暗部分增多,所以称为腐蚀。
函数:erode()

开运算:先腐蚀,后膨胀
闭运算:先膨胀、后腐蚀
形态学梯度:膨胀图与腐蚀图之差
顶帽:原图与开运算之差
黑帽:闭运算与结果之差
上述形态学滤波函数均可由morphologyEx()函数实现
morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT , element) 最后为自定义核

漫水填充是一种用特定的颜色填充连通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的办法。
函数:floodFill();

拉格朗日金字塔:原图像利用高斯采样经先缩小再增大
向上采样:扩大尺寸
函数:pyrUp()
向下采样:减小尺寸
函数:pyrDown()

尺寸调整:resize();
可选择增大或缩小倍数,或直接给出输出图像大小。
也可选择插值方式,通常选择效率较高的线性插值。

固定阈值操作:Threshold()函数
5种操作。0-4
0:二进制阈值1:反二进制阈值 2:截断阈值 3:阈值化为0 4:反阈值化为0
自适应阈值操作:adaptiveThreshold()函数

边缘检测几种方法:
canny算子:带两个阈值,内部使用Sobel算子。
sobel算子: 分别求x,y方向的梯度,然后融合,实现边缘检测。
Laplacian 算子:使用sobel算子二阶微分。
scharr滤波器:内核为3不能变。

霍夫变换主要用来快速准确地检测出直线或者圆。
须先进行边缘检测:
标准霍夫变换:HoughLines()函数
累计概率霍夫变换:HoughLinesP()函数
霍夫圆变换:HoughCircles()函数

实现重映射:remap()函数
重映射:就是把一幅图像中某位置的像素放置到另一个图片指定位置的过程。可进行X方向镜面,Y方向镜面,等多重映射。通过改变参数map.x以及map.y。

对图像进行旋转、平移、缩放。
进行仿射变换:warpAffine()函数 ,需要输入仿射变换矩阵M (2*3)
getAffineTransform(),通过原图像与目标图像各三点求取仿射变换矩阵M
计算二维旋转变换矩阵:getRotationMatrix2D()函数,通过绕点,角度,缩放尺度来计算旋转矩阵M

实现直方图均衡化:equalizeHist(src,dst)函数

从二值图像中查找轮廓。
寻找轮廓:findContours()函数
绘制轮廓:drawContours()函数

凸包:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形。
寻找凸包:convexHull()函数
存在hull中,可使用line函数或者drawContours()函数将其绘制出来。

返回外部矩形边界:boundingRect()函数
寻找最小包围矩形:minAreaRect()函数 (可以是斜着的)
寻找最小包围圆形:minEnclosingCircle()函数
用椭圆拟合二维点集:fitEllipse()函数
逼近多边形曲线:approxPolyDP()函数 ,使用方法类似凸包,结果存在counters_poly中,需使用line或者drawContours()绘制出来。

矩用来计算形状的重心、面积,主轴和其他形状特征。
矩的计算:moments()函数
计算轮廓面积:contourArea()函数
计算轮廓长度:arcLength()函数
轮廓面积也可以矩的.m00计算,结果与contourArea()一致。

实现分水岭算法:watershed()函数
图像分割的一种,分割前需要大致勾画出需要分割的区域。

图像修复主要用来解决图象被噪声腐蚀的问题,比如镜头上的水滴、灰尘或者是旧照片的划痕。
主要是利用那些已经被破坏的区域的边缘,即边缘的颜色和结构,繁殖和混合到损坏的图像中,以达到图像修补的目的。
实现图像修补:inpaint()函数

第9

计算直方图:calcHist()函数
计算出来存在MatND类型的hist中,如需绘图,还需进行归一化,绘制。
找寻最值:minMaxLoc()函数 ,可以返回最大值指针,最小值指针,最大值对应位置指针,最小值对应位置指针。

对比直方图:compareHist()函数 有四种方式进行对比。

反像投影中存储的数值反应的是该像素对应亮度所在直方图中的bin区间中的值的概率。
反向投影的作用:反像投影可用于在输入图像(通常较大)中查找与特定图像(通常较小或者仅一个像素,也就是模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。
计算反向投影:calcBackProject()函数
使用反像投影匹配:cvCalcBackProjectPatch()函数
通道复制:mixChannels()函数
可实现通道分离,合并,交换,重新分配

模板匹配是一项在一幅图像中寻找与另一幅模板图像最匹配(相似)部分的技术。
实现模板匹配:matchTemplate()函数
有六种方法进行匹配

第四部分 深入feature2d组件

实现Harris角点检测:cornerHarris()函数

确定图像强角点:goodFeaturesToTrack()函数
不需要比较阈值,只需给出最大检测角点处,以及角点间允许最小距离,检测出的角点存在vector中。

goodFeaturesToTrack()函数只能提供像素坐标的整数值,有时需要实数坐标值,
这时需要cornerSubPix()函数。
寻找亚像素角点:cornerSubPix()函数

SURF是尺度不变特征变换算法(SIFT)的加速版。一般来说,标准的SURF算子比SIFT算子快好几倍,并且在多幅图片下具有更好的稳定性。
SurfFeatureDetector detector
detector.detect进行检测特征点。
绘制关键点:drawKeypoints()函数
KeyPoint类用于存储特征点。

SURF特征提取步骤:
1.检测特征点:SurfFeatureDetector detector -> detector.detect
2.计算描述子(特征向量)SurfDescriptorExtractor extractor -> extractor.compute
3.特征匹配:BruteForceMatcher< L2 > matcher –> matcher.match
4.绘制匹配点:drawMatches()函数

另一种特征匹配方法,可实现快速高效匹配。
FlannBasedMatcher类
DescriptorMatcher::match

在FLANN特征匹配基础上,还可以进一步利用Homography映射找出已知物体。
寻找透视变换:findHomography()函数
进行透视矩阵变换:perspectiveTransform()函数
步骤:
使用findHomography()函数寻找匹配上的关键点的变换。
使用perspectiveTransform()函数来映射点。

ORB算法是brief算法的改进版。
ORB算法概述算法比sift算法效率高两个数量级,而在计算速度上,ORB是sift的100倍,是surf的10倍。ORB算法综合性能在各种测评里相较于其他提取算法是最好的。
BRIEF的优点在于速度,缺点也很明显。
 不具备旋转不变性。
 对噪声敏感。
 不具备尺度不变性。
ORB算法解决了上述缺点的1.2,但未解决3.但后续如果用在视频处理,可通过跟踪等策略解决。
OrbFeatureDetector featureDetector 特征检测
OrbDescriptorExtractor featureExtractor; 计算描述子
基于FLANN的描述符对象匹配

作者:鹏程朋诚
来源:CSDN
原文:https://blog.csdn.net/qq_36163358/article/details/86484958

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值