2016-07-18 26 views
2

我有一個二元矩陣進行腐蝕和膨脹功能:OpenCV的安卓程序瓶頸的形態機能

void Detector::morphOps(Mat& binFrame) { 
    Mat erodeElement = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
    Mat dilateElement = getStructuringElement(MORPH_ELLIPSE, Size(10, 10)); 

    erode(binFrame, binFrame, erodeElement); 
    dilate(binFrame, binFrame, dilateElement); 
    dilate(binFrame, binFrame, dilateElement); 
} 

這使得我的程序顯著檢測我要跟蹤的對象更加健壯。但是,這段代碼對於我的其他程序來說是一個巨大的瓶頸。當功能啓用時,我從25-30 fps下降到< 1 fps。有什麼我可以做,以防止它殺死我的幀率(除從我的程序中刪除它)?即另一個更有效地完成相同任務的opencv函數?

我也在考慮多線程,但我不確定如何在這裏實現它,因爲我對android和opencv相當陌生。上面的代碼是本機(jni)我的程序的一部分。

編輯:到目前爲止,我已經試過的替代品:

morphologyEx()開閉+ - 由於擴張規模需要比侵蝕尺寸不執行爲好。 morphologyEx()closing + dilate() - 在Android上沒有顯着的性能提升。

將MORPH_ELLIPSE更改爲MORPH_RECT。我現在得到〜8fps,但這仍然很慢。

回答

0

我在我的Zenfone 2上測試過它,沒有太多的性能問題,它從30fps到23fps,但我使用640x360分辨率。

嘗試減少圖像分辨率:

javaCameraView.setMaxFrameSize(size.width, size.height); 

您也可以讓全局變量,這樣不會有初始化這一切的時候:

Mat erodeElement = getStructuringElement(MORPH_ELLIPSE, Size(3, 3)); 
Mat dilateElement = getStructuringElement(MORPH_ELLIPSE, Size(10, 10)); 

void morphOps(Mat& binFrame) { 
    erode(binFrame, binFrame, erodeElement); 
    dilate(binFrame, binFrame, dilateElement); 
    dilate(binFrame, binFrame, dilateElement); 
} 

是您的幀從javaCameraView來了嗎?同樣重要的是你如何從Java數據傳遞到C++,使用這樣的:

.nativeObj傳遞指針,未重新複製數據。

關於線程,這可能是一個好主意,但它使得它工作非常複雜,我也有一個關於「Android上的OpenCV多線程」的問題。 Here

在寫這篇文章的時候,還沒有答案,但你可以跟着我。

+0

謝謝!我也會看看你的問題。我的分辨率是640 x 480,但有時它開始於1920 x 1080,我不知道如何解決這個問題。你提到製造全球變量......這是否意味着將img尺寸設置爲全球?我不確定這會有什麼幫助,除非我理解不正確。 –

+0

另外,忘了提及,我在不同的二進制mat對象上調用morphOps()7或8次,因爲我正在尋找不同hsv閾值的彩色對象。這是減慢我的速度,這就是爲什麼我正在考慮並行處理。 –

+0

您應該致電: javaCameraView.setMaxFrameSize(size.width,size。高度); 在啓用視圖之前,像這樣: javaCameraView =(JavaCameraView)findViewById(R.id.cameraView); javaCameraView.setMaxFrameSize(size.width,size.height); javaCameraView.setVisibility(SurfaceView.VISIBLE); javaCameraView.setCvCameraViewListener(this); javaCameraView.enableView(); javaCameraView.enableFpsMeter(); –