OpenCV图像发现轮廓函数findContours()的使用

本文档介绍如何在C++环境中利用OpenCV 4.4和Visual Studio 2017来处理二进制图像并找到图像的轮廓。通过调用`findContours`函数,使用Suzuki85算法,从灰度或二值图像中检测轮廓,然后在新的图像上绘制这些轮廓。示例代码展示了从灰度图像二值化开始,直到显示轮廓图像的完整流程。
摘要由CSDN通过智能技术生成

OPenCV版本:4.4

IDE:VS2017

功能描述

简述:在一个二进制图像里发现轮廓。

函数在二进制图像中使用Suzuki85算法获取轮廓。轮廓对形状分析和目标检测与识别是一个有用的工具,用法见OpenCV例子目录下的squares.cpp。

注意:自从opencv 3.2源图像不被函数修改。

参数描述

  • 参数 src 源图,一个8位单通道的图像,非零的像素都被当做1,零像素值保持原来的0值,图像还是被当做二进制,你可以使用 compare, inRange, threshold , adaptiveThreshold, Canny,和其他的去创建一个灰度图或彩色的二进制图像。如果模式等于RETR_CCOMP或RETR_FLOODFILL,输入可以是一个32位整型标签的图像(CV_32SC1)。
  • 参数 contours 检测到的轮廓,每个轮廓都被存为一个点的组合的vector(例如std::vector<std::vectorcv::Point >)
  • 参数 hierarchy 可选参数,输出向量(例如 std::vectorcv::Vec4i),包含了图像拓扑信息,他具有和轮廓数量一样多的元素,对contours[i]中的第i个contour ,在同一等级水平上的上一个轮廓和下一个轮廓的第一个子轮廓和父轮廓的元素 hierarchy[i][0] hierarchy[i][1] , hierarchy[i][2] , and hierarchy[i][3] 按顺序被设置成基于0的索引,如果轮廓i没有下一个、上一个、子轮廓或嵌套轮廓,相应的元素hierarchy[i]值将会是负值,
  • 参数 mode 轮廓获取模式,详见RetrievalModes
  • 参数 method 轮廓近似方法,详见ContourApproximationModes
  • 参数 offset 可选参数,每个轮廓点的偏移量。如果轮廓是从ROI图像中获取,并且他们是在整个图像上下文进行分析的,这个参数是有用的。

函数原型

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

源码示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>
int main()
{
	cv::Mat image_gray = cv::imread("D:\\OpenCVtest\\images\\heart.jpg", cv::IMREAD_GRAYSCALE);
	cv::Mat image_binary;

	// 二值化
	cv::threshold(image_gray, image_binary, 150, 255, cv::THRESH_BINARY);
	std::vector< std::vector< cv::Point> > contours;
	cv::findContours(
		image_binary,
		contours,
		cv::noArray(),
		cv::RETR_LIST,
		cv::CHAIN_APPROX_SIMPLE
	);
	
	cv::Mat image_contours = cv::Mat(image_binary.rows, image_binary.cols, CV_8UC1, cv::Scalar::all(255));
	cv::drawContours(image_contours, contours, -1, cv::Scalar::all(0));    // 画轮廓

	cv::imshow("灰度图", image_gray);        // 灰度图
	cv::imshow("轮廓图", image_contours);    // 轮廓

	cv::waitKey(0);
	return 0;
}

运行结果:

把彩色图像转换为灰度图,红心变成了黑白的。

在这里插入图片描述

轮廓图

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值