从Kinect深度图获得两个连续的3D点云1和2(不是整个云,比如用OpenCV的GoodFeaturesToMatch从云中选择的100个点),我想从1到2计算摄像机的单应性.我理解这是一个投影变换,它已经由很多人完成了:这里(幻灯片12),这里(幻灯片30)和这里似乎是经典论文.我的问题是,虽然我是一名称职的程序员,但我没有数学或触发技巧将其中一种方法转化为代码.由于这不是一个简单的问题,我为解决以下问题的代码提供了大量的赏金:
相机位于原点,沿Z方向看,不规则的五面体[A,B,C,D,E,F]:

相机向左移动-90mm(X),向上移动60mm(Y),向前移动+ 50mm(Z)并向下旋转5°,向右旋转10°,逆时针旋转-3°:

旋转整个场景以使相机返回其原始位置允许我在2处确定顶点的位置:

以下是顶点之前和之后的位置,内在函数等:

请注意,camera2的顶点不是100%准确,有一些故意的噪音.
我需要的代码,必须可以很容易地翻译成VB.Net或C#,必要时使用EMGUCV和OpenCV,获取2组顶点和内在函数并生成此输出:
Camera 2 is at -90 X, +60 Y, +50 Z rotated -5 Y, 10 X, -3 Z.
The homography matrix to translate points in A to B is:
a1, a2, a3
b1, b2, b3
c1, c2, c3
Run Code Online (Sandbox Code Playgroud)
我不知道单应性坐标的单应性是3X3还是3X4,但它必须允许我将顶点从1转换为2.
我也不知道值a1,a2等; 那是你必须找到的; ;-)
500赏金提供'替换'我提供给这个非常相似的问题的赏金,我在那里添加了一个指向这个问题的评论.
编辑2:我想知道我问这个问题的方式是否具有误导性.在我看来,问题更多的是点云拟合而不是相机几何(如果你知道如何平移和旋转A到B,你知道相机变换,反之亦然).如果是这样,那么也许可以用Kabsch的算法或类似的方法获得解决方案
这里通常建议添加索引作为性能问题的补救措施.
(我说的只是阅读和查询,我们都知道索引会使写入速度变慢).
多年来,我在DB2和MSSQL上多次尝试过这种补救措施,结果总是令人失望.
我的发现是,无论一个指数如何变得更好,"它显得更好",结果表明查询优化器更加智能,而我精心选择的索引几乎总是让事情变得更糟.
我应该指出,我的经历主要涉及小桌子(<100'000行).
任何人都可以提供一些关于索引选择的实用指南吗?
正确的答案是建议列表如下:
理想情况下,答案将给出一些有益的例子.
我有一个来自相机的2个连续图像,我想估计相机姿势的变化:

我计算光流量:
Const MAXFEATURES As Integer = 100
imgA = New Image(Of [Structure].Bgr, Byte)("pic1.bmp")
imgB = New Image(Of [Structure].Bgr, Byte)("pic2.bmp")
grayA = imgA.Convert(Of Gray, Byte)()
grayB = imgB.Convert(Of Gray, Byte)()
imagesize = cvGetSize(grayA)
pyrBufferA = New Emgu.CV.Image(Of Emgu.CV.Structure.Gray, Byte) _
(imagesize.Width + 8, imagesize.Height / 3)
pyrBufferB = New Emgu.CV.Image(Of Emgu.CV.Structure.Gray, Byte) _
(imagesize.Width + 8, imagesize.Height / 3)
features = MAXFEATURES
featuresA = grayA.GoodFeaturesToTrack(features, 0.01, 25, 3)
grayA.FindCornerSubPix(featuresA, New System.Drawing.Size(10, 10),
New System.Drawing.Size(-1, -1),
New Emgu.CV.Structure.MCvTermCriteria(20, 0.03))
features = …Run Code Online (Sandbox Code Playgroud) 我有一辆绿色车辆,它将很快与一个蓝色物体(距离立方体 200 米)相撞\n
它在 [-100,0,200] 处有一个 Kinect 深度相机 D,可以看到立方体的角(灰色球体)\n
测量的深度为 464,位于 X 平面中的 6.34\xc2\xb0 处和 Y 平面中的 12.53\xc2\xb0 处。\n
\n
我想计算角点的位置,如果在 [150,0,0] 处有一个摄像机 F,它会出现这样的位置:\n
换句话说,将红色向量变换为黄色向量。我知道这是通过变换矩阵实现的,但我不知道如何从 DF 向量 [250,0,-200] 计算矩阵或如何使用它;我的高中数学可以追溯到 40 年前。
\n\nmath.se 有一个类似的问题,但它没有涵盖我的问题,而且我在 robots.se 上也找不到任何内容。
\n\n我意识到我应该展示一些我尝试过的代码,但我不知道从哪里开始。如果有人能帮助我解决这个问题,我将非常感激。
\n我有一个集合,我故意想在堆上分配它们并“通过引用”访问它们:
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Containers.Indefinite_Hashed_Maps;
with Ada.Containers; use Ada.Containers;
procedure Main is
type Thing_Key is new Integer;
type Thing is record
Key : Thing_Key;
Data : Integer;
end record;
type Thing_Access is access all Thing;
function Image (T : Thing) return String is
(T.Key'Image & '(' & T.Data'Image & ')');
function "=" (A, B : Thing) return Boolean is
(A.Key = B.Key);
function Thing_Hash (K : Thing_Key) return Hash_Type is
(Hash_Type (K));
package Thing_Map is new
Ada.Containers.Indefinite_Hashed_Maps
(Key_Type …Run Code Online (Sandbox Code Playgroud) 假设我们有一辆车,它从 IMU 获取它的位置。IMU 包由几个私有组件组成,它编排这些组件以计算车辆在空间中的状态:
with IMU; use IMU;
Package Vehicle is
...
end vehicle;
Package IMU is
type Attitude is record
Lat, Lon: Angle;
Pitch, Roll, Yaw: Angle;
GroundSpeed: Speed;
...
end record
function Get_Position return Attitude is ...
Package GPS is
...
end GPS;
Package Accelerometer is
...
end Accelerometer;
Package Gyro is
...
end Gyro;
end IMU;
Run Code Online (Sandbox Code Playgroud)
GPS、加速度计和陀螺仪的内部结构仅在 IMU 环境中有意义;它们必须完全隐藏在 Vehicle 之外。
在单个源文件中声明 IMU 及其所有子组件将难以阅读和维护;我希望每个子组件都在它自己的源文件中。如果我在 IMU 级别对它们进行编码,则车辆将能够访问 GPS,这是错误的。
构建嵌套包的最佳实践是什么?