обработка видео в opencv

OpenCV

Включая знание формата видео (формат кодека и инкапсуляции); как получить информацию о видео и формат видеокодека; чтение и сохранение видео opencv и формат кодирования opencv fourcc.

1. Базовые знания

Формат видеокодека и формат инкапсуляции

См. подробное объяснение кодирования и инкапсуляции видео.

Справочник Mystery Programmer формат кодирования видео opencv

Обратитесь к формату кодека видео Алекса Чанга bzdww

Обычные файлы AVI, RMVB, MKV, ASF, WMV, MP4, 3GP, FLV и другие файлы (с суффиксом .) можно рассматривать только как один типПакет стандартный. Полный видеофайл создаетсяАудио и видеоОн состоит из двух частей, таких как H264, Xvid и т. д. — форматы кодирования видео, MP3, AAC и т. д. — аудио.Формат кодирования.

Часто используемый режим затвора кодирования видео

image-20211122182153465.png

Xvid(MPEG4), H264, MPEG1, MPEG2(Если вам интересно, вы можете узнатьИстория DivX и XviD, вот эти два брата, первый заряжает, второй опенсорс, последний в самый раз)

Общий формат пакета хранения

image-20211122182133055.png

Вообще говоря, AVI и RM являются наиболее распространенными форматами в настоящее время, а AVI не подходит для передачи по сети из-за врожденных дефектов, m2ts и mkv являются передовыми стандартами нового поколения, которые постепенно могут стать популярными в будущем. WMV и ASF обычно являются форматами хранения алгоритма Microsoft MPEG4, DAT и MPG — методы хранения файлов, закодированных алгоритмом MPEG1, DAT в основном используется для VCD, а VOB — метод хранения файлов, закодированных алгоритмом MPEG2, на DVD.

Python использует ffmpeg для получения информации о видеофайле

! ! ! Обратите внимание на использование следующей команды для установки пакета, иначе будет сообщено об ошибке! ! !

pip install ffmpeg-python

Код ссылки

import ffmpeg

input_video = './data/rafting.avi'

if __name__ == "__main__":
    
    probe = ffmpeg.probe(input_video)

    video_stream_info = probe["streams"][0]
    audio_stream_info = probe["streams"][1]
    format_info = probe["format"]
    # show video codec info
    print("codec_type: {0} | codec_name: {1}| codec_long_name: {2}".format(video_stream_info["codec_type"],
                                                                           video_stream_info["codec_name"],
                                                                           video_stream_info["codec_long_name"]))
    # show audo codec info                                                 
    print("codec_type: {0} | codec_name: {1}| codec_long_name: {2}".format(audio_stream_info["codec_type"],
                                                                           audio_stream_info["codec_name"],
                                                                           audio_stream_info["codec_long_name"]))
    # show container(encapsulation) format
    print("filename:{0} | format_name: {1} | format_long_name: {2}".format(format_info["filename"],
                                                                           format_info["format_name"],
                                                                           format_info["format_long_name"]))

Образец вывода справочной видеоинформации

