OpenCV之查找并绘制轮廓

69 篇文章 14 订阅
53 篇文章 15 订阅

在OpenCV中,用findContours()函数从二值图中查找轮廓。

原型:

void findContourd(InputArray image, OutputArray contours, outputArray hierarchy, int mode, int mrthod, Point offset=Point())

参数详解:

  • 第一个参数:输入图像,Mat类的对象即可,必须是8位单通道图像图像的非零像素视为1,0像素值被保留为0,所以图像是二进制。我们可以使用compare()、inrange()、threshold()、adaptivethreshold()、canny()等桉树由彩色图像或灰度图创建二进制图像。此函数在提取图像轮廓饿同时,会修改图像的内容。
  • 第二个参数:检测到的轮廓,每个轮廓存储为一个点向量,即用point类型的vector表示。
  • 第三个参数:可选的输出向量,包含图像的拓扑信息。其作为轮廓的数量表示,包含了许多元素。每个轮廓contours[i]对应4个hierarchy元素的hierarchy[i][0]~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对影项,则hierarchy[i]为负数。
  • 第四个参数:int类型的mode,轮廓检索模式,包括以下几种:

  • 第五个参数:int类型的method,表示轮廓的近似方法,取值如下:

  • 第六个参数:Point类型的offset,每个轮廓点的可选偏移量,默认值是Point(),对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数便可派上用场。

findContours经常与drawContours一起使用,drawContours函数将检测到的轮廓绘制出来。

drawContours()函数

drawContours()函数用于在图像中绘制外部或者内部轮廓。

函数原型:

void drawContours(InputArray image, imputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArrayhierarchy=noArray(), int maxLevel=INT_MAX, Pointoffset=Point())

参数详解:

  • 第一个参数:输入图像,Mat类的对象即可。
  • 第二个参数:所有的输入轮廓,每个轮廓存储为一个点向量,即用point类型的vector表示。
  • 第三个参数:int类型的contourIdx,轮廓绘制的只是变量,如果其为负值,则绘制所有的轮廓。
  • 第四个参数:轮廓的颜色。
  • 第五个参数:轮廓线条的粗细,默认值时1。
  • 第六个参数:int类型的lineType,线条的类型,默认值8,取值如下:

  • 第七个参数:InputArray类型的hierarchy,可选的层次结构信息,默认是noArray()。
  • 第八个参数:int类型的maxLevel,表示用于绘制轮廓的最大等级,默认是INT_MAX。
  • 第九个参数:Point类型的offset,可选的轮廓偏移参数。

调用示例:

Max result(image.size(),CV_8U, Scalar(255));

drawContours(results, contours,

-1, // 绘制所有的轮廓

Scalar(0), //颜色用黑色

3); // 线宽为3

代码示例:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main() {
    std::cout << "Hello, World!" << std::endl;
    Mat srcImage;
    srcImage = imread("/Users/dwz/Desktop/cpp/1.jpg");
    Mat grayImage;
    cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
    grayImage = grayImage > 120;

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(grayImage, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

    Mat dstImage = Mat::zeros(srcImage.rows, srcImage.cols, CV_8UC3);
//    drawContours(srcImage, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);

    int index = 0;
    for (; index >= 0 ; index=hierarchy[index][0]) {
        Scalar color(rand()&255, rand()&255, rand()&255);
        drawContours(dstImage, contours, index,color, FILLED, 8, hierarchy);

    }
    imwrite("contours.jpg", dstImage);
    return 0;
}

输入:

输出:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值