gpt4 book ai didi

java - OpenCV Android 背景减法

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:53:32 24 4
gpt4 key购买 nike

我正在从事一个机器人项目,该项目使用 Android 手机作为主处理器,并使用摄像头来检测运动。我得到了 Android binary package from OpenCV并正确安装。我可以使用 OpenCV native 相机捕获图像并将它们显示到屏幕上。不过,我在使用背景减法类时遇到了问题。我可以在构造函数中创建一个新的 BackgroundSubtractorMOG 对象,但是当我尝试运行下面的代码时,它强制退出我从 native 代码中收到错误“BackgroundSubtractorMOG 仅支持 1 channel 和 3 channel 8 位图像”。我尝试将 Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA 更改为 Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB,然后它不会强制退出,但我得到的只是黑屏。我很确定 bmp 对于 FRAME_RGB 仍然为空,因为屏幕保持黑色,并且我在位图之后绘制的 fps 计数器(为清楚起见从下面发布的代码中删除并作为故障排除步骤)没有显示。

我查看了此函数的 OpenCV C++ 代码(line 388 here),如果图像类型不是 CV_8UC1 或 CV_8UC3,则会出现图像类型错误,因此我尝试使用 java CvType.CV_8UC3 而不是 Highgui capture.retrieve() 中的 .CV_CAP_ANDROID_COLOR_FRAME_RGBA,但它强制关闭并且出现“不支持输出帧格式”错误。

我猜我只是遇到了类型转换问题,但我终究无法弄清楚 OpenCV 的特定于 Android 的图像类型与记录的常规图像类型相符的地方。任何帮助将不胜感激。

变量:

private SurfaceHolder mHolder;
private VideoCapture mCamera;
private Mat mRgba;
private Mat mFGMask;
private BackgroundSubtractorMOG mBGSub;

我的 SurfaceView 的 run() 函数:

public void run() {    
Bitmap bmp = null;

synchronized (this) {
if (mCamera == null)
break;

if (!mCamera.grab()) {
Log.e(TAG, "mCamera.grab() failed");
break;
}

processFrame(mCamera);
bmp = Bitmap.createBitmap(mFGMask.cols(), mFGMask.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(mFGMask, bmp);
}

if (bmp != null) {
Canvas canvas = mHolder.lockCanvas();
if (canvas != null) {
canvas.drawBitmap(bmp, (canvas.getWidth() - bmp.getWidth()) / 2, (canvas.getHeight() - bmp.getHeight()) / 2, null);
mHolder.unlockCanvasAndPost(canvas);
}
bmp.recycle();
}
}

run()中引用的processFrame()函数:

protected void processFrame(VideoCapture capture) {
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
mBGSub.apply(mRgba, mFGMask);
}

编辑:

最终有效的解决方案:

protected void processFrame(VideoCapture capture) {
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGB);
//GREY_FRAME also works and exhibits better performance
//capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_GREY_FRAME);
mBGSub.apply(mRgba, mFGMask, 0.1);
Imgproc.cvtColor(mFGMask, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
}

最佳答案

您是否尝试过使用 cvtColorCV_RGBA2RGBACV_RGBA2RGB。所以,也许尝试将帧 RGBA 转换为 RGB,然后进行背景减法。像这样:

protected void processFrame(VideoCapture capture) {
capture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA);
Mat rgb;
Imgproc.cvtColor(mRgba, rgb, Imgproc.COLOR_RGBA2RGB);
mBGSub.apply(rgb, mFGMask);
}

编辑:您可以检查位于 hereBackgroundSubtractorMOG 的 OpenCV 单元测试.但是,测试在主测试用例中有 fail("Not yet implemented");

我不确定这是否意味着测试未完成,或者未实现对 BackgroundSubtractorMOG 的支持。您可以尝试运行此单元测试中包含的代码,看看它是否真的有效。

此外,C++ 示例 segment_objects.cpp作为用法示例可能会有所帮助。

希望对您有所帮助! :)

关于java - OpenCV Android 背景减法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9246528/

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