Я пытаюсь познакомиться с OpenCV2 для базовой c обработки изображений и видео. Сейчас у меня проблемы с сохранением серых видеокадров. Следующий код (адаптированный с здесь ) предназначен для сохранения трех версий шестисекундного видео, которое я снял с Триумфальной арки * (arc.avi
) - одно немодифицированное, одно полностью серого и один в градациях серого только во время определенных кадров и полноцветный в других.
import cv2
capture = cv2.VideoCapture('arc.avi')
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
outgray = cv2.VideoWriter('vidgray.avi',fourcc, 30.0, (1280,720))
outorig = cv2.VideoWriter('vidorig.avi',fourcc, 30.0, (1280,720))
outhalf = cv2.VideoWriter('vidhalf.avi',fourcc, 30.0, (1280,720))
framecounter = 0
while(True):
ret, frame = capture.read()
grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
outorig.write(frame)
outgray.write(grayFrame)
#cv2.imshow('video gray', grayFrame)
#cv2.imshow('video original', frame)
if framecounter//40%2 == 1:
outhalf.write(frame)
cv2.imshow('video half', frame)
else:
outhalf.write(grayFrame)
cv2.imshow('video half', grayFrame)
if cv2.waitKey(1) == 27:
break
framecounter += 1
capture.release()
outgray.release()
outorig.release()
outhalf.release()
cv2.destroyAllWindows()
(Я не могу понять, как вложить мои видеофайлы, но если вы хотите воспроизвести проблему, вы должны иметь возможность использовать сам код в любом .avi
файле по вашему выбору).
vidorig.avi
отлично сохраняет и при воспроизведении выглядит точно так же, как и оригинал (как и предполагалось). vidgray.avi
- это пустой видеофайл с нулевыми кадрами (запутывает меня, черт возьми, мой проигрыватель VL C, когда я пытаюсь его воспроизвести). vidhalf.avi
состоит только из полноцветных кадров и просто пропускает все оттенки серого, которые он должен иметь. Это приводит к тому, что видео становится короче и имеет странные скачки дрожания между кадрами.
Обратите внимание, что проблема заключается только в * с сохраненными видеофайлами, а не (насколько я могу судить) с Сам процесс серого. Пока я получаю сообщение об ошибке:
OpenCV Error: Assertion failed (scn == 3 || scn == 4) in cv::ipp_cvtColor, file ..\..\..\modules\imgproc\src\color.cpp, line 7456
Traceback (most recent call last):
File "grayvid.py", line 15, in <module>
grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.error: ..\..\..\modules\imgproc\src\color.cpp:7456: error: (-215) scn == 3 || scn == 4 in function cv::ipp_cvtColor
все три отображаются нормально во время выполнения с cv2.imshow
. Только сохраненные файлы являются проблемными c.
Я на Windows 8, использую OpenCV2 в Python 3.5.4.
Обратите внимание, что это не дубликат Сохранить видео в оттенках серого в OpenCV? - Я не получаю сообщение об ошибке, которое делает Nithin, и не работают предложенные ответы (мой код реализовал их с самого начала).