OpenCV - 从视频文件中捕获任意帧
OpenCV - Capture arbitrary frame from video file
我使用以下代码从视频文件中提取特定帧。在这个例子中,我只是得到中间框架:
import cv2
video_path = '/tmp/wonderwall.mp4'
vidcap = cv2.VideoCapture(video_path)
middle_frame = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT) / 2)
success, image = vidcap.read()
count = 0
success = True
while success:
success, image = vidcap.read()
if count == middle_frame:
temp_file = tempfile.NamedTemporaryFile(suffix='.jpg', delete=False)
cv2.imwrite(temp_file.name, image)
count += 1
但是,使用这种方法,捕获非常大的文件中的中间帧可能需要一段时间。
Apparently,在旧的 cv
模块中,可以这样做:
import cv
img = cv.QueryFrame(capture)
cv2
中是否有类似的方法来抓取视频文件中的特定帧,而无需遍历所有帧?
您可以用相同的方式在 C++ 中执行此操作(python 转换应该很容易)。
cv::VideoCapture cap("file.avi");
double number_of_frame = cap.get(CV_CAP_PROP_FRAME_COUNT);
cap.set(CV_CAP_PROP_POS_FRAMES, IndexOfTheFrameYouWant);
cv::Mat frameIwant = cap.read();
供参考:
VideoCapture::get(int propId)
可以使用各种标志返回几乎所有你想要的(http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html 并寻找 get() )。
VideoCapture::set(int propId, double value)
如果您使用 propID 1 和您想要的框架索引,Set 将执行您想要的操作(同一文档查找 set)。
您应该注意,如果您用作参数的索引优于最大帧,那么如果幸运的话,代码将抓取视频的最后一帧,或者在 运行 时间崩溃。
我使用以下代码从视频文件中提取特定帧。在这个例子中,我只是得到中间框架:
import cv2
video_path = '/tmp/wonderwall.mp4'
vidcap = cv2.VideoCapture(video_path)
middle_frame = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT) / 2)
success, image = vidcap.read()
count = 0
success = True
while success:
success, image = vidcap.read()
if count == middle_frame:
temp_file = tempfile.NamedTemporaryFile(suffix='.jpg', delete=False)
cv2.imwrite(temp_file.name, image)
count += 1
但是,使用这种方法,捕获非常大的文件中的中间帧可能需要一段时间。
Apparently,在旧的 cv
模块中,可以这样做:
import cv
img = cv.QueryFrame(capture)
cv2
中是否有类似的方法来抓取视频文件中的特定帧,而无需遍历所有帧?
您可以用相同的方式在 C++ 中执行此操作(python 转换应该很容易)。
cv::VideoCapture cap("file.avi");
double number_of_frame = cap.get(CV_CAP_PROP_FRAME_COUNT);
cap.set(CV_CAP_PROP_POS_FRAMES, IndexOfTheFrameYouWant);
cv::Mat frameIwant = cap.read();
供参考:
VideoCapture::get(int propId)
可以使用各种标志返回几乎所有你想要的(http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html 并寻找 get() )。
VideoCapture::set(int propId, double value)
如果您使用 propID 1 和您想要的框架索引,Set 将执行您想要的操作(同一文档查找 set)。 您应该注意,如果您用作参数的索引优于最大帧,那么如果幸运的话,代码将抓取视频的最后一帧,或者在 运行 时间崩溃。