c++和opencv小知识:findcontours和drawcontours制作连通域

findcontours和drawcontours制作连通域

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat src = imread("src_img.jpg", 1);
	imshow("src", src);
	Mat grayImage;
	cvtColor(src, grayImage, COLOR_BGR2GRAY);
	Mat threshold_img;
	threshold(grayImage, threshold_img, 1, 255, THRESH_OTSU + THRESH_BINARY_INV);
	//形态学开运算和闭运算去除噪声点
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
	morphologyEx(threshold_img, threshold_img, MORPH_OPEN, element, Point(-1, -1));
	morphologyEx(threshold_img, threshold_img, MORPH_CLOSE, element, Point(-1, -1));
	imshow("threshold_img",threshold_img);
	//生成前景图像sure_fg
	Mat dist;
	distanceTransform(threshold_img, dist, DIST_L2, 5);
	normalize(dist, dist, 0, 255, cv::NORM_MINMAX);
	double my_minv = 0.0, my_maxv = 0.0;
	minMaxIdx(dist, &my_minv, &my_maxv);
	Mat sure_fg;
	threshold(dist, sure_fg, 0.7 * my_maxv, 255, THRESH_BINARY);
	sure_fg.convertTo(sure_fg, CV_8U);
	Mat element1 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
	dilate(sure_fg, sure_fg, element, Point(-1, -1), 3);
	sure_fg.convertTo(sure_fg, CV_8U);
	imshow("sure_fg", sure_fg);
	//制作前景色标签
	vector<vector<Point>> contours;
	vector<Vec4i> hierarchy;
	findContours(sure_fg, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	Mat imageContours = Mat::zeros(sure_fg.size(), CV_8UC1);  //轮廓
	Mat marks(sure_fg.size(), CV_32S);   //Opencv分水岭第二个矩阵参数
	marks = Scalar::all(0);
	int index = 0;
	int compCount = 0;
	for (; index >= 0; index = hierarchy[index][0], compCount++)
	{
		// 4、对marks进行标记,对不同区域的轮廓进行编号,相当于设置注水点,有多少轮廓,就有多少注水点
		drawContours(marks, contours, index, Scalar::all(compCount + 1), 1, 8, hierarchy);     // 每个轮廓的标记点不一样
		drawContours(imageContours, contours, index, Scalar(255), 1, 8, hierarchy);
	}
	watershed(src, marks);
	//显示图像
	double maxVal = 0;
	double minVal = 0;
	minMaxLoc(marks, &minVal, &maxVal);
	Mat dst = Mat::zeros(src.size(), CV_8U);
	marks.convertTo(dst, CV_8U, 255.0 / (maxVal - minVal), -255.0 * minVal / (maxVal - minVal));
	imshow("marks", dst);

	waitKey(0);
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值