程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了OpenCV Android背景扣除大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决OpenCV Android背景扣除?

开发过程中遇到OpenCV Android背景扣除的问题如何解决?下面主要结合日常开发的经验,给出你关于OpenCV Android背景扣除的解决方法建议,希望对你解决OpenCV Android背景扣除有所启发或帮助;

您是否尝试过将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作为使用示例可能会有所帮助。

希望有帮助!:)

解决方法

我正在使用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_CAP_ANDROID_GREY_FRAME);
    mBGSub.apply(mRgba,mFGMask,0.1);
    Imgproc.cvtColor(mFGMask,mRgba,Imgproc.COLOR_GRAY2BGRA,4);
}

大佬总结

以上是大佬教程为你收集整理的OpenCV Android背景扣除全部内容,希望文章能够帮你解决OpenCV Android背景扣除所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。