OpenCV学习笔记(五)

这篇博客详细介绍了OpenCV中的轮廓查找和绘制方法,包括findContours()函数的使用和drawContours()函数的参数解释。同时,还探讨了如何寻找和绘制物体的凸包,如convexHull()函数,以及相关的边界检测函数如boundingRect(), minAreaRect(), minEnclosingCircle()和fitEllipse()。最后提到了逼近多边形曲线的approxPolyDP()函数的应用。" 52244032,5658763,使用TabControl实现MDI窗体的Tab风格,"['控件', 'Mdi窗体', 'tab风格', 'tabcontrol']
摘要由CSDN通过智能技术生成

一、寻找轮廓:findContours()函数

函数原型

void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArrray hierarchy, int mode, int method, Point offset = Point())
  1. 第一个参数,InputArray类型的image,输入图像,Mat类,8位单通道。可以使用compare()、inrange()、threshold()、adaptivethreshold()、canny()等函数由灰度或彩色图创建二进制图像。
  2. 第二个参数,OutputArrayOfArrays类型的contours、检测到的轮廓、函数调用后的运算结果存在这里。每个轮廓存储为一个点向量(Point类型的vector表示)
  3. 第三参数,OutputArray类型的hierarchy,可选的输出向量,包含图像的拓扑信息。
  4. 第四个参数,int类的mode,轮廓检索模式,取值如下:
   RETR_EXTERNAL //表示只检测最外层轮廓。对所有轮廓设置hierarchy[i][2]=hierarchy[i][3]=-1
   RETR_LIST        //提取所有轮廓,设置在List中,检测的轮廓不建立等级关系
   RETR_CCOMP  //提取所有轮廓,并将其组织为双层结构,顶层为连通域的外围边界,次层为孔的内层边界
   RETR_TREE //提取所有轮廓,并重新建立网状的轮廓结构
   
  1. 第五个参数,int类型的method,为轮廓的近似办法,取值如下:
CHAIN_APPROX_NONE //获取每个轮廓的每个像素,相邻的两个点的像素位置不超过1,即max(abs(x1-x2),abs(y2-y1))==1
CHAIN_APPROX_SIMPLE  //压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点类保存轮廓信息
CHAIN_APPROX_TC89_L1  ,CHAIN_APPROX_TC89_KCOS   //使用Teh-Chin链逼近算法中的一个

6.第六个参数 ,Point类型的offset,每个轮廓点的可选偏移量,有默认值Point()。对ROI图像中找出的轮廓,并要在整个图像种进行分析时,这个参数便可排上用场。
*注:fingContours一般与drawContours配合使用

vector<vector<Point>>  contours;
findContours(image, contours,//轮廓数组
CV_RETR_EXTERNAL,//获取外轮廓
CV_CHAIN_APPROX_NONE);//获取每个轮廓的每个像素

绘制轮廓:drawContours()函数

函数原型

void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType=8,InputArray hierarchy=noArray(), int maxLevel=INT_MAX,Point offset=Point())
  1. 第二个参数,InputArrayOfArrays类型的contours,所有的输入轮廓,每个轮廓存储为一个点向量,即用Point类型的vector表示。
  2. 第三参数,int类型的contourIdx,轮廓绘制的指示变量。如果其值为负,则绘制所有轮廓。
  3. 第四个参数,const Scalar&类型的color,轮廓的颜色。
  4. 第五个参数,int thichness,轮廓线条的粗细度,默认1,若为负(thickness=cv_filled),便会绘制在轮廓内部。
  5. 第六个参数,int类型的lineType,线条的类型,有默认值8
    8(默认值) 8连通线型
    4 4连通线型
    LINE_AA 抗锯齿线型
  6. 第七个参数,InputArray类型的hierarchy,可选的层次结构信息,默认noArray()。
  7. 第八个参数,int类型的maxLevel,表示用于绘制轮廓的最大等级,默认INT_MAX。
  8. 第九个参数,Point类型的offset,可选的轮廓偏移参数,用指定的偏移量offset=(dx,dy)偏移需要绘制的轮廓,默认Point()

调用示例:

Mat result(image.size(),CV_8U,cv::Scalar(255));
drawContours(result,contours,-1,//绘制所有轮廓
Scalar(0),//绘制颜色为黑色
3);//轮廓线宽为3
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
using namespace std;
int main(int argc,ch
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值