提高OpenCV性能Android - 快速对象跟踪

Rya*_*ner 6 performance multithreading android opencv tbb

我正在尝试在Android上实现快速对象跟踪应用

我的逻辑如下

  1. 除去所需的颜色范围以外的所有颜色.
  2. 使用GaussianBlur平滑图像
  3. 使用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);
    }

}
Run Code Online (Sandbox Code Playgroud)

我一直在想办法提高我的表现,我想建议哪些可能是可行的和重要的.

1)使用多线程.我可以使用线程从相机捕获一个线程来处理图像.从OpenCV Android发行说明中我看到"使用TBB启用了多线程支持(目前只有少数功能得到优化)."但我不明白这一点.TBB仅适用于英特尔芯片吗?哪些功能可用?是否有Android和OpenCV的相关示例?

2)使用更强大的Android设备.我目前使用前置摄像头在2012 Nexus 7上运行.关于哪些规格对我很重要,我真的不太了解.Nexus 7(2012)拥有1.3GHz四核Nvidia Tegra 3 CPU; 416MHz Nvidia GeForce ULP GPU.

如果我要使用目前最快的Android手机,它会有多大差异?

哪种规格与此类应用最相关

  1. 中央处理器.
  2. GPU.
  3. 核心数量.
  4. 相机的帧速率.

3)使用Native C++代码会对我的表现产生积极影响吗?

4)我可以使用OpenCV的替代品吗?

old*_*ufo 6

0)我为你用来检查你需要优化的所有函数配置(或测量运行时),然后计划进一步的优化.

1)多线程可以提高帧速率,但不能延迟(一个核心进程一帧,x ms.你有N个核心,所以你有N帧非常快,那么你必须再等x ms.).我不确定OpenCV,但据我所知,高斯模糊和Hough变换不使用多核.

2)英特尔TBB不仅适用于英特尔芯片,人们还将其用于ARM和AMD芯片.请参阅 使用TBB for ARM的OpenCV配置(Ubuntu,3.0.63)

3-4)你使用非常简单的算法,一切都可以自己实现,没有OpenCV.而OpenCV霍夫变换或高斯模糊非常快.C++比Python更快,但在"整个程序运行时"方面.Python OpenCV只是C++库之上的包装器,因此它们的"单独"性能是相似的.

  • 此外,我认为CPU速度和芯片组是当前基于opencv的程序最重要的事情(对于opencv-android而言,没有太多的多核,GPU计算).并尝试降低预览分辨率,如果你无法解决. (3认同)