江门网站建设方案报价,网站设计与网页制作,沈阳关键词优化价格,中企动力有多少家分公司轮廓概念介绍
通常我们使用二值化的图像进行轮廓检测#xff0c;对轮廓以外到内进行数字命名#xff0c;如下图#xff0c;最外面的轮廓命名为0#xff0c;向内部进行扩展#xff0c;遇到黑色白色相交区域#xff0c;就是一个新的轮廓#xff0c;然后依次对轮廓进行编号…轮廓概念介绍
通常我们使用二值化的图像进行轮廓检测对轮廓以外到内进行数字命名如下图最外面的轮廓命名为0向内部进行扩展遇到黑色白色相交区域就是一个新的轮廓然后依次对轮廓进行编号轮廓中可能含有新的轮廓同时也可能含有并列轮廓如下图中轮廓0内部包含其他子轮廓。 常用4个参数来秒数不同层级之间的结构关系分别是同层下一个轮廓索引同层上一个轮廓索引下一层第一个子轮廓索引和上层父轮廓索引。
例如轮廓0没有同层下一个轮廓就用-1来表示同层上一个轮廓也没有用-1来表示下一层第一个子轮廓索引为1给出1没有上层父轮廓因此也为-1。即得到[-1,-1,1,-1]。
例如轮廓1同层下一个轮廓索引为2没有同层上一个轮廓为-1下一层第一个子轮廓索也没有为-1上层父轮廓索引为0即得到[2,-1,-1,0]。这4个参数就可以描述轮廓。同样的可以得到轮廓2的参数[-1,1,3,0]。
轮廓检测
findContours()
void cv::findContours(InputArray image,OutputArrayOrArrays contours,OutputArray hierachy,Int mode,int method,Point offset Point())
·image:输入图像数据类型为CV_8U的单通道灰度图像或者二值化图像。
·contours:检测到的轮廓每个轮廓中存放着像素额坐标。
·mode:轮廓检测模式标志。
·method:轮廓逼近方法标志。
·offset:每个轮廓点移动的可选偏移量。这个函数主要用在从ROI图像中找出的轮廓并基于整个图像分析轮廓的场景中。先对图像提取一个ROI区域然后在此区域中进行轮廓检测若想直到得到轮廓在原图像中的坐标就需要通过此参数来配置。若是直接对整幅图像进行轮廓检测就不需要使用最后一个参数使用默认值即可。
检测完轮廓后我们需要将轮廓展示出来将所有轮廓以坐标点的形式输出这样既不直观同时也不便于观看。
轮廓绘制
drawContours()
l
void cv::frawContours(InputArray image,InputArrayOrArrays contours,int contourIdx,const Scalar corlor,int thickness 1, //线条粗细int lineType LINE_8, //绘制轮廓的线型,此处是8邻域也可4邻域hlerarchy InputArray noArray(),int maxLevel INT_MAX,Point offset Point())
·image:绘制轮廓的目标图像。
·contours:所有将要绘制的轮廓。
·contoursIdx:要绘制的轮廓的参数如果是负数则绘制所有的轮廓。
·color:绘制轮廓的颜色。
示例
#include opencv2/opencv.hpp
#include iostream
#includevectorusing namespace cv; //opencv的命名空间
using namespace std;//主函数
int main()
{system(color F0); //更改输出界面颜色Mat img imread(E:/opencv/opencv-4.6.0-vc14_vc15/opencv/snow.jpg); if (img.empty()){cout 请确认图像文件名称是否正确 endl;return -1;}int l 500;resize(img, img, Size(l, l));imshow(原图, img);Mat gray, binary;cvtColor(img, gray, COLOR_BGR2GRAY);//转为灰度图像GaussianBlur(gray, gray, Size(13, 13), 4, 4);//平滑滤波threshold(gray, binary, 170, 255, THRESH_BINARY | THRESH_OTSU);//自适应二值化//轮廓发现与检测vectorvectorPoint contours; //轮廓vectorVec4i hierarchy;//存放轮廓结构变量findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());//绘制轮廓for (int i 0; i hierarchy.size(); i){cout hierarchy[i] endl;}int j;for (int j 0 ; j contours.size(); j);{drawContours(img, contours, j, Scalar(0, 0, 255), 2, 8);imshow(轮廓检测结果, img);waitKey(0);}waitKey(0);//等待函数用于显示图像,按下键盘任意键后退出return 0;}
结果