Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python OpenCV中使用StereoBM的坏视差贴图_Python_Opencv_Computer Vision_Stereo 3d - Fatal编程技术网

Python OpenCV中使用StereoBM的坏视差贴图

Python OpenCV中使用StereoBM的坏视差贴图,python,opencv,computer-vision,stereo-3d,Python,Opencv,Computer Vision,Stereo 3d,我已经组装了一个立体凸轮装置,但在使用它生成一个好的视差图时遇到了麻烦。下面是两张经过校正的图像和我用它们生成的视差图的示例: 正如你所看到的,结果非常糟糕。更改StereoBM的设置变化不大 设置 两个摄像头都是同一型号,并通过USB连接到我的电脑 它们被固定在一块坚硬的木板上,这样它们就不会移动。我尽可能地将它们对齐,但这当然不是完美的。它们无法移动,因此校准期间和之后的位置相同 我使用OpenCV校准了立体对,并使用OpenCV的StereoBM类生成视差图 这可能不太相关,但我正在用

我已经组装了一个立体凸轮装置,但在使用它生成一个好的视差图时遇到了麻烦。下面是两张经过校正的图像和我用它们生成的视差图的示例:

正如你所看到的,结果非常糟糕。更改StereoBM的设置变化不大

设置

  • 两个摄像头都是同一型号,并通过USB连接到我的电脑
  • 它们被固定在一块坚硬的木板上,这样它们就不会移动。我尽可能地将它们对齐,但这当然不是完美的。它们无法移动,因此校准期间和之后的位置相同
  • 我使用OpenCV校准了立体对,并使用OpenCV的
    StereoBM
    类生成视差图
  • 这可能不太相关,但我正在用Python编写代码
我能想象的问题

我是第一次这样做,所以我远不是一个专家,但我猜问题在于校准或立体校正,而不是视差图的计算。我已经尝试了
StereoBM
的所有设置排列,虽然我得到了不同的结果,但它们都像上面显示的视差图:黑白片

据我所知,立体校正应该对齐每张图片上的所有点,以便它们通过一条直线(在我的例子中是水平线)连接,这一事实进一步支持了这一观点。如果我把两张校正过的图片放在一起检查,很明显情况并非如此。右侧图片上的对应点比左侧高得多。不过,我不确定校准还是校正是问题所在

代码

实际的代码被包装在对象中——如果您有兴趣完整地看到它,那么它是可用的。下面是一个实际运行的简化示例(当然,在实际代码中,我使用的不仅仅是两张图片):

导入cv2
将numpy作为np导入
##负载测试图像
#TEST_IMAGES是测试图像的路径列表
input\u l,input\u r=[cv2.imread(image,cv2.CV\u LOAD\u image\u GRAYSCALE)
用于测试中的图像\u图像]
图像大小=输入形状[:2]
##取回棋盘角
#棋盘_行和棋盘_列是内部行和列的数量
#棋盘上用于校准的列
图案大小=棋盘行、棋盘列
object_points=np.zero((np.prod(pattern_size),3),np.float32)
对象点[:,:2]=np.索引(模式大小)。T.重塑(-1,2)
#SQUARE_SIZE是棋盘方块的大小,单位为厘米
对象\u点*=正方形\u大小
图像_点={}
ret,corners=cv2。findChessboardCorners(输入,模式大小,真)
cv2.拐角子PIX(输入、拐角、,
(11, 11), (-1, -1),
(cv2.TERM_CRITERIA_MAX_ITER+cv2.TERM_CRITERIA_EPS,
30, 0.01))
图像_点[“左”]=角点_l.重塑(-1,2)
ret,corners=cv2。findChessboardCorners(输入,模式大小,真)
cv2.拐角子PIX(输入、拐角、,
(11, 11), (-1, -1),
(cv2.TERM_CRITERIA_MAX_ITER+cv2.TERM_CRITERIA_EPS,
30, 0.01))
图像点[“右”]=角点重新整形(-1,2)
##校准摄像机
(cam_mats、dist_coefs、rect_trans、proj_mats、valid_Box、,
不失真映射,校正映射)={},{},{},{},{},{},{},{},{},{},{}
标准=(cv2.TERM\u标准\u MAX\u ITER+cv2.TERM\u标准\u EPS,
100,1e-5)
标志=(cv2.CALIB\u FIX\u ASPECT\u RATIO+cv2.CALIB\u ZERO\u TANGENT\u DIST+
cv2.校准(相同焦距)
(ret、三角垫[“左”]、距离系数[“左”]、三角垫[“右”],
区域系数[“右”]、旋转垫、变速器、电子垫、,
f_mat)=cv2.立体校准(对象点,
图像点[“左”]、图像点[“右”],
图像大小,标准=标准,标志=标志)
(右转[“左”]、右转[“右”],
项目垫[“左”]、项目垫[“右”],
显示至深度垫,有效方框[“左”],
有效的_盒[“右”])=cv2.立体校正(凸轮垫[“左”],
dist_coefs[“左”],
三角垫[“右”],
dist_coefs[“右”],
图像大小,
旋转垫,变速箱,标志=0)
对于“左”、“右”侧:
(不失真地图[侧面],
校正映射[侧]=cv2.初始无畸变校正映射(凸轮垫[侧],
距离[侧面],
矩形横[侧],
项目垫[侧面],
图像大小,
cv2.CV_32FC1)
##生成视差图
已校正=cv2.重新映射(输入,不失真映射[“左”],
校正图[“左”],
cv2.内部(最近的)
已校正=cv2.重新映射(输入,不失真映射[“右”],
校正图[“右”],
cv2.内部(最近的)
cv2.imshow(“左”,已纠正)
cv2.imshow(“右”,已纠正)
块匹配器=cv2.StereoBM(cv2.StereoBM\u基本预设,0,5)
disp=block\u matcher.compute(已纠正,已纠正,disptype=cv2.CV\u 32F)
cv2.imshow(“差异”,显示)

这里出了什么问题?

事实证明,问题在于可视化,而不是数据本身。我在某处读到
cv2.reprojectionmageto3d
需要一个视差图作为浮点值,这就是为什么我从
block\u matcher.compute
请求
cv2.CV\u 32F

更仔细地阅读OpenCV文档让我想到