一图像轮廓
1,查找并绘制轮廓
1>查找轮廓
void findContours(InputOutputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy, int mode,
int method, Point offset=Point())
/*image,单通道8-bit,二值图像
*contours,检测到的轮廓,用vector<Point>代表每一个轮廓
*hierarchy,可选的输出向量,包含图像拓扑信息,对于每一个
*contours[i]对应4个,hierarchy[i][0]~hierarchy[i][3]分别
*表示后一个轮廓,前一个轮廓,父轮廓,内嵌轮廓的索引编号,如果没有
*对应项则设为负数
*mode(轮廓的检索模式):
*CV_RETR_EXTERNAL,只检索外轮廓
*这种情况下hierarchy[i][2]=hierarchy[i][3]=-1
*CV_RETR_LIST,检索所有轮廓,但是不建立hierarchy
*CV_RETR_CCOMP,检索所有轮廓,并将它们组织成双层hierarchy,顶
*层是外部边界,第二层为洞的边界。
*CV_RETR_TREE,检索所有轮廓,重构所有轮廓的hierarchy
*method(轮廓的近似方法):
*CV_CHAIN_APPROX_NONE:获取轮廓的点,相邻两个点位置差为1,
*max(abs(x1-x2),abs(y2-y1))==1
*CV_CHAIN_APPROX_SIMPLE:只保留水平,垂直,对角线方向的元素
*CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:
*Teh-Chin chain 近似算法的一种
*offset,每个轮廓点的可选偏移量,在图像ROI中提取,应用到整张图像
*时很有用
*/
2>绘制或填充轮廓
void drawContours(InputOutputArray image,
InputArrayOfArrays contours,
int contourIdx, const Scalar& color,
int thickness=1, int lineType=8,
InputArray hierarchy=noArray(),
int maxLevel=INT_MAX,
Point offset=Point() )
/*image,目标图像
*contours,存储的所有轮廓,vector<vector<Point>>
*contourIdx,指示要绘制第几个轮廓,如果为负,则全部绘制
*thickness,线的厚度,如果为负,则将轮廓填充
*maxLevel,绘制轮廓的最大等级,if为0,只绘制contourIdx指定的
*轮廓,if为1,绘制指定轮廓和所有嵌套轮廓,if为2,绘制所有,需要
*hierarchy
*/
3>检测点是否在轮廓内
double pointPolygonTest(InputArray contour, Point2f pt,
bool measureDist)
//contour,输入轮廓,pt,为测试点
//measureDist,if true,返回pt距离轮廓边最近距离,否则只检测是
//否在轮廓内
//在轮廓内,轮廓边上,轮廓外,分别返回正数,0,复数,当
//measureDist=false时,返回1,0,,1
使用步骤:
//Canny边缘检测转化成二值图像
cv::cvtColor(Image,Image,CV_BGR2GRAY);
cv::GaussianBlur(Image,Image,cv::Size(3,3),0);
cv::Canny(Image,Image,30,90);
//查找轮廓
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(Image,contours,hierarchy,
CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE);
//利用随机数,将轮廓一个一个画出来,便于分清。
cv::RNG rng;
result=cv::Mat