【发布时间】:2020-06-27 11:57:00
【问题描述】:
我需要读取一个 yuv 视频文件,从中提取单个帧,将其转换为灰度,然后计算相邻帧之间的 Lucas Kanade 光流。我最初使用的是 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 视频文件的数据集。但是当我给 VideoCapture() 一个 yuv 文件时,我收到如下错误:
[IMGUTILS @ 00000078a4bee5c0] 图片尺寸0x0无效 [错误:0] 全局 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: error: (-5:Bad argument) CAP_IMAGES: 找不到起始编号 (以文件名):C:\Users\Ann Baiju\Project\Copy_Move_Datasets\new original\DERF\hall.yuv in function '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: error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
我该如何解决这个问题? 此外,我了解 yuv 是一种原始视频文件格式,其中没有大小或 fps 信息。有什么方法可以从文件中推断出来,还是我必须手动输入该信息?
关于如何从 yuv 视频获取帧大小信息(高度和宽度)的问题,是否可以使用 FFmpeg 将 yuv 视频转换为其他格式(例如 mp4),从中获取信息,然后删除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 查看):
【问题讨论】: