轮廓:一个轮廓代表一系列的点(像素),这一系列的点构成一个有序的点集,所以可以把一个轮廓理解为一个有序的点集。
在opencv中,提供了一个函数返回一个有序的点集或者有序的点集的集合(指多个有序的点集),函数findContour是从二值图像中来计算轮廓的,一般使用Canny()函数处理后的图像,因为这样的图像含有边缘像素。
寻找轮廓的API函数:
findContours(image,vector<vector<Point>> contours,vector<Vec4i>hierarchy,int mode,int method,Point offset = Point(0,0));
参数解释:
(1)image:单通道图像矩阵,一般是经过canny处理后的二值图像;
(2)contours:vector<vector<Point>>类型,是一个向量,并且是一个双重向量,向量内每个元素保存了一组由连续的Point点构成的点的集合的向量,每一组Point点集就是一个轮廓。有多少轮廓,向量contours就有多少元素;
(3)hierarchy:vector<Vec4i> 类型, 即容器内每一个元素都是一个包含了4个int型变量的向量,向量内每个元素保存了一个包含4个int整型的数组。向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1;
(4)mode:int类型的,定义轮廓的检索模式:
(5)method:int类型,定义轮廓的近似方法:
(6) Point:偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,一般不偏移取Point(0,0)。
画轮廓的API函数:
drawContours(Outputimage,contours,hierarchy,int contourIdx,color,int thickness ,int lineType,hierarchy = noArray(),int maxLevel = INT_MAX,Point offset = Point(0,0))
参数解释:
(1)outputimage: 将轮廓画在该图上;
(2)contours:前面寻找到的轮廓;
(3)contourIdx:是一个索引,代表绘制contours中的第几个轮廓;
(4) color:颜色;
(5)thickness: 线宽;
(6)lineType: 线型;
(7)hierarchy:可选层次信息结构,这里面是findContours所的到的基于Contours的层级信息;
(8)maxLevel: 绘制轮廓的最大等级。如果等级为0,绘制单独的轮廓。如果为1,绘制轮廓及在其后的相同的级别下轮廓。如果等级为2,绘制所有同级轮廓及所有低一级轮廓,诸此种种。如果值为负数,函数不绘制同级轮廓,但会升序绘制直到级别为abs(max_level)-1的子轮廓;
(9)offset:照给出的偏移量移动每一个轮廓点坐标.当轮廓是从某些感兴趣区域(ROI)中提取的然后需要在运算中考虑ROI偏移量时,将会用到这个参数。
以上定义摘自该篇博客:OpenCV实现轮廓的发现。
#include<opencv2/opencv.hpp> using namespace cv; using namespace std; int value = 50; Mat src, dst, canny_img; void callback(int, void*); int main(int arc, char** argv) { src = imread("2.jpg"); namedWindow("src",CV_WINDOW_AUTOSIZE); imshow("src", src); cvtColor(src, src, CV_BGR2GRAY); namedWindow("output", CV_WINDOW_AUTOSIZE); createTrackbar("threshold", "output", &value, 255, callback); callback(0, 0); waitKey(0); return 0; } void callback(int, void*) { Canny(src, canny_img, value, 2 * value); imshow("canny", canny_img); vector<vector<Point>>contours; vector<Vec4i>hierarchy; findContours(canny_img, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE,Point(0,0)); dst = Mat::zeros(src.size(), CV_8UC3); RNG rng(1); for (int i = 0; i < contours.size(); i++) { Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); drawContours(dst, contours, i, color, 2, 8, hierarchy, 0, Point(0, 0)); } imshow("output", dst); }
运行结果如下:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持<计算机技术网(www.ctvol.com)!!>。
—-想了解Opencv实现轮廓提取功能分享!全部内容且更多的C语言教程关注<计算机技术网(www.ctvol.com)!!>
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/483040.html