我想實現在Android提高OpenCV的性能的Android - 快速目標跟蹤
我的邏輯快速對象跟蹤應用程序是如下
- 刪除所有顏色,除了所需的顏色範圍。
- 平滑的圖像使用高斯模糊
- 查找與HoughCircles
的應用程序之類的工作正常,但表現糟糕,我想至少快5倍,以加快自己的表現最大半徑的圓。我借用了這個鏈接的大部分邏輯。
public void apply(Mat src, Mat dst) {
Mat mIntermediateMat = new Mat(src.rows(), src.cols(), CvType.CV_8UC1);
Mat mHsv = new Mat(src.size(), CvType.CV_8UC3);
Mat mHsv2 = new Mat(src.size(), CvType.CV_8UC3);
Imgproc.cvtColor(src, mHsv, Imgproc.COLOR_RGB2HSV, 3);
Core.inRange(mHsv, new Scalar(0, 86, 72), new Scalar(39, 255, 255), mHsv); // red
Core.inRange(mHsv, new Scalar(150, 125, 100), new Scalar(180,255,255), mHsv2); // red
Core.bitwise_or(mHsv, mHsv2, mHsv);
/// Reduce the noise so we avoid false circle detection
Imgproc.GaussianBlur(mHsv, mHsv, new Size(7, 7), 2);
Imgproc.HoughCircles(mHsv, mIntermediateMat, Imgproc.CV_HOUGH_GRADIENT,2.0,100);
int maxRadious = 0;
Point pt = new Point(0,0);
if (mIntermediateMat.cols() > 0) {
for (int x = 0; x < mIntermediateMat.cols(); x++)
{
double vCircle[] = mIntermediateMat.get(0,x);
if (vCircle == null)
break;
int radius = (int)Math.round(vCircle[2]);
if (radius > maxRadious) {
maxRadious = radius;
pt = new Point(Math.round(vCircle[0]), Math.round(vCircle[1]));
}
}
int iLineThickness = 5;
Scalar red = new Scalar(255, 0, 0);
// draw the found circle
Core.circle(dst, pt, maxRadious, red, iLineThickness);
}
}
我一直在想辦法提高自己的表現,我想上可能是可行的和顯著建議。
1)使用多線程。我可以使用一個線程從相機捕捉,一個線程處理圖像。從OpenCV Android Release notes我看到「使用TBB啓用多線程支持(只有少數功能在此刻進行了優化)」。但我不明白這一點。 TBB僅適用於英特爾芯片嗎?哪些功能可用? Android和OpenCV有相關的例子嗎?
2)使用更強大的Android設備。我目前使用前置攝像頭在2012年Nexus 7上運行。對於哪些規格對我來說很重要,我並不十分清楚。 Nexus 7(2012)採用1.3GHz四核Nvidia Tegra 3 CPU; 416MHz的Nvidia GeForce ULP GPU。
如果我要運行在當前最快的Android手機上,它會產生多大的差異?
哪些功能最相關的這種類型的應用程序
- CPU。
- GPU。
- 核心數量。
- 相機的幀速率。
3)使用Native C++代碼會對我的性能產生積極影響嗎?
4)我可以使用OpenCV嗎?
之外,我認爲CPU速度和芯片組是目前基於OpenCV的的方案中最重要的東西(沒有太大的多核GPU計算爲OpenCV的-機器人還)。並嘗試減少預覽分辨率,如果你沒有辦法。 – flankechen
感謝您的回答,我嘗試了多線程,但看不到任何重大改進。也許我的實現有問題。我會問一個新問題。我將不得不嘗試爲TBB找到更多資源,並按照您的建議嘗試配置文件。我認爲你的答案和flankechen的投入一起解答了我的大部分問題。順便說一下,這是Java和不是Python –