关于opencv的findContours函数的一个问题

关于opencv的findContours函数的一个问题

实测opencv的findContours函数存在把距离为12个像素以下的两个区域当作一个区域提取轮廓;
在这里插入图片描述
如图,最近的轮廓不能进行区分;
测试代码为

	cv::cvtColor(imgIn, imgIn, CV_BGR2GRAY);
	cv::imshow("testImg", imgIn);
	cv::Mat element = cv::getStructuringElement(CV_SHAPE_RECT, cv::Size(1,1));
	cv::morphologyEx(imgIn, imgIn, CV_MOP_ERODE, element);
	std::vector<std::vector<cv::Point>> contours;
	std::vector<cv::Vec4i> hierarchy;
	cv::findContours(imgIn, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
	cv::drawContours(imgIn,contours,cv::Scalar(100),2);
	for (auto x : contours) {
		cv::circle(imgIn, getCentre(x), 4, cv::Scalar(0), -1);
	}

在这里插入图片描述
观察到最左侧的正方形虽然没有被认为是独立的区域(没有对其计算质心),但是似乎具有独立的轮廓描述,推断是因为findcontours的查找机制,使得其轮廓在某一位置连通了,所以实际上仍然是连在一起的轮廓;
稍微缩小一下间隙,使间隙缩小到10,有
在这里插入图片描述
这个就很明显了;
采用cv::findContours函数对目标轮廓进行提取的各位使用时还要注意一下这个问题;

问题说明

拿图试了几次发现是因为在opencv里,读取二值图时(即便是用opencv自己生成的二值图像保存之后在读入的),取值为255的目标像素周围的点其实不是0,而是可能有部分点的像素值被读取为0-20,不知道是保存的原因还是读取的原因,所以使用findcontours时要注意进行一次额外的二值化,以避免由于存在部分低值像素导致相邻的结构被视为一个整体进行轮廓提取;

划重点

用findContours之前务必进行二值化;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值