OpenCV. «Ошибка: ошибка утверждения» при получении значения пикселя

#c #windows #opencv #type-conversion

#c #Windows #opencv #преобразование типа

Вопрос:

Я пытаюсь скомпилировать этот код для Windows 10.

pic2svg

В этой библиотеке для моей ОС изменилась пара вещей, но проблема возникает в строке 93:

 uint32_t p = pic.at<uint32_t>(y, x);
 

когда мы пытаемся принять весь пиксель за 4 байта. Это ошибка:

 OpenCV(4.1.0-dev) Error: Assertion failed (((0x28442211 >>
((traits::Depth<_Tp>::value) amp; ((1 << 3) - 1))*4) amp; 15) ==
elemSize1()) in cv::Mat::at, file C:OPENCVinstallinclude
opencv2/core/mat.inl.hpp, line 1145
 

Я исправил это, преобразовав таким странным способом:

 Vec4b tmp = pic.at<Vec4b>(y, x);
uint32_t p = (tmp[0] << 24) | (tmp[1] << 16) | (tmp[2] << 8) | tmp[3];
 

Но проблема возникает в приведенном ниже коде, когда мы снова пытаемся получить пиксель как uint32_t. Как это исправить?

Комментарии:

1. opencv не имеет / не поддерживает uint32 тип для cv::Mat. пожалуйста, проверьте pi.type() и сообщите

2. @berak pic.type() равно 24.

3. @berak Это CV_8UC4? Что это значит?

4. 8UC4 означает, что Vec4b это приемлемый тип для доступа к Mat этого типа. — uint32_t вероятно, также приемлемо, потому что оно имеет ту же ширину (32 бита / 4 байта)… или так было раньше, до того, как была реализована эта проверка типа. вы можете взять байтовые значения из Vec4b и составить их, как вы делали в последнем фрагменте кода вашего сообщения.

5. @ChristophRackwitz и berak , это помогает! «До того, как эта проверка типа была реализована», я использую 4.10. Кристоф сделайте это в качестве ответа, я отмечу это. 🙂