python - 当相机之间的角度太高时,OpenCV Stereo Image Rectification 无法正常工作
问题描述
我想收集关于坐在两个摄像机焦点处的身体的高度数据,这就是我的立体设置的样子:
当我使用标准 cv2 函数计算图像的校正版本时,它看起来非常糟糕。当我将类似的设置与相机并行使用时,它起作用了。
我计算了epilines,它们似乎是正确的:
这是我使用的代码,主要是从 openCV 教程中复制的
http://www.dmi.unict.it/~furnari/teaching/CV1617/lab1/
3d/2d 点和矩阵是先前使用计算的
cv2.calibrateCamera()
校准和校正过程
retval, _, _, _, _, R, T, E, F = cv2.stereoCalibrate(imager._3d_points, _2d_points_L,_2d_points_R, mtxL, distL, mtxR, distR, (img.shape[1], img.shape[0])
R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify(mtxL, distL, mtxR, distR, (img.shape[1], img.shape[0]), R, T, )
map1_x, map1_y = cv2.initUndistortRectifyMap(imager.mtxL, imager.distL, R1, P1, (imLeft.shape[1], imLeft.shape[0]), cv2.CV_32FC1)
map2_x, map2_y = cv2.initUndistortRectifyMap(imager.mtxR, imager.distR, R2, P2, (imLeft.shape[1], imLeft.shape[0]), cv2.CV_32FC1)
imgL = cv2.remap(imLeft, map1_x, map1_y , cv2.INTER_CUBIC)
imgR = cv2.remap(imRight, map2_x, map2_y , cv2.INTER_CUBIC)
OpenCV 是否根本无法使用我的相机设置来纠正图像,还是我做错了什么?
解决方案
据我所知,该函数stereoRectify
假定相机轴彼此大致平行。你可以试试stereoRectifyUncalibrated
,因为这个函数依赖于基本的矩阵计算并且会处理这种情况。确保您已阅读文档中的说明。
笔记:
虽然该算法不需要知道相机的内在参数,但它在很大程度上取决于对极几何形状。因此,如果相机镜头有明显的畸变,最好在计算基本矩阵并调用此函数之前对其进行校正。例如,可以使用 分别估计立体摄像机每个头部的失真系数calibrateCamera()
。然后,可以使用 校正图像undistort()
,或者可以使用 校正点坐标undistortPoints()
。
推荐阅读
- ruby-on-rails - 为谷歌凭据设置配置变量并使用 elishaterada/heroku-google-application-credentials-buildpack 后仍然出现错误
- git - 恢复本地 git 分支
- python - Catboost 中的 Pool 是什么?何时使用 Pool 而不是 numpy 数组?
- mysql - 如何在具有内部联接作为子查询的 sql 中查找组内的百分比?
- reactjs - 渲染多个 EditorJS 组件
- react-native - React Native Expo - 无法向下滚动以获取更多内容
- angular - 无法在 isNamedImportBindings 读取未定义的属性“种类”
- html - html不加载多张图片
- python - 尝试在 Python 中执行我的刽子手游戏时出现语法错误
- android - Android studio跳转到android gradle工具源码