OpenCV Android 背景减法

2023-11-26

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

我查看了该函数的 OpenCV C++ 代码(388行在这里),如果图像类型不是 CV_8UC1 或 CV_8UC3,则会出现图像类型错误,因此我尝试在 capture.retrieve() 中使用 java CvType.CV_8UC3 而不是 Highgui.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);
}

Edit:

最终有效的解决方案:

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);
}

你有没有尝试过使用cvtColor with CV_RGB2RGBA and 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);
}

EDIT :您可以查看 OpenCV 单元测试BackgroundSubtractorMOG位于here。然而,测试有fail("Not yet implemented");在主要测试用例中。

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

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

希望有帮助! :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV Android 背景减法 的相关文章

  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • 如何在谷歌地图android上显示多个标记

    我想在谷歌地图android上显示带有多个标记的位置 问题是当我运行我的应用程序时 它只显示一个位置 标记 这是我的代码 public class koordinatTask extends AsyncTask
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • 获取文件的总大小(以字节为单位)[重复]

    这个问题在这里已经有答案了 可能的重复 java 高效获取文件大小 https stackoverflow com questions 116574 java get file size efficiently 我有一个名为 filenam
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • Opencv Java 灰度

    我编写了以下程序 尝试从彩色转换为灰度 Mat newImage Imgcodecs imread q1 jpg Mat image new Mat new Size newImage cols newImage rows CvType C
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 通过系统应用程序以编程方式静默安装 apk(无需 root)

    我有带有 android sharedUserId android uid system UID 1000 的系统级应用程序 设备未root INSTALL PACKAGES 权限包含在清单中 我可以静默安装下载的 apk 吗 我已经发现这
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 每当使用 import cv2 时 OpenCV 都会出错

    我在终端上使用 pip3 install opencv contrib python 安装了 cv2 并且它工作了 但是每当我尝试导入 cv2 或运行导入了 cv2 的 vscode 文件时 在 python IDLE 上它都会说 Trac
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • 底层字符集是否仅取决于 C 实现?

    许多文本警告说 处理char整数值不可移植 例如假设 A 的值为 65 如 ASCII 所示 但是什么决定了该字符集是 ASCII 或扩展形式 还是其他字符集呢 是由操作系统决定的 还是由编译器决定的 我认为这不依赖于硬件 例如 Intel
  • C++ 向函数发送任何类型的参数

    事情是这样的 我想创建一个 void 函数 它将接收两种众所周知的值类型和另一种可以是任何类型的值 代码如下 void change settings string element short setting value switch se
  • 空感知函数调用? [复制]

    这个问题在这里已经有答案了 Dart 有一些空感知运算符 即可以执行以下操作 var obj obj foo foo is only called if obj null 这对于存储或传递给变量的函数也可能吗 通常的模式是 typedef
  • 禁用列表视图的交叉幻灯片选择

    我正在设计一个应用程序 它的中心有一个垂直平移的一维列表 用户可以通过翻转视图在列表之间水平翻转 当用户在列表视图中水平拖动时 它会选择该行 因为横向滑动 这不是我想要的行为 我最好希望 Flipview 开始左右平移 我认为这与rails
  • 允许在 Android Webview + jquery mobile 中进行远程 ajax 调用

    我正在使用 jquerymobile 开发一个 javascript HTML 应用程序 它向远程服务器发出 ajax 请求 该应用程序在 Chrome 上运行良好 仅在禁用网络安全的情况下启动 chrome 但是当我将其嵌入 Androi
  • Doctrine2 急切加载运行多个查询而不是 1 个

    我将 Symfony2 与 Doctrine2 最新版本 一起使用 并定义了此关系 ORM OneToMany targetEntity Field mappedBy event fetch EAGER ORM OrderBy name A
  • MySQL - 一组时间差的总和

    我想对所有时间差求和以显示志愿者的总工作时间 获取时间差的结果集很容易 Select timediff timeOut timeIn FROM volHours WHERE username skolcz 它给出了按小时列出的时间列表 但我
  • Python程序删除文本文件中的特定行[重复]

    这个问题在这里已经有答案了 我有一个文本文件 Thai Rectangle2 National Parks txt 其中包含以下几行 1 2 3 4 5 dy 0 5965 7 现在 我想删除该文本文件中的第 6 行 为此 我使用以下 py
  • @OrderColumn、@OneToMany 和集合的空索引列

    我正在尝试创建保留顺序的父子表 Hibernate 文档中的示例 7 8 显示了如何执行此操作 Entity public class Customer Id GeneratedValue public Integer getId retu
  • 为什么 Apache 的 RewriteRule 会泄露本地路径?

    我正在尝试使用 RewriteRules htaccess具有相对路径 但 Apache 似乎想要输出physical路径而不是server每当我尝试输出相对路径时 绝对路径和服务器根路径工作正常 例如 RewriteEngine On t
  • PHP:strlen返回字符长度而不是字节长度[重复]

    这个问题在这里已经有答案了 我有一个 WordPress 网站 我创建了简单的页面模板 例如 然后我使用这个模板创建了一个页面 该页面显示俄语字符串 意思是 你好 的长度 我期望看到 12 因为由 6 个字符组成的 UTF 8 编码的俄语字
  • 使用物理定律模拟轨道[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 在过去的几周里 我一直在尝试模拟太阳系模拟中的轨道 这是我作为大学模块的一部分进行的 简而言之 我的模拟是使用 Ogre3D 渲染引擎用 C 编写的 我尝试使用牛顿万有引力定律来
  • 未捕获的类型错误:无法读取 null 的属性“offsetTop”

    我正在使用 HTML CSS 和 JavaScript 创建一个带有粘性和响应式导航栏的网页 我创建了响应式导航栏 并试图使其具有粘性 问题是它不粘并且显示错误 未捕获的类型错误 无法读取 null 的属性 offsetTop HTML 代
  • Python3 和 pandas

    我检查了一些其他的答案 并在谷歌上进行了广泛的搜索 似乎找不到有人问过 回答过这个问题 我运行的是 Ubuntu 12 04 我安装了python2 7和python3 2 我运行了 sudo apt get install python
  • C 与 C++ 中具有静态存储持续时间的对象的初始化 [重复]

    这个问题在这里已经有答案了 可能的重复 main 返回什么 例如 以下代码编译时不会出现任何警告 include
  • 使用 Xamarin Form 获取设备属性?

    我正在使用 xamarin 表单设计一个跨平台应用程序 每个页面 视图 表单都是从代码隐藏设计的 现在我想读取用户使用的设备的高度和宽度 根据这些值 我想放置一些页眉和页脚 为了获取 Xamarin Forms 解决方案中的屏幕宽度 或高度
  • 预计加入路径!休眠错误

    我尝试进行连接 但不断收到此错误 预计加入路径 选择 t CourseId FROM 任务作为 t INNER JOIN 课程为 c CoursePermissions 为 cp 哪里 t CourseId 1 I have const s
  • 使用 Node.js 开发丰富的应用程序

    我是 Node js 的新手 需要使用 Node js 开发一个基于 Web 的丰富应用程序 现在我正在研究 Node js 的入门指南 我有机会查看该页面here并对数百个框架感到困惑 我不知道如何选择合适的框架 需要这方面的帮助才能做出
  • 从 HSQLDB 中记录 SQL 表达式

    我在我的应用程序中使用 HSQLDB 现在我需要记录执行的每一条sql语句 我不想自己处理 SQL 日志记录 HSQLDB 中是否有执行此操作的标准方法 HSQLDB 2 2 x 支持 SQL 日志记录 假设你的数据库名为test然后使用
  • OpenCV Android 背景减法

    我正在开发一个机器人项目 使用 Android 手机作为主处理器 并使用摄像头来检测运动 我拿到来自 OpenCV 的 Android 二进制包并正确安装 我可以使用 OpenCV 本机相机捕获图像并将其显示到屏幕上 不过 我在使用背景扣除