Мне нужно прочитать видеофайл yuv, извлечь из него отдельные кадры, преобразовать его в оттенки серого и затем рассчитать оптический поток Лукаса Канаде между соседними кадрами. Первоначально я использовал mp4-видео, и это был мой код для извлечения отдельных кадров:
import cv2 as cv
import numpy as np
cap = cv.VideoCapture('C:\\Users\\Ann Baiju\\Project\\video_tampering_dataset\\videos\\h264_lossless\\07_forged.mp4')
ret, frame1 = cap.read()
prvs = cv.cvtColor(frame1, cv.COLOR_BGR2GRAY)
height, width, _ = frame1.shape
while(1):
ret, frame2 = cap.read()
if ret==False: break
next = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY)
#Code for calculating Lucas Kanade optical flow
N=N+1
prvs = next
cap.release()
Теперь некоторые вещи изменились, и я должен использовать набор данных видеофайлов yuv. Но когда я передаю yuv-файл в VideoCapture (), я получаю сообщение об ошибке следующим образом:
[IMGUTILS @ 00000078a4bee5c0] Размер изображения 0x0 недопустим [ОШИБКА: 0] global C: \ projects \ opencv- python \ opencv \ modules \ videoio \ src \ cap. cpp (116) cv :: VideoCapture :: open VIDEOIO (CV_IMAGES): повышенное исключение OpenCV:
OpenCV (4.1.2) C: \ projects \ opencv-python \ opencv \ modules \ videoio \ src \ cap_images. cpp: 253: ошибка: (-5: неверный аргумент) CAP_IMAGES: не удается найти начальный номер (в имени файла): C: \ Users \ Ann Baiju \ Project \ Copy_Move_Datasets \ new original \ DERF \ hall.yuv в функции 'cv :: icvExtractPattern'
Traceback (последний вызов был последним): файл "test1.py", строка 6, в prvs = cv.cvtColor (frame1, cv.COLOR_BGR2GRAY) cv2.error: OpenCV (4.1.2) C: \ projects \ opencv-python \ opencv \ modules \ imgproc \ src \ color. cpp: 182: ошибка: (-215: утверждение не выполнено)! _Sr c .empty () в функции 'cv :: cvtColor'
Как мне решить эту проблему? Также я понимаю, что yuv - это необработанный формат видеофайла, в котором нет информации о размере или fps. Есть ли какой-то способ, которым это может быть выведено из файла, или мне нужно вручную вводить эту информацию?
Относительно моего вопроса о том, как получить информацию о размере кадра (высоте и ширине) из видео yuv, можно ли преобразовать видео yuv в другой формат (скажем, mp4) с помощью FFmpeg, получить из него информацию, а затем удалить видео mp4 и продолжить работу с видео yuv? Если так, то как это сделать?
import cv2
import numpy as np
import os
import subprocess as sp
yuv_filename = 'can_0.yuv'
#flow=[]
width, height = 320, 240
file_size = os.path.getsize(yuv_filename)
n_frames = file_size // (width*height*3 // 2)
f = open(yuv_filename, 'rb')
old_yuv = np.frombuffer(f.read(width*height*3//2), dtype=np.uint8).reshape((height*3//2, width))
cv2.imshow('frame',old_yuv)
cv2.waitKey(3000)
# Convert YUV420 to Grayscale
old_gray = cv2.cvtColor(old_yuv, cv2.COLOR_YUV2GRAY_I420)
cv2.imshow('frame_gs',old_gray)
cv2.waitKey(3000)
Когда я запускаю приведенный выше код, я получаю образ yuv:
Это нормально для Изображение или какая-то проблема с разрешением? И почему нет цвета? Однако когда я конвертирую его в оттенки серого, он получается нормальным:
Исходный кадр (при просмотре с помощью yuvplayer 2.5):