天天看點

異形ROI的建立與使用

在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的記憶體,效果如同将下圖中白色區域作為輸入圖像進行處理:
    異形ROI的建立與使用
  • 使用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即可完成,

異形ROI的建立與使用
異形ROI的建立與使用

在不支援Mask的方法中,使用這樣的Mask則需要使用Mat的Bit And操作符:&。舉個例子如下:

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

例子中使用的Rectangle形式的ROI再Bit And上生成的異形ROI,提升了性能,減少了幹擾,過程就是這麼簡單。

繼續閱讀