OpenCV2: видео в градациях серого отображается нормально, но не сохраняет - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь познакомиться с 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, и не работают предложенные ответы (мой код реализовал их с самого начала).

1 Ответ

1 голос
/ 26 февраля 2020

Функция writer класса VideoWriter ожидает (в общем) изображения в формате RGB (см. OpenCV Docu ). Скорее всего, кодировщик неправильно интерпретирует данные изображения, если он содержит только 1 канал. Для сохранения серых изображений вы можете расширить 1-канальное серое изображение в 3-канальное изображение, скопировав серый канал в R, G и B. Это будет сделано cv2.COLOR_GRAY2BGR.

В этом случае ваш код будет выглядеть так:

ret, frame = capture.read()

grayFrame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
// expand dimension on gray valued image
grayFrame = cv2.cvtColor(grayFrame, cv2.COLOR_GRAY2BGR)
outorig.write(frame)
outgray.write(grayFrame)
...