Python 2.7 и Opencv 3.0.0 cvtColor не работают для преобразования BGR/RGB

Итак, я понимаю, что могу многого требовать от незавершенной версии opencv, но у меня возникают странные проблемы с методом cvtColor, и я не могу найти никаких других ссылок на людей, имеющих в другом месте. Во-первых, в качестве предисловия я пишу многопоточное приложение с графическим интерфейсом, используя PyQt4, QThreads, Python 2.7 и opencv на beaglebone black. Мой текущий исходный код можно найти на github ЗДЕСЬ. Первоначально я использовал версию opencv для debian repo, но она оказалась настолько устаревшей, что в ней не было некоторых функций, которые я искал, а именно класса simpleblobdetector, и она была очень медленной. Имея это в виду, я скомпилировал последнюю версию opencv 3.0.0 с нуля, и с тех пор она ведет себя странно. В конце концов я сузил его до проблемы с cvtColor. Затем я упростил его до минимума кода, чтобы убедиться, что проблема не в чем-то другом. Вот что у меня есть, что я использовал для тестирования.

import cv2

img = cv2.imread('images/original_image.png', cv2.IMREAD_COLOR)

rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
bgr_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2BGR)

cv2.imwrite("images/after_convert_to_rgb.png", rgb_img)
cv2.imwrite("images/after_convert_to_gray.png", gray_img)
cv2.imwrite("images/after_convert_back_to_bgr.png", bgr_img)

Полученные изображения из этого кода можно найти ЗДЕСЬ.

Излишне говорить, что я в тупике в этот момент. Я нахожу особенно странным, что преобразование в серый работает идеально, а два других не работают вообще. У меня была пара моих друзей, которые работают с opencv, проверили как мой исходный код, так и этот тестовый код, и не увидели в нем ничего плохого. Кроме того, хотя и не в рамках этого тестового кода, я пытался читать файлы разных форматов и изображения из разных источников. Он также делает то же самое, манипулируя фреймом opencv, полученным от класса VideoCapture, где я впервые увидел проблему и что я в конечном итоге пытаюсь сделать.

Так кто-нибудь был свидетелем чего-то подобного раньше в opencv 3.0? Мне лучше просто компилировать opencv 2.4 и использовать его вместо этого? Я бы сделал это в первую очередь, но я следовал руководствам по пользовательской компиляции opencv, в частности, для beaglebone black, и все они использовали последнюю версию 3.0, поэтому я решил, что все будет хорошо. В любом случае, я подумал, что стоит проверить, прежде чем я снова займусь процессом компиляции, поскольку, как правило, мне требуется пара дней, чтобы сделать это правильно, делая это за одну ночь.

РЕДАКТИРОВАТЬ: На всякий случай, если кто-то еще пойдет искать и захочет узнать, что я узнал. Это определенно ошибка в кандидате на выпуск opencv 3.0, который я скачал. Мне не удалось найти исправление для этой версии, и в конечном итоге мне пришлось перейти на версию 2.4.10. После понижения все работает нормально.


person Corwin Perren    schedule 13.04.2015    source источник
comment
Похоже на ошибку. Я думаю, что будет лучше отправить отчет об ошибке в систему отслеживания проблем OpenCV: code.opencv.org   -  person jet47    schedule 14.04.2015
comment
Это оказалось ошибкой?   -  person ypx    schedule 13.05.2015
comment
Да, это оказалась ошибка, на которую я не смог найти ответов, поэтому в итоге я перекомпилировал 2.4.10 и использовал ее.   -  person Corwin Perren    schedule 14.05.2015


Ответы (1)


Хотя это не «решение OpenCV», вы можете просто изменить цветовые каналы, используя чистый python, поскольку интерфейс cv2 использует массивы numpy для хранения данных:

rgb_img = bgr_img[:,:,::-1]    #bgr --> rgb
bgr_img = rgb_img[:,:,::-1]    #bgr --> rgb
person meCHAoT    schedule 07.12.2015
comment
Это не работает. Мой красный все еще выходит как синий. - person mLstudent33; 12.04.2019