当我尝试使用函数reprojectImageTo3D时出现错误。我尝试了两种不同的Q矩阵,两者都得到了相同的图像。我已经检查过并且正确读取了视差图像。
我的代码(方法1)
optional<Big> ob{emplace, "1"}; // calls Big{"1"} in place (no moving)
optional<Big> oc{emplace}; // calls Big{} in place (no moving)
optional<Big> od{}; // creates a disengaged optional
我得到的错误:
disparity = cv2.imread('disparity.png')
f = 2262.52
u0 = 1096.98
v0 = 513.137
tx = 0.209313
q = np.array([
[1, 0, 0, -u0],
[0, 1, 0, -v0],
[0, 0, 0, f],
[0, 0, -1 / tx, 0]
points = cv2.reprojectImageTo3D(disparity, q)
我的方法2是使用相机矩阵和stereoRectify函数来获得以下Q矩阵
OpenCV Error: Assertion failed (stype == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) || stype == (((3) & ((1 << 3) - 1)) + (((1)-1) << 3)) || stype == (((4) & ((1 << 3) - 1)) + (((1)-1) << 3)) || stype == (((5) & ((1 << 3) - 1)) + (((1)-1) << 3))) in reprojectImageTo3D, file /io/opencv/modules/calib3d/src/calibration.cpp, line 2747
Traceback (most recent call last):
File "/home/tim/PycharmProjects/untitled/Testing.py", line 30, in <module>
points = cv2.reprojectImageTo3D(disparity, q)
cv2.error: /io/opencv/modules/calib3d/src/calibration.cpp:2747: error: (-215) stype == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) || stype == (((3) & ((1 << 3) - 1)) + (((1)-1) << 3)) || stype == (((4) & ((1 << 3) - 1)) + (((1)-1) << 3)) || stype == (((5) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function reprojectImageTo3D
在代码中运行它会产生相同的错误。
感谢任何帮助。
答案 0 :(得分:1)
该错误基本上告诉您视差图的类型不正确。开源库的好处是,如果错误不是那么清楚,你总是可以去源代码,这些代码就是这样:
CV_Assert( stype == CV_8UC1 || stype == CV_16SC1 ||
stype == CV_32SC1 || stype == CV_32FC1 );
这与它所声明的documentation of reprojectImageTo3D一致:
差异 - 输入单通道8位无符号,16位有符号,32位 带符号或32位浮点差异图像。
查看代码,您只有一行代码来处理您的视差图像:
disparity = cv2.imread('disparity.png')
documentation of imread表示默认情况下,如果没有传递任何标记,则会使用CV_LOAD_IMAGE_COLOR
。
这意味着除非您说的不同,否则会加载CV_8UC3
。此类型不是此功能的已批准类型之一,因此无法执行。
现在,你能做什么?这取决于它在这样的PNG中保存了什么?也许是8位灰度图像,然后使用:
disparity = cv2.imread('disparity.png', cv2.CV_LOAD_IMAGE_GRAYSCALE )
或者它可能是16位灰度图像?
disparity = cv2.imread('disparity.png', cv2.CV_LOAD_IMAGE_ANYDEPTH )
然后,至少输入将具有正确的类型。
我希望这有帮助,如果没有,请发表评论。