find contour
寻找轮廓线是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓寻找的结果。
相关参数:https://blog.csdn.net/dcrmg/article/details/51987348
相关API:
findContours; drawContours
步骤:
1、图像转灰度cvtColor
2、Canny边缘提取,得到二值图像
3、使用findConturs寻找轮廓
4、drawContours绘制轮廓、
#include<opencv2/opencv.hpp>
#include<iostream>
#include<string>
#include<vector>
using namespace cv;
using namespace std;
int threshold_value = 100;
int threshold_max = 255;
RNG rng;
void Demo_Contours(int, void*);
const String output_window = "Output window";
Mat src,dst;
int main(int argv, char**argc) {
src = imread("C:\\Users\\admin\\Desktop\\demo.jpg");
if (src.empty())
{
printf("Could not load the demo image...");
return false;
}
namedWindow("Source pic", CV_WINDOW_AUTOSIZE);
imshow("Source pic", src);
cvtColor(src, dst, CV_BGR2GRAY);
namedWindow(output_window, CV_WINDOW_AUTOSIZE);
const char* bartitle = "Threshold Value";
createTrackbar(bartitle, output_window, &threshold_value, threshold_max,Demo_Contours);
Demo_Contours(0, 0);
waitKey(0);
return 0;
}
void Demo_Contours(int, void*) {
Mat canny_output;
vector<vector<Point>> contours;
vector<Vec4i> hierachy;
Canny(dst, canny_output, threshold_value, threshold_max * 2, 3, false);
findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
Mat dst2 = Mat::zeros(src.size(), CV_8UC3);
RNG rng(12345);
for (size_t i = 0; i < contours.size(); i++)
{
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(dst2, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
}
imshow(output_window, dst2);
}