OpenCV图像处理教程C++(二十)轮廓发现、凸包、轮廓周围绘制圆和矩形

轮廓发现–边缘
轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓结果拓扑:就是把实体抽象成与其大小、形状无关的点,而把连接实体的线路抽象成“线”,进而以图的形式来表示这些点与线之间关系的方法,其目的在于研究这些点、
线之间的相连关系。表示点和线之间关系的图被称为拓扑结构图。
步骤:
输入图像转为灰度图像cvtcolor
使用Canny进行边缘提取,得到二值图像
使用findContours寻找轮廓
使用drawContours绘制;轮廓

API:

findContours( // 在二值图像上发现轮廓
InputOutputArray  binImg, // 输入图像,非0的像素被看成1,0的像素值保持不变,8-bit。findContours 会改动输入图像 binImg 中元素的值?
OutputArrayOfArrays  contours,//  全部发现的轮廓对象
OutputArray hierachy, // 图像的拓扑结构,可选,该轮廓发现算法正是基于图像拓扑结构实现。  发现的层次
int mode, //  mode轮廓检索模式,可以通过cv::RetrievalModes()查看详细信息
RETR_EXTERNAL:表示只检测最外层轮廓,对所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1
RETR_LIST:提取所有轮廓,并放置在list中,检测的轮廓不建立等级关系
RETR_CCOMP:提取所有轮廓,并将轮廓组织成双层结构(two-level hierarchy),顶层为连通域的外围边界,次层位内层边界
RETR_TREE:提取所有轮廓并重新建立网状轮廓结构
RETR_FLOODFILL:官网没有介绍,应该是洪水填充法
int method,// method:轮廓近似方法可以通过cv::ContourApproximationModes()查看详细信息
CHAIN_APPROX_NONE:获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1
CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,值保留该方向的重点坐标,如果一个矩形轮廓只需4个点来保存轮廓信息
CHAIN_APPROX_TC89_L1和CHAIN_APPROX_TC89_KCOS使用Teh-Chinl链逼近算法中的一种
Point offset=Point()//  轮廓像素的位移,默认(0, 0)没有位移
)

drawContours( // 绘制轮廓,一次只能根据轮廓索引号绘制一次,需要循环所有发现的轮廓
InputOutputArray  binImg, // 输出图像
OutputArrayOfArrays  contours,//  全部发现的轮廓对象
Int contourIdx// 轮廓索引号
const Scalar & color,// 绘制时候颜色
int  thickness,// 绘制线宽,如果传 -1 表示填充轮廓
int  lineType ,// 线的类型LINE_8
InputArray hierarchy,// 拓扑结构图,   发现的层次
int maxlevel,// 最大层数, 0只绘制当前的,1表示绘制绘制当前及其内嵌的轮廓
Point offset=Point()// 轮廓位移,可选  默认0
)

代码:

#include <opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
#include <string> 
#include<fstream> 
using namespace cv;
using namespace std;

Mat src, graysrc, dst;
int threadhold_value = 100;
int 
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值