В настоящее время я получаю видеопоток с камеры, требующей демозаики. Информация о кадре - 480x640x3. dtype - это uint8
Когда я пытаюсь использовать cv2.cvtColor для преобразования из BAYER в RGB, я получаю,
error: (-215:Assertion failed) scn == 1 && (dcn == 3 || dcn == 4) in function 'cv::demosaicing'
Я не понимаю, что означает ошибка. Я использую OpenCV cvtColor как документ.
Я использую следующий код: Единственная часть, которую я продолжал пытаться, - это изменить cv2.COLOR_BayerGB2BGR
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
while True:
_, frame = cap.read()
processedIm = cv2.cvtColor(frame, cv2.COLOR_BayerGB2BGR)
cv2.imshow("Main", processedIm)
k = cv2.waitKey(5) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
Я использую OVRVision для получения изображения. Дополнительная информация о камере: [Схема обработки] (http://ovrvision.com/files/docs/index.html#gscamprop)
Как показано ниже на блок-схеме. Полученное мной изображение - это блок-схема.
Добавил код.
Ошибка означает, что либо исходное изображение не имеет 1 канала, либо выходное изображение не имеет 3 или 4 каналов. Вывод генерируется автоматически и по вашему комментарию «Информация о кадре 480x640x3», изображение имеет 3 канала ... вы показываете его с помощью imshow? дает ли это неожиданные результаты?
Пожалуйста, проверьте количество каналов в frame с помощью print frame.shape
@ZdaR print (frame.shape) дает (480, 640, 3)
@ api55 Я не уверен, что вы имеете в виду, говоря, что исходное изображение не имеет 1 канала? Это стереокамера. По ссылке в основном посте есть блок-схема обработки, а также пример изображения, полученного непосредственно с камеры.
VideoCapture подключается к камере с помощью бэкэнда (например, FFMpeg или GStreamer), и он пытается его декодировать и преобразовать в BGR, и это изображение, которое вы получаете с cap.read(). Для специальных камер это может привести к сбою или неожиданному результату. Вот почему я спрашиваю, если вы удалите инструкцию cv2.cvtColor, что вы увидите с imshow? это нормальное цветное изображение? Возможно, класс videoCapture слишком ограничен для этой задачи
@ api55 Изображения, которые я получаю без cv2.cvtColor: imgur.com/a/bRkfqUW
Может информация расшифрована и она в первых 2 каналах? возможно, что-то вроде imshow("first channel", frame[:, :, 0]), imshow("second channel", frame[:, :, 1]) и imshow("third channel", frame[:, :, 2]) может дать вам представление о том, как данные были декодированы, и преобразовать их с помощью OpenCV. Я предполагаю, что один канал будет в основном черным, а два других будут тем же изображением с небольшой разницей в сдвиге.
@ api55 Вот данные разделения канала вместе с исходным кадром. imgur.com/a/dCCupZt
У меня нет идей, но, возможно, вы можете использовать ffmpeg или gstreamer напрямую, чтобы получить необработанные данные
вам следует использовать SDK и / или посмотреть "examples / 3rdparty /: Другие библиотеки, которые используются с примерами"
Можете ли вы попробовать разделить каналы изображений (cv :: split) и запустить демозаику на обоих каналах по отдельности?






Поделитесь, пожалуйста, кодом, который вы используете?