我正在尝试使用OpenCV通过SIFT特征跟踪,FLANN匹配以及基本矩阵和基本矩阵的后续计算来估计摄像机相对于另一摄像机的一个姿势。分解基本矩阵后,我检查退化的配置并获得“正确的” R和t。
问题是,它们似乎永远都不对。我包括几个图像对:
结果
结果
在第二种情况下,平移矢量似乎高估了Y方向的运动,而低估了X方向的运动。将旋转矩阵转换为Euler角时,在两种情况下均得出错误的结果。许多其他数据集也会发生这种情况。我尝试过在RANSAC,LMEDS等之间切换基本矩阵计算技术,现在使用RANSAC进行此操作,并且仅使用8点法的内点进行第二次计算。更改特征检测方法也无济于事。对极线似乎是正确的,并且基本矩阵满足x'.Fx = 0
我在这里错过根本上是错的东西吗?假设程序正确理解了对极几何,那么可能发生什么导致完全错误的姿势?我正在检查以确保点都位于两个摄像头的前面。任何想法/建议都将非常有帮助。谢谢!
编辑:尝试使用相同技术,将两个不同的校准摄像机间隔开;并将基本矩阵计算为K2'.F.K1,但平移和旋转仍然相去甚远。
参考代码
import cv2
import numpy as np
from matplotlib import pyplot as plt
# K2 = np.float32([[1357.3, 0, 441.413], [0, 1355.9, 259.393], [0, 0, 1]]).reshape(3,3)
# K1 = np.float32([[1345.8, 0, 394.9141], [0, 1342.9, 291.6181], [0, 0, 1]]).reshape(3,3)
# K1_inv = np.linalg.inv(K1)
# K2_inv = np.linalg.inv(K2)
K = np.float32([3541.5, 0, 2088.8, 0, 3546.9, 1161.4, 0, 0, 1]).reshape(3,3)
K_inv = np.linalg.inv(K)
def in_front_of_both_cameras(first_points, second_points, rot, trans): …Run Code Online (Sandbox Code Playgroud) python opencv computer-vision rotational-matrices pose-estimation
我正在基于虚幻的开源无人机仿真(Microsoft AirSim)上进行工作,在该仿真中,我试图从连接到无人机的摄像机捕获并保存图像。下面的图像提供了游戏外观的概念。底部最右边的视图是摄像机的实际视图,其他两个视图只是同一图像的处理版本。
现在,它的设置方式是这样的:有一个相机资产,通过代码作为捕获组件读取。屏幕快照中的三个视图链接到此捕获组件。无人机在游戏中飞来飞去时,视图流没有任何问题。但是,当涉及到记录屏幕截图时,当前代码从该捕获组件设置一个TextureRenderTargetResource,然后调用ReadPixels并将该数据保存为图像(请参见下面的代码流)。照原样使用ReadPixels()会直接阻止游戏线程,并使整个游戏速度大大降低:当我开始记录时,它从〜120 FPS降至不到10 FPS。
bool saveImage() {
USceneCaptureComponent2D* capture = getCaptureComponent(camera_type, true);
FTextureRenderTargetResource* RenderResource = capture->TextureTarget->GameThread_GetRenderTargetResource();
width = capture->TextureTarget->GetSurfaceWidth();
height = capture->TextureTarget->GetSurfaceHeight();
TArray<FColor> imageColor;
imageColor.AddUninitialized(width * height);
RenderResource->ReadPixels(bmp);
}
Run Code Online (Sandbox Code Playgroud)
看这篇文章,似乎很明显ReadPixels()将“阻塞游戏线程,直到渲染线程赶上”。本文包含用于读取像素的“非阻塞”方法的示例代码(通过移除FlushRenderingCommands()并使用RenderCommandFence标志来确定何时完成任务),但并不能显着提高性能:保存的图像稍高一些,但是游戏线程仍然只能以约20 FPS的速度运行,因此很难控制无人机。是否有任何更有效的异步方法可以实现我正在尝试的功能,例如在单独的线程中?我也对为什么代码在尽快将这些图像流式传输到屏幕上没有问题感到困惑,但是保存图像似乎更加复杂。它'
我有一个嵌入式电路板和一个相机连接到它.我试图在嵌入式主板的控制台输出上打印相机的时间戳.访问时间戳并将其加载到结构中,并使用printf打印,如下所示:
这段代码是循环的.
f.timestamp = hrt_absolute_time(); // Inbuilt function
printf("Timestamp is %u",f.timestamp);
Run Code Online (Sandbox Code Playgroud)
如果运行这些行,它将始终打印"时间戳为77".如果我这样做:
counter = 1;
f.timestamp = hrt_absolute_time();
printf("The %d st timestamp is %u",counter,f.timestamp);
Run Code Online (Sandbox Code Playgroud)
如果运行这些行,则会打印"第一个时间戳为",时间戳每秒更新一次.我的问题是,如此微不足道的事情怎么会造成如此巨大的差异?是因为stdout缓冲区没有从一些旧的printf清除?此模块中没有其他打印语句.有没有人有任何想法?提前致谢!
整个街区:
if (msg->msgid == MAVLINK_MSG_ID_OPTICAL_FLOW) {
mavlink_optical_flow_t flow;
mavlink_msg_optical_flow_decode(msg, &flow);
struct optical_flow_s f;
f.timestamp = hrt_absolute_time();
f.flow_raw_x = flow.flow_x;
f.flow_raw_y = flow.flow_y;
f.flow_comp_x_m = flow.flow_comp_m_x;
f.flow_comp_y_m = flow.flow_comp_m_y;
f.ground_distance_m = flow.ground_distance;
f.quality = flow.quality;
f.sensor_id = flow.sensor_id;
printf("Timestamp is %u",f.timestamp);
//OTHER CODE FOLLOWS
Run Code Online (Sandbox Code Playgroud) 我在 Python 中遇到一个奇怪的问题,其中评估涉及np.linalg.norm值的条件会导致问题。这是我的测试脚本:
import numpy as np
def isGoalReached():
start = np.array([4, 5, 6])
goal = np.array([17, 18, 19])
dist = np.linalg.norm(start - goal)
return (dist < 0.5)
print (isGoalReached())
print (isGoalReached() == 0)
print (isGoalReached() is False)
Run Code Online (Sandbox Code Playgroud)
输出:
False
True
False
Run Code Online (Sandbox Code Playgroud)
如果我删除该np.linalg.norm部分,并重写如下:
import numpy as np
def isGoalReached():
dist = 123.456
return (dist < 0.5)
print (isGoalReached())
print (isGoalReached() == 0)
print (isGoalReached() is False)
Run Code Online (Sandbox Code Playgroud)
输出:
False
True
True
Run Code Online (Sandbox Code Playgroud)
是什么导致了这种非常奇怪的行为?我在 Python 3.7.3 (Anaconda) 上