Я получаю сообщение об ошибке при попытке использовать функцию reprojectImageTo3D. Я пробовал две разные Q-матрицы, и для обеих я получил одно и то же изображение. Я проверил, и изображение несоответствия правильно прочитано.
Мой код (метод 1)
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)
Я получаю ошибку:
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
Мой метод 2 использует матрицы камеры и функцию stereoRectify, чтобы получить следующую матрицу Q
Q matrix is
[[ 1.00000000e+00 0.00000000e+00 0.00000000e+00 -1.09698000e+03]
[ 0.00000000e+00 1.00000000e+00 0.00000000e+00 -5.13137000e+02]
[ 0.00000000e+00 0.00000000e+00 0.00000000e+00 2.26252000e+03]
[ 0.00000000e+00 0.00000000e+00 -4.77753412e+00 0.00000000e+00]]
Выполнение этого в коде дает ту же ошибку.
Любая помощь приветствуется.






Ошибка в основном говорит вам, что тип карты несоответствия неправильный. Хорошая вещь библиотек с открытым исходным кодом заключается в том, что если ошибка не так очевидна, вы всегда можете перейти к источнику, который в этих строках делает:
CV_Assert( stype == CV_8UC1 || stype == CV_16SC1 ||
stype == CV_32SC1 || stype == CV_32FC1 );
Что согласуется с документация reprojectImageTo3D, где говорится:
disparity – Input single-channel 8-bit unsigned, 16-bit signed, 32-bit signed or 32-bit floating-point disparity image.
Глядя на ваш код, у вас есть только одна строка кода, которая управляет вашим изображением несоответствия:
disparity = cv2.imread('disparity.png')
документация 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 )
Тогда, по крайней мере, вход будет иметь правильный тип.
Надеюсь, это поможет, если нет, оставьте, пожалуйста, комментарий.
Я думаю, что у меня все равно возникла проблема, поскольку матрица точек состоит из значений + inf и -inf.
@ T.Schoonbeek, по одному вопросу за раз :) лучше, если у вас есть другие вопросы, чтобы открывать новые вопросы. Таким образом, не только я смогу помочь, но и другим людям. По поводу ваших вопросов, может Q матрица неправильная? вы можете проверить его с некоторыми значениями по формуле [x y z w] = Q * transpose ([x y disparity (x, y) w]), а затем разделить x y z из результата на w результата. вы можете заметить проблему, если эти числа неверны (например, 0 в w)
Спасибо. Это помогло, пришлось использовать флаг cv2.IMREAD_GRAYSCALE из-за python 3. Теперь перешел к другой проблеме, хотя я не уверен, как построить точки, которые я получил, чтобы убедиться, что я создал правильное трехмерное изображение. Я пробовал mplot3d, но думаю, что это не то, что мне нужно. Есть предложения?