当前位置: 首页 > 面试题库 >

OpenCV Android背景扣除

邵星光
2023-03-14
问题内容

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

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

我想我只是遇到类型转换问题,但是我无法终生弄清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_html" target="_blank">CAP_ANDROID_GREY_FRAME);
    mBGSub.apply(mRgba, mFGMask, 0.1);
    Imgproc.cvtColor(mFGMask, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
}

问题答案:

您是否尝试过将cvtColor与CV_RGB2RGBA和一起使用CV_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);
}

编辑:
您可以检查出OpenCV的单元测试BackgroundSubtractorMOG位于这里。但是,该测试已fail("Not yet implemented");在主要测试用例中进行。

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

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

希望有帮助!:)



 类似资料:
  • 背景组件可以为场景设置背景色,效率要比a-sky高很多,因为并没有创建额外的模型,没有不必要的裁剪(当天空盒超出视锥体时)和遮挡处理(当天空盒遮挡3D对象时)。 例子 下面的示例将背景颜色设置为红色。 <a-scene background="color: red"></a-scene> Properties 属性 描述 默认值 color 场景背景的颜色。 black transparent 背

  • 背景 background-color background-color: <color> background-color: #f00; background-color: rgba(255, 0, 0, 0.5); background-color: transparent; /* 默认值 */ background-image background-image: <bg-image>[,

  • 背景是在3D场景中"地球背后"的区域。背景默认的颜色是0x000000。 背景的颜色可以通过 configure() API进行设置,如下所示: controller.configure({         color: {                 background:0x0000ff         } }); 也可以通过 setBackgroundColor() API来动态改变背景

  • 引言 2008年,V8 引擎随 Chrome 浏览器横空出世,JavaScript 这门通用的 Web 脚本语言的执行效率得到质的提升。 V8 引擎的出现,注定是 JavaScript 发展史上一个光辉的里程碑。它的出现,让当时研究高性能服务器开发、长时间一筹莫展的 Ryan Dahl 有了新的、合适的选择,不久,在2009年的柏林的 JSConf 大会上,基于 JavaScript 的服务端项目

  • CSS3 Background 中包含几个新的背景属性,提供更大背景元素控制。 主要是2个背景属性: background-size background-origin 您还将学习如何使用多重背景图像。 background-size 该属性规定背景图片的尺寸。 在 CSS3 之前,背景图片的尺寸是由图片的实际尺寸决定的。在 CSS3 中,可以规定背景图片的尺寸,这就允许我们在不同的环境中重复使用

  • 背景 设定自家选单的背景。 原始预设 显示购买时默认的背景。 经典 显示系统软件版本4.XX以前的PSP™内建的[标准]主题。 饼干 显示[饼干]的主题。    自定义主题 显示自定义主题所使用的背景。 会于主题保存在PSP™主机的内存时显示。可于PSP™主机的内存保存一种主题。 桌布 显示登录在(相片)的图像。