库:OpenCV 目标:Android (OpenCV4Android)
我尝试计算世界平面(例如监视器屏幕)的单应性以获得相机姿势,对其进行变换并将点重新投影回以用于跟踪任务。 我正在使用 OpenCVs findHomography()/getPerspectiveTransform() 来获得单应性。使用 perspectiveTransform() 对点进行重新投影(如此处解释:http://docs.opencv.org/doc/tutorials/features2d/feature_homography/feature_homography.html)效果很好。 “screenPoints”是显示器边缘的世界坐标(使用宽高比和 0 的 z 值),“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 中)考虑单应性中的相机参数。
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);
我的下一步是根据此处描述的单应性计算相机位姿 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 , 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 的“多 View 几何”一书,我阅读了所有相关部分 - 但老实说 - 我没有读懂其中的大部分内容。
更新:
在我的相机矩阵中发现了一个错误 - 上面的实现工作正常!
最佳答案
让它以另一种方式工作。而不是使用 findHomography()/getP erspectiveTransform() 我发现了另一个名为 solvePnP() 的函数,它返回基于世界和图像点以及固有相机矩阵的相机姿势。
将该函数与 projectPoints() 方法结合使用 - 我能够将 3d 点重新投影回图像。
如果屏幕边缘位于图像的正确位置。
更新:
我在我的实现中发现了一个错误——我的相机内在矩阵是错误的。上面单应性实现的相机姿势对我有用!
关于安卓和 OpenCV : Homography to Camera Pose considering Camera Intrinsics and Backprojection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17027277/
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目
👨💻个人简介:深度学习图像领域工作者🎉总结链接: 链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括: 📌1.工作中常用深度学习脚本 📌2.torch、numpy等常用函数详解 📌3.opencv图片、视频等操作 📌4.个人工作中的项目总结(纯干活) 链接:https://blog.csdn.net/qq_28949847/article/details/128
1cv::rectangle介绍1.1功能: 绘制一个简单的、粗的或填充的直角矩形或直角矩形框。1.2c++代码形式rectangle()[1/2]#includevoidcv::rectangle ( InputOutputArray img, Point pt1, Point pt2, constScalar& color, int thickness=1, int lineType=LINE_8, int shift=0 ) img 图像。pt1 矩形的顶点。pt2 与pt1相对的矩形的顶点。意思是pt1和pt2是对角顶点color 颜色或亮
在微信小程序开发中遇到在video组件的两个问题1.安卓手机里播放视频会有明显的卡顿问题刚开始以为是网络问题,或者是视频文件问题。排查了一下发现都没问题最后加了个属性就OK了uniapp和原生小程序方法:custom-cache="false"custom-cache={{false}}video组件兼容iOS手机custom-cache加了这个属性会让2.iOS手机第一次播放视频会有几秒黑屏问题因此我加了当前手机型号的判断uni.getDeviceInfo().deviceType获取当前设备api当为iPhone时不加custom-cache属性,否则加上custom-cache=“fal
安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景万恶的设计小姐姐又来搞事情啦,你说好好的设计一个纯色的背景框框不好嘛,非要把一个框框弄成渐变的,如果不拿出放大镜估计没几个人能看出来它是渐变的。来,我让你看看是啥样框子是从左到右渐变的,设计应该是做了一个底图,然后上面盖了一个白色圆角矩形。那么我们该怎么去实现它呢?实现方法下面介绍三种实现它的方法。先贴上源码地址,大家记得给个starhttps://git
我无法使用以下说明生成OpenCV.js:https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html我有这个错误:CMakeError:CMakewasunabletofindabuildprogramcorrespondingto"UnixMakefiles".CMAKE_MAKE_PROGRAMisnotset.Youprobablyneedtoselectadifferentbuildtool.当我尝试执行时:python./platforms/js/build_js.pybuild_js好的,伙计们!您可以从此页面的
使用OpenCV的函数hconcat()、vconcat()实现图像或矩阵的连接函数hconcat()在水平方向上连接图像或矩阵;函数vconcat()在垂直方向上连接图像或矩阵。两个函数的原型和使用方法一模一样,所以在下面的函数原型介绍中,只介绍函数hconcat()的。函数hconcat()的C++原型有三种,分别如下:voidcv::hconcat(constMat*src,size_tnsrc,OutputArraydst)上面这个原型中的参数nsrc表求src数组中的图像或矩阵个数。voidcv::hconcat(InputArraysrc1,InputArraysrc2,Outpu
简介:有时我们需要调试手机浏览器网页信息,这时除了使用fiddler抓包拦截篡改,还可以通过USB连接,通过PC远程调试手机上的浏览器信息,进行映射。历史攻略:adb:安卓手机USB调试模式前置准备:网页内容在移动设备上的体验可能和电脑上完全不同。ChromeDevTools提供远程调试功能安卓远程调试支持:在浏览器选项卡中调试网站。在原生安卓应用中调试网页内容。将屏幕从你的安卓设备上投影到你的开发机器上。使用端口转发和虚拟主机映射来让安卓设备访问开发使用的服务器。操作步骤:1、手机通过USB连接电脑。2、开启手机调试模式。3、PC电脑edge输入:edge://inspect/#device