opencv学习-轮廓发现

Posted 殇堼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习-轮廓发现相关的知识,希望对你有一定的参考价值。

轮廓发现分为四个流程:
(1)输入图像转为灰度图像cvtColor

(2)使用Canny进行边缘提取,得到二值图像

(3)使用findContours寻找轮廓
在这里插入图片描述
(4)使用drawContours绘制轮廓
在这里插入图片描述

代码演示

#include<iostream>
#include<opencv2/opencv.hpp>

using namespace std;
using namespace cv;

Mat src, dst;
const char* input_win = "【输入图像】";
const char* output_win = "【输出图像】";
int threshold_value = 100;
int threshold_max = 255;
RNG rng;

void Demo_Contours(int, void*);

int main()
{
	src = imread("D:/images/lena.png");
	if (!src.data)
	{
		cout << "could not load image !";
		return -1;
	}
	namedWindow(input_win, WINDOW_AUTOSIZE);
	namedWindow(output_win, WINDOW_AUTOSIZE);
	imshow(input_win, src);
	cvtColor(src, src, COLOR_BGR2GRAY);

//创建滑动条
	const char* trackbar_title = "Threshold Value:";
	createTrackbar(trackbar_title, output_win, &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(src, canny_output, threshold_value, threshold_value * 2, 3, false);
	findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

	dst = 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(dst, contours, i, color, 2, 8, hierachy, 0, Point(0, 0));
	}
	imshow(output_win, dst);
}

在这里插入图片描述

以上是关于opencv学习-轮廓发现的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV学习代码记录—— Snake轮廓

OpenCV学习代码记录——轮廓(contour)检测

OpenCV中几何形状识别与测量

OpenCV中几何形状识别与测量

opencv学习-物体轮廓外接矩形的绘制

C++ OpenCV轮廓发现