29-轮廓发现

轮廓发现(find contour in your image)

1、轮廓发现(find contour);
2、代码演示;

轮廓发现(find contour)

1、轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,一般用来寻找二值图像的轮廓,所以边缘提取的阈值选定会影响最终轮廓发现结果;

相关API

1、发现轮廓API : findContours();
2、绘制轮廓API : drawContours();


参数说明:





注: maxlevel : 0–绘制当前的,1–绘制当前及其内嵌的轮廓

Code

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

using namespace std;
using namespace cv;

Mat src, dst;
const char *input_win = "input image";
const char *output_win = "contour image";

int threshold_value = 100;
int threshold_max = 255;


void Contour_Demo(int, void *);

int main(int argc, char** argv)
{
   
	src = imread("C:\\Users\\hello\\Desktop\\15.jpg");
	if (src.empty())
	{
   
		cout << "could not load the image..." << endl;
		return -1;
	}
	namedWindow(input_win, WINDOW_AUTOSIZE);
	namedWindow(output_win, WINDOW_AUTOSIZE);
	cvtColor(src, src, CV_BGR2GRAY);
	imshow(input_win, src);

	createTrackbar("Threshold Value:", input_win, &threshold_value, threshold_max, Contour_Demo);
	Contour_Demo(0, 0);

	//阈值通过trackbar找到最合适的值;
	
	waitKey(0);
	return 0;
}
//定义Callback 回调函数
void Contour_Demo(int, void *)
{
   
	//进行滤波
	Mat gaus,edge_image;
	GaussianBlur(src, gaus, Size(3, 3), 0, 0);
	//Canny边缘检测
	Canny(gaus, edge_image, threshold_value, threshold_value * 2, 3,false);
	//发现轮廓
	vector<vector<Point>> contourpoints;   //vector向量的使用会影响速度
	vector<Vec4i> hierachy;  //存储返回的拓扑结构
	findContours(edge_image, contourpoints, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));
	
	dst = Mat::zeros(src.size(), CV_8UC3);  //初始化dst对象
	RNG rng(12345);
	for (size_t i = 0; i < contourpoints.size(); i++)   //将contourpoints中的点全部描绘出来
	{
   
		Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
		drawContours(dst, contourpoints, i, color, 2, LINE_8, hierachy, 0, Point(0, 0));
	}
	//颜色相同的部分是同一轮廓
	imshow(output_win, dst);  //显示结果

}

效果

注:轮廓检测的效果受Canny算法中阈值threshold的影响较大,如下图:需要自己去寻找合适的阈值


全部评论

相关推荐

点赞 评论 收藏
分享
程序员牛肉:1.大头肯定是院校问题,这个没啥说的。 2.虽然有实习,但是实习的内容太水了,在公司待了七个月的时间,看起来就只做了jwt和接入redis。爬取新闻,数据导入。这几个需求值得你做七个月吗?这不就是三四个月的工作量吗?我要是面试官的话真心会认为你能力不太行。所以既然有实习了,一定要好好写,像是Swagger这种东西是真没必要写上去,就拉一个包的事情。 3.我个人觉得话,在校生不要把自己当社招看,除非你的项目是特别牛逼,特别有名的含金量,否则不要写这种密密麻麻的一串子工作职责。你的项目只有一个作用,就是供面试官从中来抽取八股对你进行拷打。 但是你现在这个看不来什么技术点,可以改一下,详细表述一下你用什么技术实现了什么功能,在实现这个功能的过程中,你解决了什么难题。
点赞 评论 收藏
分享
昨天 19:25
已编辑
太原理工大学 游戏测试
叁六玖:公司名发我,我要这个HR带我打瓦
我的秋招日记
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务