Rya*_*ner 6 performance multithreading android opencv tbb
我正在尝试在Android上实现快速对象跟踪应用
我的逻辑如下
该应用程序的工作正常,但性能不好,我想要加快我的性能至少快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手机,它会有多大差异?
哪种规格与此类应用最相关
3)使用Native C++代码会对我的表现产生积极影响吗?
4)我可以使用OpenCV的替代品吗?
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++库之上的包装器,因此它们的"单独"性能是相似的.
| 归档时间: |
|
| 查看次数: |
5368 次 |
| 最近记录: |