Opencv C++ 查找轮廓并绘制

          findContour函数,用于在二值图像中查找轮廓。

查找轮廓API:

void findContours(InputArray image,
                  OutputArrayOfArrays contours,
                  OutputArray hierarchy,
                  int mode,
                  int method,
                  Point offset = Point()
 )	

参数解析:

//InputArray mage:输入CV_8UC1的图像(像素值被归一化成binary)。如果int mode等于RETR_CCOMP或RETR_FLOODFILL则可以输入CV_32SC1的图像;
//OutputArrayOfArrays contours:检测到的轮廓,每个轮廓都存储为点的向量(vector<vector<Point>>contours);
//OutputArray hierarchy:输出向量(vector<Vec4i>hierarchy),这个向量包含了有关图像拓扑的信息;
//int mode:轮廓查找模式;

  • RETR_EXTERNAL: 只检索最外层的轮廓;
  • RETR_LIST: 检索所有轮廓,但不建立层级关系;
  • RETR_CCOMP: 检索所有轮廓,并将其组织为两层层级关系;
  • RETR_TREE: 检索所有轮廓,并重建完整的层级结构;

//int method:指定轮廓的近似方法,即指定在轮廓点集中保留哪些点。

  • CHAIN_APPROX_NONE:存储所有的轮廓点,即使轮廓出现重叠部分;
  • CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角方向上的部分,仅保留该方向的终点坐标。例如,矩形的四个角点只保留四个点;
  • CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS:应用Teh-Chin链逼近算法(TC89)中的一种,可以得到更平滑的轮廓;

//Point offset = Point():每个轮廓点移动的可选偏移。

绘制轮廓API:

void drawContours(InputOutputArray image, 
                  InputArrayOfArrays contours, 
                  int contourIdx, 
                  const Scalar &color, 
                  int thickness = 1, 
                  int lineType = LINE_8, 
                  InputArray hierarcy = noArray(), 
                  int maxLevel = INT_MAX, 
                  Point offset = Point()
)

参数解析:
//InputOutputArray image:目标图像;
//InputArrayOfArrays contours:所有输入的轮廓,每个轮廓都存储为一个点矢量;
//int contourIdx:表示要绘画哪一个轮廓。如果为负数,则绘制所有轮廓;
//const Scalar &color:轮廓的颜色;
//int thickness = 1:绘制轮廓线的粗细,如果为负数,则填充整个轮廓;
//int lineType = LINE_8:轮廓线的类型;
//InputArray hierarcy = noArray():有关层次结构的可选信息(仅当您只想绘制某些轮廓时才需要<maxLevel>)
//int maxLevel = INT_MAX:Maxmal level for drawn contours.(仅当有可用的层次结构时,才会考虑此参数)

如果为 0,则仅绘制指定的轮廓;

如果为 1,则该函数绘制轮廓和所有嵌套轮廓;

如果为 2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等;
//Point offset = Point():每个轮廓点移动的可选偏移。

代码演示:

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat src = imread("C:/picture/source.jpg");
	if (src.empty())
	{
		std::cout << "Could not load image!";
		return -1;
	}
	blur(src, src, Size(5, 5));

	Mat edgeImg;
	int thresholdValue=35;
	Canny(src, edgeImg, thresholdValue, thresholdValue * 2, 3, false);
	imshow("edgeImg", edgeImg);

	vector<vector<Point>>contours;
	vector<Vec4i>hierarchy;
	findContours(edgeImg, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

	drawContours(src, contours, -1,Scalar(0,0,255), 2, LINE_8);
	imshow("src", src);


	waitKey(0);
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我就是不按套路出牌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值