我的逻辑如下:
- 除了所需颜色范围之外,删除所有颜色。
- 使用GaussianBlur平滑图像
- 使用HoughCircles查找最大半径的圆形
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发布说明中得知,“启用了对TBB的多线程支持(目前只优化了少量函数)。”但是我不理解这个。TBB仅适用于英特尔芯片吗?有哪些函数可用?是否有与Android和OpenCV相关的示例?
2) 使用更强大的Android设备。我目前在2012款Nexus 7上运行,使用前置摄像头。我并不了解哪些规格对我很重要。Nexus 7(2012年)配备1.3 GHz四核Nvidia Tegra 3 CPU和416 MHz Nvidia GeForce ULP GPU。
如果我在目前最快的Android手机上运行,会有多大差异?
哪些规格最相关于此类型的应用程序?
- CPU。
- GPU。
- 核心数。
- 相机的帧速率。
3) 使用本地C ++代码是否会对我的性能产生积极影响?
4) 是否有替代OpenCV的选择?