我正试图在世界空间中找到相机的焦距,位置和方向.
因为我需要这是与分辨率无关的,我归我的图像坐标,以在范围[-1, 1]为x,和一个稍小范围y(取决于纵横比).(0, 0)图像的中心也是如此.我已经纠正了镜头失真(使用k1和k2系数),所以这不会进入图片,除了有时投掷x或y稍微超出[-1, 1]范围.
作为给定,我在已知尺寸的世界空间中具有平面的固定矩形(以毫米为单位).保证矩形的四个角可见,并在图像中手动标记.例如:
std::vector<cv::Point3f> worldPoints = {
cv::Point3f(0, 0, 0),
cv::Point3f(2000, 0, 0),
cv::Point3f(0, 3000, 0),
cv::Point3f(2000, 3000, 0),
};
std::vector<cv::Point2f> imagePoints = {
cv::Point2f(-0.958707, -0.219624),
cv::Point2f(-1.22234, 0.577061),
cv::Point2f(0.0837469, -0.1783),
cv::Point2f(0.205473, 0.428184),
};
Run Code Online (Sandbox Code Playgroud)
实际上,我认为我试图解决的等式是(参见OpenCV文档中的等价物):
/ xi \ / fx 0 \ / tx \ / Xi \
s | yi | = | …Run Code Online (Sandbox Code Playgroud) 我试图从相机内在、外在矩阵和畸变系数中获得鸟瞰透视变换。
我尝试使用这个问题的答案。
使用的图片是来自opencv官方github repo的示例图片left02.jpg
我校准了相机并找到了内在、外在矩阵和失真系数。
我未扭曲图像并找到了姿势。检查参数是否正确。
我用来找到透视变换矩阵的方程是(参考上面的链接):
Hr = K * R.inv() * K.inv() 其中 R 是旋转矩阵(来自 cv2.Rodrigues()),K 来自 cv2.getoptimalnewcameramatrix()
[ 1 0 | ]
Ht = [ 0 1 | -K*C/Cz ]
[ 0 0 | ]
Run Code Online (Sandbox Code Playgroud)
其中C=-R.inv()*TT 是来自的平移向量cv2.solvePnP()
,Cz 是 C 向量的第三个分量
所需的转换是: H = Ht * Hr
我用来构造上述等式的代码是:
K = newcameramtx # from cv2.getoptimalnewcameramatrix()
ret,rvec,tvec = cv2.solvePnP(world_points,corners2,K,dist)
R,_ = cv2.Rodrigues(rvec)
_,R_inv = cv2.invert(R)
_,K_inv = cv2.invert(K)
Hr = np.matmul(K,np.matmul(R_inv,K_inv))
C = np.matmul(-R_inv,tvec) …Run Code Online (Sandbox Code Playgroud)