使用 opencv 进行立体图像校正不起作用
Posted
技术标签:
【中文标题】使用 opencv 进行立体图像校正不起作用【英文标题】:Stereo Image rectification using opencv is not working 【发布时间】:2019-07-30 05:05:09 【问题描述】:在找到两个摄像头(K1、D1、K2、D2、R、T)的摄像头矩阵后,我正在尝试使用 cv2.stereoRectify 校正两个立体图像。之后,我得到 R1、R2、P1、P2、Q、roi1、roi2 并在 cv2.initUndistortRectifyMap 中使用这些参数来获取左校正图像和右校正图像。 但是使用这种方法后,校正后的图像并不好。我使用 alpha = -1。 这是我的代码:
R1, R2, P1, P2, Q, roi1, roi2 = cv2.stereoRectify(cal_data.camera_model.get('M1'), cal_data.camera_model.get('dist1'), cal_data.camera_model.get('M2'), cal_data.camera_model.get('dist2'),
(960, 544), cal_data.camera_model.get('R'), cal_data.camera_model.get('T'), alpha=-1)
print(R1, R2, P1, P2)
leftFrame = cv2.imread('/home/nikhil_m/Pictures/Webcam/2019-07-29-171837.jpg')
rightFrame = cv2.imread('/home/nikhil_m/Pictures/Webcam/2019-07-29-171809.jpg')
leftFrame = cv2.resize(leftFrame,(960,544))
rightFrame = cv2.resize(rightFrame, (960, 544))
leftMapX, leftMapY = cv2.initUndistortRectifyMap(cal_data.camera_model.get('M1'), cal_data.camera_model.get('dist1'), R1, P1, (960,544), cv2.CV_32FC1)
left_rectified = cv2.remap(leftFrame, leftMapX, leftMapY, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)
rightMapX, rightMapY = cv2.initUndistortRectifyMap(cal_data.camera_model.get('M2'), cal_data.camera_model.get('dist2'), R2, P2, (960,544), cv2.CV_32FC1)
right_rectified = cv2.remap(rightFrame, rightMapX, rightMapY, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)
有没有更好的方法来纠正图像或者我做错了什么。请帮助
编辑:校准图像。
原图:
相机矩阵:
Intrinsic_mtx_1 [[1.22248627e+03 0.00000000e+00 5.24929333e+02]
[0.00000000e+00 1.32603348e+03 4.99669610e+01]
[0.00000000e+00 0.00000000e+00 1.00000000e+00]]
dist_1 [[ 0.09850468 1.08533383 -0.10682535 0.01777223 -3.39061053]]
Intrinsic_mtx_2 [[1.07148978e+03 0.00000000e+00 4.21476300e+02]
[0.00000000e+00 1.09912897e+03 2.61293969e+02]
[0.00000000e+00 0.00000000e+00 1.00000000e+00]]
dist_2 [[-0.15751877 -0.12428592 -0.01325468 0.02449842 3.72130512]]
R [[ 0.89624385 -0.12740274 -0.42487116]
[ 0.14523621 0.98934946 0.00969995]
[ 0.41911026 -0.0704002 0.90520186]]
T [[16.81657383]
[-5.69906211]
[ 2.42601652]]
E [[ -2.74088083 -1.99896304 -5.18233385]
[ -4.87369619 0.87480896 -16.25313836]
[ 7.55012482 15.91139212 -2.25824725]]
F [[ 1.77370674e-06 1.19257563e-06 3.10912454e-03]
[ 3.07460616e-06 -5.08784373e-07 1.09461230e-02]
[-6.78615804e-03 -1.05410214e-02 1.00000000e+00]]
【问题讨论】:
请发布您的源图像和修饰图像。你的相机是平行的吗? @PiotrSiekański 他们大多是parrell 请同时提供 M1、M2、dist1、dist2、R、T 以复制您的结果。 @PiotrSiekański 请在我的编辑问题中查看这些参数。 【参考方案1】:看看你的旋转矩阵R
。如果您的相机是平行的,它应该接近单位矩阵。我用这个code 来检查你的相机之间的角度,结果发现角度是[-4.44710871 -24.77842715 9.20475808]
,以度为单位。因此,我假设您的相机不是平行的,这就是您的方法不起作用的原因。请参阅我在此thread 中的回答,了解如何在您的情况下进行适当的立体声整流。
【讨论】:
以上是关于使用 opencv 进行立体图像校正不起作用的主要内容,如果未能解决你的问题,请参考以下文章