gpt4 book ai didi

opencv - OpenCV-查找与静态深度倾斜矩形的角度

转载 作者:行者123 更新时间:2023-12-02 17:11:52 37 4
gpt4 key购买 nike

给定固定位置的矩形和未知位置的摄像头,如何找到摄像头和矩形之间的水平角?矩形将始终垂直于地面,并且大小固定。相机将始终处于比矩形低的高度。

Rectangle head on

Rectangle from an angle

(图像来自here,这是相同的前提。)

如何计算从摄像机到目标矩形的水平 Angular ?假设矩形目标已经在OpenCV中转换为MatOfPoints对象。

更新:使用SolvePNP和以下图像,所得的“旋转和位置垫”为不同的图像提供了一些意外的数字。检测到的角已用圆圈上色,并绘制了BoundingRectangle。
Head on
给出结果垫转储:

Rotation: [2.662893740213683e-05;
-0.0001007426907390123;
0.0484638952150343]
Position: [18.43394203112024;
48.39531890689394;
0.1318397318617369]

Slightly to the left
给出结果垫转储:
Rotation: [-0.0001071012175770757;
-4.285121336676997e-05;
0.01258020218302199]
Position: [35.87669469188199;
45.47657018572935;
0.1244586014980523]

最佳答案

困难的方法:

i)在图像中找到CLOCKWISE矩形2D角。

std::vector<cv::Point2f> rect_corners_2d; // TODO find clockwise rectangle 2D corners in image

我想既然已经绘制了矩形,您就拥有了这些点。

ii)只要矩形以其光轴面向的中心位于相机上,就以物理单位定义矩形的3D角。
float width; // TODO set rectangle's physical width
float height; // TODO set rectangle's physical height
std::vector<cv::Point3f> rect_corners_3d =
{
cv::Point3f(-width/2, -height/2, 0.0), // top-left
cv::Point3f(width/2, -height/2, 0.0), // top-right
cv::Point3f(width/2, height/2, 0.0), // bottom-right
cv::Point3f(-width/2, height/2, 0.0) // bottom-left
};

iii)旋转图像点,使每个2D角对应于其3D对角。
// rectangle's top-left corner must be the first in 2D image points since it is the first in 3D defined ones
int index; // TODO set index of top-left corner in 2D image points
std::rotate(rect_corners_2d.begin(), rect_corners_2d.begin() + index, rect_corners_2d.end());

iv)了解您的相机固有参数和镜头畸变系数。
cv::Mat_<double> intrinsic_parameters; // TODO set camera matrix
cv::Mat_<double> distortion_coefficients; // TODO set lens distortion coefficients

希望您对相机进行了校准。

v)提取相对于可见矩形的相机姿势: http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#solvepnp
cv::Vec3d rotation;
cv::Vec3d position;
cv::solvePnP(rect_corners_3d, rect_corners_2d, intrinsic_parameters, distortion_coefficients, rotation, position);

此处的位置与ii)中定义3D角的单位相同。

vi)读取您的水平 Angular 。
double hangle = rotation[1]; // Y axis <--> horizontal angle

结论:计算出的姿势是相机相对于看到的矩形的姿势,而不是您期望的相反方向。位置和旋转需要反转。还要注意,相机的Y轴向下,并且OpenCV使用右手坐标系。您可能需要重新考虑最终 Angular 符号。

关于opencv - OpenCV-查找与静态深度倾斜矩形的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35495075/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com