欢迎各位来到小白 p i a o 的学习空间! \color{red}{欢迎各位来到小白piao的学习空间!} 欢迎各位来到小白piao的学习空间!
持续更新,期待关注! \color{blue}{持续更新,期待关注!} 持续更新,期待关注!
目前已经为大家更新了: \color{green}{目前已经为大家更新了:} 目前已经为大家更新了:
我的主页: \color{purple}{我的主页:} 我的主页:我的主页
我的资源: \color{purple}{我的资源:} 我的资源:我的资源
大家通过前边的内容的学习,想必对于图像形态学有了初步的了解,了解原理之后,我们来看一写灵活的应用。今天的实例,可以好好品一品,如果能理解,那么将会对你在轮廓识别这里理解原理!注释就是答案!
前文链接:【C++的OpenCV】第十一课-OpenCV图像常用操作(八):直方图计算(cv.calc())
快速找到图形的边界有助于进行图像或者特定图形的比较工作以及后期一些训练模型中的基本方法的实现,用于后期成熟项目中。在项目中也充分发挥着其作用。
// 原型一:
void cv::findContours (
InputArray image,
OutputArrayOfArrays contours,
OutputArray hierarchy,
int mode,
int method,
Point offset = Point()
)
// 原型二:
void cv::findContours (
InputArray image,
OutputArrayOfArrays contours,
int mode,
int method,
Point offset = Point()
)
函数功能:
在一个二进制图片中找到轮廓;该函数使用算法240号从二进制(二值0和1)图像中检索轮廓。轮廓是形状分析、物体检测和识别的有用工具。请使用opencv3.2以上的版本!
参数解释:
void cv::drawContours ( InputOutputArray image,
InputArrayOfArrays contours,
int contourIdx,
const Scalar & color,
int thickness = 1,
int lineType = LINE_8,
InputArray hierarchy = noArray(),
int maxLevel = INT_MAX,
Point offset = Point()
)
函数功能:
绘制轮廓线或者填充轮廓!如果thickness≥0,该函数在图像中绘制轮廓线,如果thickness<0,则填充轮廓所圈定的区域
参数解释:
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
Mat src = imread("/home/aelx-chen/demo.jpg");
//初始化一张空图片dst用于存储画轮廓后的结果
Mat dst = Mat::zeros(src.rows, src.cols, CV_8UC3);
src = src > 1; // 这是一个简单的二进制图像处理的方法,将图像转换为二进制图像。
imshow( "Source", src ); // 显示源图像
vector<vector<Point> > contours; //边界容器
vector<Vec4i> hierarchy;// 层级容器
findContours( src, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE );
// 找src的轮廓,拓扑存入hierarchy中,
//采用“检索所有轮廓并将其组织为两级层次结构。
//在顶层,有组件的外部边界。在第二层,有洞的边界。
//如果连接组件的孔内有另一个轮廓,则仍将其置于顶层”的检索模式(RETR_CCOMP),
//和“压缩水平段、垂直段和对角段,只保留其端点。”的近似方法(CHAIN_APPROX_SIMPLE 简单线性近似)找到轮廓。
int idx = 0; // 索引从0开始
//遍历顶层的所有轮廓画轮廓:为什么是顶层?
//因为找轮廓的方法中的参数RETR_CCOMP决定了找到的轮廓只有两层,
//所以这个轮廓的上一层就是顶层了(注意,这种模式是指将轮廓拆为两层去检索的模式)。
for( ; idx >= 0; idx = hierarchy[idx][0] )
{
Scalar color( rand()&255, rand()&255, rand()&255 );//随机彩色
drawContours( dst, contours, idx, color, FILLED, 8, hierarchy );//画轮廓
// idx就是轮廓的索引(注意这是hierarchy这个容器中的下标,这个容器中存储的是轮廓的拓扑信息,即这个轮廓的上一层、后一层、第一个子轮廓、父轮廓,之所以这样是因为可以关联到contours和hierarachy,很巧妙!【hierarchy这个容器中我们下方使用图解供大家理解】),
}
imshow( "Components", dst );
waitKey(0);
}
持续更新,期待关注! \color{blue}{持续更新,期待关注!} 持续更新,期待关注!