透视图中的坐标还原

猜想:在一个视图中互相平行的几条直线,在其他的视图中,如果相交,则会交与同一点(灭点),反之,如果一个视图中的交与一点的几条直线在别的视图中如果没有出现相交,则这几条直线都互相平行。

 

在我的项目中要解决这样一个问题:已知一个点在矩形中的图形的透视图,求出点在矩形中的位置。如图:已知透视图为不规则四边形,如下:

 

知道p0/p1/p2/p3p坐标。对应原矩形已知条件为宽度W,高度H, 求原图中p在矩形中的位置,即WcHc

 

 

我的做法是这样的:延长p2/p1交与c1,延长p1/p0交与c2c1/c2分别连接h1,则h1/h=Hc/H,w1/w=Wc/W.

 

 

这样的结论源于这样一个假设:在一个视图中互相平行的几条直线,在其他的视图中,如果相交,则会交与同一点(灭点),反之,如果一个视图中的交与一点的几条直线在别的视图中如果没有出现相交,则这几条直线都互相平行。如下图所示。 

 

 

如果这个假设成立,我推出了更有意思的结论:

如下图,四边形的四条边分别表示为L1/L2/L3/L4,这个四边形在某个视图中是矩形,即L1/L3平行,L2/L4平行。按照假设,那么从C1点看,红线LrL2/L4平行,从C2点看,LrL1/L3平行,也就得出了这样的结论:在原始图(四边形是矩形的那个视图)中,存在一条线,与矩形的四边都是平行的。

这个结论看起来很荒谬,会不会是假设有问题?

但我我觉得这个假设是简洁的、美的,我相信简洁的、美的结论在科学中一般会很有意义。科学中的定理总是美的。

那该如何解释这条线?通过C1C2这两个灭点,我们可以找到线索。灭点就是在平行线在投影视图中汇聚的点。就像我们看到的又长又直的马路的两边最终汇成一点一样。注意,平行线汇聚到灭点C后是不能再延长的。

说明一下,这里原视图指矩形的场景(我们提到的平行线所在的视图),透视图是出现灭点的视图。那么透视图中的灭点在原视图中就是无限远的点。那么,红线就应该在原视图的无限远处。而且是一个无限拓展的封闭曲线的一段!(不晓得宇宙是不是也差不多~(@^_^@)~。)

因为灭点有无穷多个,所有相邻灭点的连线,或者说所有灭点本身就组成了无限远处的那条封闭曲线。这也是一个猜想,三个明显的问题:相邻灭点连线上的点是否是灭点?所有灭点能否组成曲线?这条曲线是否一定是封闭的?

 

我觉得这个问题挺有意思的,跟大家分享一下,欢迎发表意见,或给出证明或反驳。暂时,我的问题就这么求解了。

 

 

 

### 像素坐标系到世界坐标系转换中R矩阵的作用 在计算机视觉领域,像素坐标系到世界坐标系的转换涉及多个步骤和参数。其中,旋转矩阵 \( R \) 是描述相机坐标系相对于世界坐标系的方向的关键部分。 #### 1. R矩阵的作用 \( R \) 表示的是从世界坐标系到相机坐标系之间的旋转关系[^2]。具体来说,它是一个正交矩阵(即满足 \( R^T R = I \),且行列式为1),用于定义如何通过旋转操作将一个向量从世界坐标系变换到相机坐标系。这种旋转可以通过欧拉角、四元数或其他形式来表示并计算。 #### 2. R矩阵的计算方法 通常情况下,在已知某些对应点的情况下,可以利用这些点的信息估计出内外参,从而获得 \( R \)[^3]: - **基于标定板的方法**: 如果有棋盘格这样的标准图案作为参照物,则可通过 OpenCV 提供的功能如 `cv::calibrateCamera` 来获取完整的内外部参数集合,其中包括了旋转和平移分量。 ```cpp std::vector<cv::Point3f> objectPoints; std::vector<cv::Point2f> imagePoints; // ... populate objectPoints and imagePoints ... cv::Mat cameraMatrix, distCoeffs, rvec, tvec; cv::calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix, distCoeffs, rvec, tvec); ``` 这里得到的结果之一就是旋转向量 `rvec`,之后可将其转化为旋转矩阵形式: ```cpp cv::Mat R; cv::Rodrigues(rvec, R); // Convert rotation vector to matrix form. ``` 上述代码片段展示了如何使用OpenCV库完成这一过程[^4]。 #### 3. 数学表达式的补充说明 对于给定点 Pw 在世界坐标系下的位置以及 Pc 在相机坐标系下对应的投影位置关系可以用下面方程组表述: \[ Pc = K[R|t]P_w \] 其中, - \( K \): 相机内参矩阵; - \( [R | t ] \): 外参矩阵,包含了旋转矩阵 \( R \) 和平移矢量 \( t \). 因此,当尝试反推回世界坐标时就需要先去除透视效应再应用逆运算恢复空间位置信息。 --- ### 示例代码展示 以下是简单的Python实现例子,演示如何从图像点还原至三维场景中的大致流程: ```python import numpy as np from cv2 import Rodrigues def img_to_world(img_points, cam_intrinsics_inv, extrinsic_mat): """ Converts pixel coordinates into their corresponding real-world positions. Args: img_points (numpy.ndarray): Nx2 array of points in the image plane. cam_intrinsics_inv (numpy.ndarray): Inverse intrinsic parameter matrix (3x3). extrinsic_mat (numpy.ndarray): Extrinsic parameters represented by a single 3x4 matrix combining both R & T components. Returns: numpy.ndarray: Estimated world locations based on provided inputs. """ # Normalize Image Points To Homogeneous Coordinates And Apply Camera Intrinsics Correction norm_coords_homog = np.hstack((img_points, np.ones((len(img_points), 1)))) corrected_norm_coords = np.dot(cam_intrinsics_inv, norm_coords_homog.T).T # Add Depth Information As Unit Value For Simplification Purposes Here corrected_norm_coords_with_depth = np.c_[corrected_norm_coords[:, :2], np.full(len(corrected_norm_coords), fill_value=1)] # Solve Linear System Using Provided Extrinsics Data world_poses_homog = np.linalg.solve(extrinsic_mat[:3,:3].T, corrected_norm_coords_with_depth.T).T return world_poses_homog[:,:3]/world_poses_homog[:,[-1]] # Example Usage With Dummy Values if __name__ == "__main__": intrinsics_example = np.array([[700., 0., 320.], [ 0., 700., 240.], [ 0., 0., 1.]]) ext_params_exmpl = np.array([[-0.99,-0.05, 0.12, 10 ], [-0.05, 0.99,-0.11,-20 ], [ 0.12,-0.11,-0.99, 15 ]]) test_img_pts = np.array([[640, 480]]) res = img_to_world(test_img_pts, np.linalg.inv(intrinsics_example), ext_params_exmpl) print(res) ``` 此脚本模拟了一个基本框架用来解释整个概念链路,并未考虑畸变校正等因素影响最终精度表现。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值