前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频追踪之目标选择(一)------边缘检测值函数准备

视频追踪之目标选择(一)------边缘检测值函数准备

作者头像
钱塘小甲子
发布2019-01-29 09:57:51
5310
发布2019-01-29 09:57:51
举报

视频跟踪(video tracking)第一步往往是人工的目标选取,当然在特定场合,也可以用动态检测来实现目标的自动选择。人工选择的情况下,往往是从某一frame开始用鼠标神马的选一下目标。更多的是需要用户绘制出跟踪目标的外接矩形或者外接圆,显然,这样显然会消耗比较长的时间,通常情况下是不可容忍的。所以利用边缘检测可以将矩形绘制简化为鼠标单击。

一.关键函数

1.1  cvFindContours

函数功能:对图像进行轮廓检测,这个函数将生成一条链表以保存检测出的各个轮廓信息,并传出指向这条链表表头的指针。

函数原型:

int cvFindContours(

  CvArr* image,

  CvMemStorage* storage,

  CvSeq** first_contour,   

  int header_size=sizeof(CvContour),

  int mode=CV_RETR_LIST,   

  int method=CV_CHAIN_APPROX_SIMPLE,

  CvPoint offset=cvPoint(0,0)

);

函数说明:

第一个参数表示输入图像,必须为一个8位的二值图像。所以,在做图像的边缘检测之前,首先要进行图图像的灰度和二值化。

第二参数表示存储轮廓的容器。相当于一个中间的过渡池,无需过度纠结。

第三个参数为输出参数,这个参数将指向用来存储轮廓信息的链表表头,这是很重要的东西,后期就用这个来分析边缘,从而实现矩形的自动绘制。

第四个参数表示存储轮廓链表的表头大小,当第六个参数传入CV_CHAIN_CODE时,要设置成sizeof(CvChain),其它情况统一设置成sizeof(CvContour)。

第五个参数为轮廓检测的模式

第七个参数表示偏移量,比如你要从图像的(100, 0)开始进行轮廓检测,那么就传入(100, 0)。

也就是说,cvFindContours这货,作用就是给你返回一个列表,列表是边缘像素的信息。

1.2  cvDrawContours

函数功能:利用之前产生的像素信息,绘制出轮廓(其实最总不需要这个函数)

函数原型:

void cvDrawContours(

  CvArr *img,

  CvSeq* contour,

  CvScalar external_color,

  CvScalar hole_color,

  int max_level,

  int thickness=1,

  int line_type=8,

  CvPoint offset=cvPoint(0,0)

);

第一个参数表示输入图像,函数将在这张图像上绘制轮廓。

第二个参数表示指向轮廓链表的指针。

第三个参数和第四个参数表示颜色,绘制时会根据轮廓的层次来交替使用这二种颜色。

第五个参数表示绘制轮廓的最大层数,如果是0,只绘制contour;如果是1,追加绘制和contour同层的所有轮廓;如果是2,追加绘制比contour低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。

第六个参数表示轮廓线的宽度,如果为CV_FILLED则会填充轮廓内部。

第七个参数表示轮廓线的类型。

第八个参数表示偏移量,如果传入(10,20),那绘制将从图像的(10,20)处开始。

 1.3下面就介绍OpenCV中对图像进行二值化的关键函数——cvThreshold()。

函数原型:

void cvThreshold(

  const CvArr* src,

  CvArr* dst,

  double threshold,

  double max_value,

  int threshold_type

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值,阈值的确定也有很多算法,但是方便起见,我们在程序中固定为100,以后有时间可专门写一篇讨论。

第四个参数表示最大值。

第五个参数表示运算方法。

在OpenCV的imgproc\types_c.h中可以找到运算方法的定义。

enum

{

    CV_THRESH_BINARY      =0,  

    CV_THRESH_BINARY_INV  =1,  

    CV_THRESH_TRUNC       =2,  

    CV_THRESH_TOZERO      =3,  

    CV_THRESH_TOZERO_INV  =4,  

    CV_THRESH_MASK        =7,

    CV_THRESH_OTSU        =8  

};

​此外还有一个函数、

cvCvtColor(...),是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。

也就是,过程是这样的:

彩色图像-->灰度图像(利用cvCvtColor())​-->将其二值化(cvThreshold())-->获取边缘像素信息(cvFindContours())-->绘制边缘(cvDrawContours)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年11月03日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 彩色图像-->灰度图像(利用cvCvtColor())​-->将其二值化(cvThreshold())-->获取边缘像素信息(cvFindContours())-->绘制边缘(cvDrawContours)
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档