opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

时间:2022-02-27 07:58:28

一、简介

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

二、画出每个轮廓的每个点

 #include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat src=imread("E://22.jpg");
Mat temp=src.clone();
//转灰度图,二值化
cvtColor(src,src,CV_BGR2GRAY);
threshold(src,src,,,THRESH_BINARY);
imshow("thres",src);
//查找并绘制轮廓
vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
findContours(src,contours,hierarcy,CV_RETR_TREE,CV_LINK_RUNS);
/*drawContours(temp,contours,-1,Scalar(0,255,0),2,8); 绘制并显示所有轮廓
imshow("contours",temp);*/ //绘制轮廓的每一个点
for(int i=; i<contours.size(); i++){
for(int j=; j<contours[i].size(); j++){
circle(temp,Point(contours[i][j].x,contours[i][j].y),,Scalar(,,),,);
}
}
imshow("contours",temp);
waitKey();
}

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

轮廓太密集了,稍微改改参数

     for(int j=; j<contours[i].size(); j+=){
circle(temp,Point(contours[i][j].x,contours[i][j].y),,Scalar(,,),,);
}

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

稍微改改,有另一种效果(动态射线)

 for(int i=; i<contours.size(); i++){
for(int j=; j<contours[i].size(); j+=){
circle(temp,Point(contours[i][j].x,contours[i][j].y),,Scalar(,,),,);
line(temp,Point(,),Point(contours[i][j].x,contours[i][j].y), Scalar(, , ), , );
waitKey();
imshow("contours", temp);
}
}

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

改改又是一种效果

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

三、孔洞填充

 #include "opencv2/opencv.hpp"
using namespace cv; void main()
{
Mat src=imread("E://33.jpg");
Mat temp=src.clone();
//转灰度图,二值化
cvtColor(src,src,CV_BGR2GRAY);
threshold(src,src,,,THRESH_BINARY);
imshow("thres",src);
//查找并绘制轮廓
vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
findContours(src,contours,hierarcy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE); ///孔洞填充
findContours(src, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); //查找轮廓
drawContours(temp, contours, -, Scalar(, , ), -, ); //绘制轮廓
imshow("contours",temp);
waitKey();
}

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

稍微改改

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点