Android 和 OpenCV:考虑相机本质和反向投影的相机姿势单应性

2023-12-27

库:OpenCV 目标:Android (OpenCV4Android)

我尝试计算世界平面(例如监视器屏幕)的单应性以获取相机姿势,对其进行变换并将点重新投影回以进行跟踪任务。 我使用 OpenCVs findHomography() / getPerspectiveTransform() 来获取单应性。使用perspectiveTransform()对点进行重新投影(如下所述:http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html)效果很好。 “screenPoints”是显示器边缘的世界坐标(使用纵横比和 z 值 0),“imagePoints”是图像中屏幕边缘的 x/y 坐标。

Mat homography = org.opencv.imgproc.Imgproc.getPerspectiveTransform(screenPoints, imagePoints);

我有相机校准矩阵(我已经使用了matlab校准工具箱)并且我发现了一个提示(在评论@https://dsp.stackexchange.com/questions/2736/step-by-step-camera-pose-estimation-for-visual-tracking-and-planar-markers https://dsp.stackexchange.com/questions/2736/step-by-step-camera-pose-estimation-for-visual-tracking-and-planar-markers)用于考虑单应性中的相机参数。

H' = K^-1 * H

(H' - 考虑相机校准的单应性矩阵,H - 单应性矩阵,K^-1 - 逆相机校准矩阵)。

Mat intrinsicInverse = new Mat(3, 3, CvType.CV_32FC1);
Core.invert(intrinsic, intrinsicInverse);
intrinsicInverse.convertTo(intrinsicInverse, CvType.CV_32FC1);          
homography.convertTo(homography, CvType.CV_32FC1);
// compute H respect the intrinsics
Core.gemm(intrinsicInverse, homography, 1, new Mat(), 0, homography);

我的下一步是根据单应性计算相机姿势,如此处所述基于4个共面点的单应矩阵计算相机位姿 https://stackoverflow.com/questions/8927771/computing-camera-pose-with-homography-matrix-based-on-4-coplanar-points.

由于我尝试在 Android 上执行此操作,因此我必须将 C++ 代码移植到 Java:

private Mat cameraPoseFromHomography(Mat h) {
    Log.d("DEBUG", "cameraPoseFromHomography: homography " + matToString(h));

    Mat pose = Mat.eye(3, 4, CvType.CV_32FC1);  // 3x4 matrix, the camera pose
    float norm1 = (float) Core.norm(h.col(0));
    float norm2 = (float) Core.norm(h.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;       // Normalization value

    Mat normalizedTemp = new Mat();
    Core.normalize(h.col(0), normalizedTemp);
    normalizedTemp.convertTo(normalizedTemp, CvType.CV_32FC1);
    normalizedTemp.copyTo(pose.col(0));

    Core.normalize(h.col(1), normalizedTemp);
    normalizedTemp.convertTo(normalizedTemp, CvType.CV_32FC1);    
    normalizedTemp.copyTo(pose.col(1));

    Mat p3 = pose.col(0).cross(pose.col(1));
    p3.copyTo(pose.col(2));

    Mat temp = h.col(2);
    double[] buffer = new double[3];
    h.col(2).get(0, 0, buffer);
    pose.put(0, 3, buffer[0] / tnorm);
    pose.put(1, 3, buffer[1] / tnorm);
    pose.put(2, 3, buffer[2] / tnorm);

    return pose;
}

我无法检查代码是否执行正确的操作,但它正在运行。 此时,考虑到相机校准,我假设拥有完整的相机姿势。

如此处所述http://opencv.willowgarage.com/documentation/python/calib3d_camera_calibration_and_3d_reconstruction.html#rodrigues2 http://opencv.willowgarage.com/documentation/python/calib3d_camera_calibration_and_3d_reconstruction.html#rodrigues2,3D 点的重投影就是

p = K * CP * P

(p - 2D 位置、K - 校准矩阵、CP - 相机位姿、P - 3D 点)

    Core.gemm(intrinsic, cameraPosition, 1, new Mat(), 0, vec4t);
    Core.gemm(vec4t, point, 1, new Mat(), 0, result);

结果远离屏幕边缘的源图像位置。但我可以通过相对差异来识别所有三个边缘 - 所以这可能只是一些错误的因素。

这是我第一次做这样的计算机视觉任务,我可能犯了一些基本错误。我有 Zisserman 的《多视图几何》一书,我阅读了所有相关部分 - 但说实话 - 我没有理解其中的大部分内容。

UPDATE:

在我的相机矩阵中发现了一个错误 - 上面的实现工作正常!


让它以另一种方式工作。而不是使用 findHomography()/getP erspectiveTransform() 我发现了另一个名为solvePnP() 的函数,它根据世界和图像点以及内在相机矩阵返回相机姿势。

将该函数与 projectPoints() 方法结合使用 - 我能够将 3d 点重新投影回图像。

如果是屏幕边缘,则将其放置在图像中的正确位置。

UPDATE:

我在实现中发现了一个错误 - 我的相机内在矩阵是错误的。上面单应性实现的相机姿势对我有用!

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

Android 和 OpenCV:考虑相机本质和反向投影的相机姿势单应性 的相关文章

  • 使用 PutDataMapRequest 后,Wearable.DataApi.getDataItem() 的 Uri 是什么?

    我正在测试可穿戴数据层 API如中所述安卓教程 http developer android com training wearables data layer index html 有一个基于底层 APIDataItem http dev
  • 如何在android中获取MapView API?

    如何在android中获取MapView API thanks Android 文档中实际上是这么写的 你好 地图视图 http developer android com guide tutorials views hello mapvi
  • android ndk 多点触控?

    我正在编写一个仅使用本机代码的应用程序 那么ndk中是否可以获取多点触控事件呢 我感觉我已经搜索了整个网络 但什么也没找到 有谁知道如何做到这一点 是的 您可以检查名为native activity查看如何获取输入事件 寻找engine h
  • 如何实现 ALTER TABLE 的示例[重复]

    这个问题在这里已经有答案了 我已经多次问过这个问题 但尚未得到完整的答案 如何实现 ALTER TABLE 语句以向数据库添加列 有人可以给我举个例子吗 请阅读SQLite ALTER TABLE 参考 http sqlite org la
  • Android:文本淡入和淡出

    我已阅读此 stackoverflow 问题和答案 并尝试实现文本淡入和淡出 Android中如何让文字淡入淡出 https stackoverflow com questions 8627211 how to make text fade
  • 带有图层列表的自定义背景以显示对角线?

    我只想创建一个自定义背景 但我不知道如何使用 xml 而不是图像来做到这一点 这是 XML
  • SQLite FTS4 使用特殊字符进行搜索

    我有一个 Android 应用程序 它使用 FTS4 虚拟表在 SQLite 数据库中搜索数据 它工作正常 但是当表中的数据包含特殊字符 如 或 时 SQLite MATCH 函数不会给出任何结果 我现在迷路了 谢谢 注意 默认的分词器真的
  • 在 /dev/input/eventX 中写入事件需要哪些命令?

    我正在开发一个android需要将触摸事件发送到 dev input eventX 的应用程序 我知道C执行此类操作的代码结构如下 struct input event struct timeval time unsigned short
  • Android 辅助功能服务检测通知

    我试图让我的应用程序在显示通知时进行检测 我已在设置应用程序中启用它并且onServiceConnected确实接到电话 但是当我创建通知或通过 gmail 应用程序接收电子邮件时 什么也没有发生 onAccessibilityEvent没
  • Monodroid 示例/带有源代码的小部件

    我是一名 NET 开发人员 我对用 C 开发 Android 应用程序感兴趣 并且我得到了 monodroid 是否有任何来源可以让我获得 monodroid 示例应用程序 带有源代码 这将帮助我在 monodroid 中开发应用程序 或者
  • 在 android studio 中找不到 SDK 位置

    我刚刚在 android studio 中导入了我的 eclipse 项目 我一直这么说 Error SDK location not found Define location with sdk dir in the local prop
  • 表面视图+gl表面视图+框架布局

    我是 java 和 OpenGL 的新手 我正在尝试获得一个相机预览屏幕 能够 同时显示 3D 对象 浏览完样本后 api 演示 我想结合示例的代码 api 演示就足够了 但不知何故它不起作用 迫使我 启动时关闭 错误被称为空指针 例外 有
  • Android Gradle 问题 - Flutter / Dart

    我的 Gradle 同步有问题 我使用 IntelliJ 和 Android Studio 构建 Flutter Dart 应用程序 我添加了 2 个新的依赖项 现在 Gradle 出现了问题 在 Android Studio 中一切正常
  • 通知声音不适用于 api 10 android

    我用这个功能来显示状态notification 一切正常 但没有声音播放notification public void notifiction main String ticker String title String text int
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • react-native android fontFamily 不生效

    问题一 我在index android js的欢迎样式中添加了fontFamily 但没有效果 fontFamily 真的可以在 Android 上使用吗 欢迎 字体大小 20 fontFamily roboto thin 文本对齐 居中
  • Android Studio代理设置构建错误

    每当我尝试在 Android Studio 中构建应用程序时 都会收到以下错误 Error 169 254 16 169 254 16 Will ignore proxy settings for these hosts 我收到错误 5 次
  • JetPack Compose - 卡中行中的weight() 不起作用

    创建 Android 应用程序时 我将一些可组合项放在卡片的一行中 如下所示 但它没有按我的预期工作 我添加 weight 1f 的可组合项不再显示 data class Test val title String val text Str
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • Android Espresso 单击按钮时出现错误

    我正在尝试使用 espresso 框架为 Android 应用程序编写一些 UI 测试 现在我只是检查启动屏幕上是否存在所有元素 然后尝试单击登录按钮 单击按钮时 测试由于错误而失败 我似乎无法理解为什么会发生这种情况 我的测试代码是 Ru

随机推荐

  • 使用 XSLT 显示时间表

    我正在尝试使用 XSLT 显示大学课程时间表 我的 DTS 如下所示 我想在日 小时表中显示所有课程 看起来像这样 请原谅糟糕的设计 问题是 我想做一个for each子句 但仅针对常规数字 而不针对 xml 的某些部分 XSLT
  • 时间从秒到日期的转换问题

    我有以下内容Long变量以秒为单位保存纪元值 我试图将其转换为Date val seconds 1341855763000 val date Date TimeUnit SECONDS toMillis seconds 输出比我预期的要差很
  • 为什么在同一目录中导入模块时出现 ModuleNotFound?

    问题 当我尝试使用以下命令在 linux bash 上激活 main py 时 python3 main py 不断出现如下所示的错误消息 我不明白为什么 File main py line 1 in
  • FluentValidation ModelState.IsValid 始终为 true

    好吧 我的问题是 fluidValidation 中的 modelvalidator 在我的项目中不起作用 并且无论验证状态如何 ModelState IsValid 始终为 true 我提前使用 asp net mvc 4 net 4 5
  • 更改 Devise 的登录 URL

    使用 before filter authenticate 用户时如何更改设备的登录路径 我在帖子控制器中有以下内容 eg class PostsController lt ApplicationController before filt
  • PowerShell 从日期获取工作日名称

    使用 powershell 我想从日期中获取星期几名称 星期五 一直在谷歌搜索 找不到这个 这样我就可以在日期是星期五时执行 IF 语句来执行某些操作 有人可以帮忙吗 Use Get Date生成 DateTime 对象 然后调用其 Day
  • 在 angular2 中,如何获取为 @Input 发送的对象上更改的属性的 onChanges

    我有一个指令 上面有一个 Input接受一个类 Directive selector my directive View directives CORE DIRECTIVES export class MyDirective Input i
  • HTML 中每个
    后缩进一行

    我尝试将 PDF 书变成 mobi 书 html 并且我还想重新创建布局 在那里 在每次中断之后 文本都是一行 这应该可以做到 但我做错了 因为它不起作用 我不想对段落执行此操作 因为默认情况下还包括一个空行 但这些中断并不总是意味着一个全
  • R 中的简化 dput()

    我错过了一种以透明的方式将数据添加到 SO 答案的方法 我的经验是structure对象来自dput 有时会让没有经验的用户感到不必要的困惑 然而 我没有耐心每次将其复制 粘贴到简单的数据框中 并希望将其自动化 类似的东西dput 但是是简
  • 如何在使用 XJC 生成 JAXB 代码期间重命名顶级类名?

    我正在尝试从几个 xsd 生成一些 bean 不幸的是它们都有相同的根元素 我已成功创建用于重命名子元素的 xjc 绑定文件 但找不到选择根节点来更改它的方法 我尝试了以下操作 但出现错误 错误 的 XPath 计算需要生成一个元素
  • C# 中数据网格的行数和列数

    考虑我有一个数据网格 我需要找到数据网格中的行数和列数 我怎样才能在 C 中做到这一点 The DataGrid Items属性返回一个DataGridItemCollection代表着DataGridItems在数据网格中 Each Da
  • AttributeError:部分初始化的模块“cv2”没有属性“gapi_wip_gst_GStreamerPipeline”(很可能是由于循环导入)

    这种情况突然发生 我能够导入 cv2 但现在导入时出现 AttributeError 部分初始化的模块 cv2 没有属性 gapi wip gst GStreamerPipeline 很可能是由于循环导入 错误 我尝试过的事情 1 卸载并安
  • NuGet-repositories.config

    NuGet新手问题 I saw repositories config被添加到 NuGet 包文件夹中 谁能指导我这个文件的用途是什么 谢谢你 该文件主要是 NuGet 实现细节 不应直接处理 它可能会消失或将来发生变化 但作为参考 它包含
  • 在 python 中更新字典

    我已经被这个问题困扰了很长一段时间 只是无法弄清楚 我只是想能够理解我缺少什么以及为什么需要它 我需要做的是创建一个函数 将每个给定的键 值对添加到字典中 参数 key value pairs 将是 key value 形式的元组列表 de
  • 为什么任务的 Result 属性对于非泛型任务 (C# 4.0+) 不可用?

    我正在尝试掌握 NET 4 0 任务并行库概念 在以下 C 4 0 代码片段中 Task t Task Factory StartNew gt Console WriteLine I am the task return res1 如果不能
  • 我的 Pyflink 设置有什么问题导致 Python UDF 抛出 py4j 异常?

    我正在使用文档中的 flink python datastream 教程 https ci apache org projects flink flink docs master docs dev python datastream tut
  • 如何使用 Cassandra 存储后端删除 Titan 中的图形?

    我使用 Titan 0 4 0 All 在 Ubuntu 12 04 上以共享 VM 模式运行 Rexster 如何正确删除 Titan 中使用 Cassandra 存储后端的图表 我已经尝试过TitanCleanup clear grap
  • 使用 ImageView 时出现内存不足错误

    我正在尝试使用 ImageView 制作壁纸设置应用程序 我知道很难显示一堆图像 特别是当图像为 1920x1080 时 我所做的是制作其他一堆具有较小分辨率 400x200 的图像 这些图像将显示在应用程序中 但是当用户尝试设置时将图像作
  • 如何获取 JSpinner 中所选项目的值?

    我正在制作一个使用最大数量为 30 的 JSpinner 的应用程序 我应该从这个 JSpinner 中选择一个值并将一个字符串粘贴到 JTextField 中 结果将出现在 Textarea 中 当我编译时 我有很多关于该方法的问题jSp
  • Android 和 OpenCV:考虑相机本质和反向投影的相机姿势单应性

    库 OpenCV 目标 Android OpenCV4Android 我尝试计算世界平面 例如监视器屏幕 的单应性以获取相机姿势 对其进行变换并将点重新投影回以进行跟踪任务 我使用 OpenCVs findHomography getPer