2013-02-13 290 views
6

我正在做一些邊緣檢測上的實況視頻:爲什麼cv :: resize這麼慢?

- (void)processImage:(Mat&)image; 
{ 
     cv::resize(image, smallImage, cv::Size(288,352), 0, 0, CV_INTER_CUBIC); 
     edgeDetection(smallImage); 
     cv::resize(smallImage, image, image.size(), 0, 0, CV_INTER_LINEAR); 
} 

edgeDetection做了一些相當繁重,並且在相當低的幀率與1280×720的視頻幀大小正在運行。在resize中增加顯着降低了幀率,這與我所期待的完全相反。這是因爲調整操作很慢,還是因爲我做錯了什麼?

smallImage在如此的頭部聲明:

@interface CameraController : UIViewController 
<CvVideoCameraDelegate> 
{ 
    Mat smallImage; 
} 

沒有它的初始化,它工作正常。

回答

14

調整圖像大小很慢,並且您對每個處理的幀進行兩次。有幾種方法可以改進您的解決方案,但您必須提供有關您嘗試解決的問題的更多詳細信息。

首先,在檢測邊緣之前調整圖像的大小會導致以較少的信息提供邊緣檢測,因此會導致較少的邊緣被檢測到,或者至少會使檢測更難。

而且使用的大小調整算法影響其速度,CV_INTER_LINEAR是CV最快 ::調整,如果我沒有記錯的 - 你正在使用CV_INTER_CUBIC的第一縮放。

一個替代調整圖像的大小是改爲處理原始圖像的較小區域。爲此,你應該看看opencv image ROI's(感興趣的區域)。這很容易做到,你在這個網站有很多問題。缺點是你只能檢測一個區域的邊緣而不是整個圖像的邊緣,這可能是很好的,取決於問題。

如果你真的要調整大小的圖像,OpenCV的開發人員通常使用pyrDownpyrUp功能時,他們要處理較小的圖像,而不是調整。我認爲這是因爲它速度更快,但你可以測試它是確定的。 More information about pyrDown and pyrUp in this link.

關於CV ::調整算法,這裏是名單:

INTER_NEAREST - a nearest-neighbor interpolation 
INTER_LINEAR - a bilinear interpolation (used by default) 
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. 
INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood 
INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood 

不能肯定地說,如果INTER_LINEAR是最快的他們全部,但可以肯定的是快於INTER_CUBIC

+0

優秀的答案,謝謝。 – fredley 2013-02-14 10:06:43

+1

其實對我來說,__INTER \ _NEAREST__是最快的 – 2016-11-27 07:19:01