轮廓是图像的重要特征之一,有些时候,很容易将其和边缘混淆。因此查阅了关于轮廓和边缘的词条,以此加深对轮廓和边缘这两个概念的认识和理解。边缘是图像差异变化比较显著的地方,而轮廓则是构成图形和物体的边缘线条,属于边缘的一部分。对于形状单一的二值图像而言,物体轮廓和边缘是重合的。在OpenCV中,我们可以通过findContours函数提取图像的轮廓信息。
#include<opencv2/opencv.hpp>
#include<iostream>
#include<opencv2/highgui/highgui_c.h>
#include<vector>
using namespace cv;
using namespace std;
int main(int argv, char** argc)
{
Mat src;
src = imread("D://opencv//5.PNG");
if (!src.data)
{
cout << "Could not loaded image..." << endl;
return -1;
}
// convert binary image
Mat grayImg, binImg;
cvtColor(src, grayImg, COLOR_BGR2GRAY);
threshold(grayImg, binImg, 100, 255, THRESH_BINARY | THRESH_OTSU); //图像二值化
// find contours
vector<vector<cv::Point>> contours;
vector<cv::Vec4i> hierarchy;
findContours(binImg, contours, hierarchy, RETR_LIST, CHAIN_APPROX_SIMPLE); //提取轮廓
// draw find result
for (size_t i = 0; i < contours.size(); i++)
{
//绘制第i条轮廓
drawContours(src, contours, (int)i, Scalar(0, 0, 255), 1, 8, hierarchy, 0);
}
// show find result
namedWindow("Find Result", WINDOW_AUTOSIZE);
imshow("Find Result", src);
waitKey(0);
return 0;
}
结果如下: