OpenCV27---轮廓发现

二十七、轮廓发现

1、轮廓发现(find contour)

  • 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果。

2、API介绍

  • findContours发现轮廓
    二值图像上发现轮廓使用API
findContours(
InputOutputArray src,//输入图像,非0的像素被看成1,0的像素保持不变,8bits
OutputArray of Arrays contours,//全部发现的轮廓对象
OutputArray hierachy,//图像的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现
int mode,//轮廓返回的模式
int method,//发现方法
Point offset=Point()//轮廓像素的位移,默认(0,0)没有位移
)
  • drawContours绘制轮廓

对发现的轮廓进行绘制显示

drawContours(
InputOutputArray,//输出图像
OutputArrays contours,//全部发现的轮廓对象
int contourldx,//轮廓索引号
const Scalar & color,//绘制颜色
int thickness,//绘制线宽
int lineType,//线的类型LINE_8
InputArray hierarchy,//拓扑结构图
int maxlevel,//最大层数,0只绘制当前的,1表示绘制当前及其内嵌的轮廓
Point offset=Point()//轮廓位移,可选
)

3、步骤

  • 输入图像转为灰度图像cvtColor
  • 使用Canny进行边缘提取,取得二值图像
  • 使用findContours寻找轮廓
  • 使用drawContours绘制轮廓

示例代码:(发现轮廓)

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

using namespace cv;
using namespace std;

int threshold_value = 100;
int threshold_max = 255;
RNG rng;
void Demo_Contours(int, void*);
char output_win[] = "output image";
Mat src, dst;

int main(int argc, char** argv) {
    src = imread("添加图片路径");
    if (!src.data) {
  	cout << "could not load image..." << endl;
  	return -1;
   }
   imshow("input image", src);
   namedWindow(output_win, WINDOW_AUTOSIZE);
   
   cvtColor(src, src, COLOR_BGR2GRAY);//转灰度
   createTrackbar("Threshold Value:", output_win, &threshold_value, threshold_max, Demo_Contours);//控制canny的阈值
   Demo_Contours(0, 0);
   
   waitKey(0);
   return 0;
}

void Demo_Contours(int, void*) {
    Mat canny_output;
    vector<vector<Point>> contours;//建立一个多个轮廓多个轮廓点的数组
    vector<Vec4i> hierachy;
    Canny(src, canny_output, threshold_value, threshold_value * 2, 3, false);//Canny边缘检测
    findContours(canny_output, contours, hierachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));//寻找轮廓
    
    dst = Mat::zeros(src.size(), CV_8UC3);//创建一张图片
    RNG rng(12345);
    for (size_t i = 0; i < contours.size(); i++) {
  	Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机生成颜色
  	drawContours(dst, contours, i, color, 2, 8, hierachy, 0, Point());//画出轮廓
 }
    imshow(output_win, dst);
}

输出结果显示:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值