{'streams': [{'index': 0, 'codec_name': 'msmpeg4v2', 'codec_long_name': 'MPEG-4 part 2 Microsoft variant version 2', 'codec_type': 'video', 'codec_time_base': '1/12', 'codec_tag_string': 'MP42', 'codec_tag': '0x3234504d', 'width': 1920, 'height': 1080, 'coded_width': 1920, 'coded_height': 1080, 'closed_captions': 0, 'has_b_frames': 0, 'pix_fmt': 'yuv420p', 'level': -99, 'refs': 1, 'r_frame_rate': '12/1', 'avg_frame_rate': '12/1', 'time_base': '1/12', 'start_pts': 0, 'start_time': '0.000000', 'duration_ts': 19999, 'duration': '1666.583333', 'bit_rate': '2422022', 'nb_frames': '19999', 'disposition': {'default': 0, 'dub': 0, 'original': 0, 'comment': 0, 'lyrics': 0, 'karaoke': 0, 'forced': 0, 'hearing_impaired': 0, 'visual_impaired': 0, 'clean_effects': 0, 'attached_pic': 0, 'timed_thumbnails': 0}}], 'format': { ...}

Во-вторых, операции, связанные с видео opencv

1. Видеоинформация, связанная с чтением

Сначала прочитайте видеофайл, функциональная часть используется следующим образом

video_reader = cv2.VideoCapture('test.mp4')

cv2.VideoCapture()

Если переданный параметр является числом, это означает использование камеры. Например, cv2.VideoCapture(0) означает использование первой камеры компьютера.

Если передается адрес видео, это означает чтение локального видео. Здесь я использую только второй, задавая абсолютный путь к видео и читая его. Существуют также следующие две часто используемые функции:

  • cv2.VideoCapture().isOpened() Проверяет нормальное ли состояние чтения видео
  • cv2.VideoCapture().read() Получает определенный кадр видео и возвращает два значения, первое — логическое значение, указывающее, правильно ли получен «этот кадр», второе значение — содержимое этого кадра, которое матрица.

Получить основную информацию о видео

Например, чтобы получить информацию о кодеке FOURCC видео,Например, вывод 1145656920.

print( int(video_reader.get(cv2.CAP_PROP_FOURCC)))    
## 或者直接整数参数替代,参考下面表格
print(int(video_reader.get(6)))   

**Параметры cv2.VideoCapture.get**Обратитесь на официальный сайт

20210425103045721.png

FOURCC

Рассказ о FourCC

FourCC is a 4-byte code used to specify the video codec. The list of available codes can be found in fourcc.org. It is platform dependent. Following codecs work fine: In Fedora: DIVX, XVID, MJPG, X264, WMV1, WMV2. ( XVID is more preferable. MJPG results in high size video. X264 gives very small size video ) In Windows: DIVX ( more to be tested and added )

FourCC code is passed as cv2.VideoWriter_fourcc('M','J','P','G') or cv2.VideoWriter_fourcc(\*'MJPG) for MJPG.

Вот специальная запись для FOURCC, вы можете увидеть, например, вывод 1145656920 выше,Opencv по умолчанию преобразует FOURCC из символа в int,Соответствующий принцип преобразования можно найти в викиТехнические подробности в .

Преобразуйте int в четырехзначный символ, обратитесь к следующему коду Python

def decode_fourcc(cc):
    return "".join([chr((int(cc) >> 8 * i) & 0xFF) for i in range(4)])
    
decode_fourcc(1145656920)
'XVID'

или обратитесь к этомуС++ код

unsigned int f = (unsigned)capture.get(cv::CAP_PROP_FOURCC);
char fourcc[] = {
		(char)f, // First character is lowest bits
		(char)(f >> 8), // Next character is bits 8-15
		(char)(f >> 16), // Next character is bits 16-23
		(char)(f >> 24), // Last character is bits 24-31
		'\0' // and don't forget to terminate
	};
cout << "the return int fourcc was: " << f << endl;
cout << "FourCC for this video was: " << fourcc << endl;
/*运行结果为:
the return int fourcc was: 1145656920
FourCC for this video was: XVID
*/

Или это онлайн-конверсия,Online in fourCC для символов; Кроме того, в opencv есть функция автоматического преобразования fourCC из четырех символов в int

cv2.VideoWriter_fourcc(*'XVID')     ###  1145656920

Некоторые общие символы FourCC и таблица сравнения целых чисел

персонаж соответствующий целому числу
"XVID" 1145656920
"MJPG" 1196444237
"X264" 875967064
"DIB" 541215044
"WMV1" 827739479
"WMV2" 844516695

3. Читайте связанные видео

Эта часть относительно проста, есть много онлайн-уроков, просто вставьте код

    success = True
    video_reader = cv2.VideoCapture(video_path)
    while success and video_reader.isOpened():
        # get a frame
        success, frame = video_reader.read()
        # show a frame
        cv2.imshow("capture", frame)
        if cv2.waitKey(100) & 0xFF == ord('q'):
            break
    video_reader.release()
    cv2.destroyAllWindows() 

3. Сохраните связанные с видео

cv2.VideoWriter()

Чтобы сохранить видео, вам нужно использовать функцию cv2.VideoWriter().

VideoWriter(filename, fourcc, fps, frameSize[, isColor]) -> <VideoWriter object>

Описание параметра:

Три более важных формата кодирования FOVECC, обращают внимание на формат и соответствующее совпадение суффикса; Video Video Suffix, убедитесь, что письменное изображение согласуется с этим разрешением, если вы хотите изменить разрешение, вы должны сначала изменить размер изображения А затем сохраните его к определенному разрешению; iscolor, true, входное изображение должно быть RGB, в противном случае его нельзя сохранить, но не будет сообщать об ошибке, но обнаружено, что сохраненное видео пустое и не может быть открыто.

  • имя файла, путь к видео для сохранения
  • Fourcc, кодек кодирования кадра сжатия видео, например, cv2.VideoWriter_fourcc('M', 'P', '4', '2') или cv2.VideoWriter_fourcc(*"MP42") означает использование кодека MPEG-4.2 , вы можете обратиться к этому:Полный список Fourcc, которые можно использовать
  • fps, частота кадров выходного видео
  • frameSize, размер каждого кадра выходного видео,Он должен быть таким же, как размер записываемой рамки, иначе будут проблемы
  • цвет,Если он не равен нулю, кодировщик будет ожидать кодирования цветных кадров; в противном случае — кадров в градациях серого (этот флаг поддерживается только в Windows).

Добавить примечание о FourCC

Четыре символа используются для представления кодека сжатого кадра, например: CV_FOURCC('P','I','M','1') = кодек MPEG-1 CV_FOURCC('M','J','P','G') = кодек движения-jpeg CV_FOURCC('M', 'P', '4', '2') = кодек MPEG-4.2 CV_FOURCC('D', 'I', 'V', '3') = кодек MPEG-4.3 CV_FOURCC('D', 'I', 'V', 'X') = кодек MPEG-4 CV_FOURCC('U', '2', '6', '3') = кодек H263 CV_FOURCC('I', '2', '6', '3') = кодек H263I CV_FOURCC('F', 'L', 'V', '1') = кодек FLV1 ПРИМЕЧАНИЕ. Метод кодирования, при котором создается наименьший размер файла, — это кодек MPEG-4.2. Параметр конструктора класса VideoWriter — CV_FOURCC('M', 'P', '4', '2'). Самым большим является кодек MPEG-1, и соответствующий параметр конструктора класса VideoWriter — CV_FOURCC('P','I','M','1'), который занимает в 5,7 раза больше места на диске. Поэтому, если вам необходимо осуществлять запись и мониторинг 24 часа в сутки, вы можете отдать приоритет использованию метода кодека MPEG-4.2. Если код кодировщика равен -1, во время выполнения появится окно выбора кодировщика.

aHR0cDovL3VwbG9hZC1pbWFnZXMuamlhbnNodS5pby91cGxvYWRfaW1hZ2VzLzU1Mjk5OTctYTkyMzFiOGRjZmZkMTRkMQ.pngОригинальная ссылка:blog.CSDN.net/Ищу 931110/Ах…

пример

Сначала определите выходной файл

    fps_cv = video_reader.get(cv2.CAP_PROP_FPS)  ### 视频fps, opencv检测到的
    fourcc = cv2.VideoWriter_fourcc(*'XVID')     ### 保存视频的格式
    h, w, c = frame.shape
    out = cv2.VideoWriter(save_path, fourcc, fps_cv, (w, h), isColor=True)  ## 保存视频

Затем читайте видео снова и снова и сохраняйте каждый кадр как новое видео.

    success = True
    video_reader = cv2.VideoCapture(video_path)
    while success and video_reader.isOpened():
        # get a frame
        success, frame = video_reader.read()
        ### save frame
        out.write(frame)
    out.release()  ### 完成保存,释放
    video_reader.release()

Протестированы различные форматы видео

Сохранение видео 1080p, всего 300 кадров контента, H.265 и H.264 еще не тестировались, opencv нужны соответствующие зависимости

разрешение Формат нужно время Размер файла
1920*1080 'XVID' MPEG-4 codec 1.7377230167388915 6.2MB
1920*1080 Кодек MP42 MPEG-4.2 1.7837894439697266 6.1MB
1920*1080 "DIVX" MPEG-4 codec 1.7331401348114013 6.2MB
1920*1080 "DIV3" MPEG-4.3 codec 3.3492454290390015 6.1MB