#c #windows #opencv #type-conversion
#c #Windows #opencv #преобразование типа
Вопрос:
Я пытаюсь скомпилировать этот код для Windows 10.
В этой библиотеке для моей ОС изменилась пара вещей, но проблема возникает в строке 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. Кристоф сделайте это в качестве ответа, я отмечу это. 🙂