Ошибка: (-215) reprojectImageTo3D opencv

Я получаю сообщение об ошибке при попытке использовать функцию 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]]

Выполнение этого в коде дает ту же ошибку.

Любая помощь приветствуется.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
5 060
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка в основном говорит вам, что тип карты несоответствия неправильный. Хорошая вещь библиотек с открытым исходным кодом заключается в том, что если ошибка не так очевидна, вы всегда можете перейти к источнику, который в этих строках делает:

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 )

Тогда, по крайней мере, вход будет иметь правильный тип.

Надеюсь, это поможет, если нет, оставьте, пожалуйста, комментарий.

Спасибо. Это помогло, пришлось использовать флаг cv2.IMREAD_GRAYSCALE из-за python 3. Теперь перешел к другой проблеме, хотя я не уверен, как построить точки, которые я получил, чтобы убедиться, что я создал правильное трехмерное изображение. Я пробовал mplot3d, но думаю, что это не то, что мне нужно. Есть предложения?

T. Schoonbeek 11.04.2018 10:43

Я думаю, что у меня все равно возникла проблема, поскольку матрица точек состоит из значений + inf и -inf.

T. Schoonbeek 11.04.2018 10:53

@ T.Schoonbeek, по одному вопросу за раз :) лучше, если у вас есть другие вопросы, чтобы открывать новые вопросы. Таким образом, не только я смогу помочь, но и другим людям. По поводу ваших вопросов, может Q матрица неправильная? вы можете проверить его с некоторыми значениями по формуле [x y z w] = Q * transpose ([x y disparity (x, y) w]), а затем разделить x y z из результата на w результата. вы можете заметить проблему, если эти числа неверны (например, 0 в w)

api55 11.04.2018 11:09

Другие вопросы по теме