gpt4 book ai didi

java - 形态学函数瓶颈的 OpenCV Android 程序

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:57 25 4
gpt4 key购买 nike

我有一个对二元矩阵执行腐 eclipse 和膨胀的函数:

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 还很陌生。上面的代码是我程序的 native (jni) 部分。

编辑:到目前为止我尝试过的替代方案:

morphologyEx() opening + closing - Doesn't perform as well because the dilate size needs to be larger than the erode size.

morphologyEx() closing + dilate() - no significant performance boost on Android.

changing MORPH_ELLIPSE to MORPH_RECT. I now get ~8fps, but this is still very slow.

最佳答案

我在我的 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++ 也很重要,请像这样使用:

@Override
public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame)
{
_imgBgrTemp = inputFrame.rgba();
jniFrame(_imgBgrTemp.nativeObj);
return _imgBgrTemp;
}

.nativeObj 传递指针而不重新复制数据。

关于线程,这可能是个好主意,但要使其安全运行非常复杂,我还有一个关于“Android 上的 OpenCV 多线程”的问题。 Here

在写这篇文章时,还没有答案,但你可以跟着我。

关于java - 形态学函数瓶颈的 OpenCV Android 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38444746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com