异形ROI的建立与使用

来源:互联网 发布:htpc 用什么软件 编辑:程序博客网 时间:2024/06/10 05:21

在OpenCV中,ROI (Region of Interest)是非常重要的机制,它可以缩小图像处理的区域,使得程序的性能明显提升。如,在1920x720的灰度图中,模板匹配1个大小为50x50的灰度图,1G主频下的执行时间约为1s,但如果提前标定好对应的匹配位置,可以将时间缩短到1-3ms,性能提升极为可观。
OpenCV中的ROI设定有几种方式:

  • 使用矩形子图像作为ROI,如:
    Mat _sub = Mat( _img, Rect(x, y, w, h) );
    这个_sub是从 _img中取出的子图像,共享 _img的内存,效果如同将下图中白色区域作为输入图像进行处理:
  • 使用Mask参数标识ROI,如matchTemplate方法的mask参数:
    void cv::matchTemplate ( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask = noArray() )

OpenCV的一些方法中,并不支持Mask操作,如识别直线的HoughLinesP。而矩形区域相对特定的处理情况下,仍有可能个别被测目标,沿特定轨迹运动,而对应的矩形区域内的干扰较多,导致识别困难,因此引出本文的重点:如何设计一些特殊形状的Mask,及如何在不支持Mask的OpenCV接口中使用
根据需要创建所需的异形Mask并不难,如下2个图像的Mask,分别采用fillConvexPoly及ellipse即可完成,

在不支持Mask的方法中,使用这样的Mask则需要使用Mat的Bit And操作符:&。举个例子如下:

/* _mask after fillConvexPoly or ellipse operation */HoughLinesP( Mat(_img, _rect) & _mask, lines, 3, CV_PI/60, 30, 30, 5 );

例子中使用的Rectangle形式的ROI再Bit And上生成的异形ROI,提升了性能,减少了干扰,过程就是这么简单。

原创粉丝点击