基于OpenCV实现视频循环播放与倒放
本文详解如何利用OpenCV实现视频的无限循环播放及倒放功能。核心逻辑通过维护帧计数器,在读取每帧后递增,当计数器等于视频总帧数(CAP_PROP_FRAME_COUNT)时,重置计数器并将播放位置跳转至起始帧(CAP_PROP_POS_FRAMES)。文章提供了Python和C++的循环播放完整代码示例,并补充了使用C语言实现视频倒放的逻辑与代码片段,帮助开发者掌握视频流控制的关键属性。
介绍
本文主要讲解如何使用OpenCV库来实现视频的循环播放功能。
实现视频循环播放主要包含以下三个关键步骤:
- 首先,初始化一个帧计数器变量frame_counter,并将其初始值设置为0。
- 在读取每一帧视频数据时,将该计数器的值递增1。
- 当frame_counter的值增加到等于视频的总帧数时,将计数器重置为0,并将当前视频流的播放位置跳转回第0帧,从而实现循环。
获取视频总帧数的方法是使用属性标识符CAP_PROP_FRAME_COUNT。
设置视频当前播放帧数的方法是使用属性标识符CAP_PROP_POS_FRAMES。
VideoCaptureProperties通用属性标识符的完整参考地址可查阅OpenCV官方文档。
1.Python+OpenCV实现
import cv2
cap = cv2.VideoCapture("001.mp4")
frame_counter = 0
while (cap.isOpened()):
ret, frame = cap.read()
frame_counter += 1
if frame_counter == int(cap.get(cv2.CAP_PROP_FRAME_COUNT)):
frame_counter = 0
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)
cv2.imshow("frame", frame)
key = cv2.waitKey(1)
# ESC
if key == 27:
break
cap.release()
cv2.destroyAllWindows()
2.C++ + OpenCV实现
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main() {
cv::Mat frame;
cv::VideoCapture cap("001.mp4");
int frame_counter = 0;
while (true)
{
cap >> frame;
if (!frame.data)
{
printf("Image not loaded");
return -1;
}
frame_counter += 1;
if (frame_counter == int(cap.get(cv::CAP_PROP_FRAME_COUNT))){
frame_counter = 0;
cap.set(cv::CAP_PROP_POS_FRAMES, 0);
}
cv::imshow("demo", frame);
char(key)=(char)cv::waitKey(1);
if(key==27)
break;
}
return 0;
}
补充
值得注意的是,OpenCV不仅支持视频的循环播放,还可以实现视频的倒放效果。
下面将展示如何使用C语言实现视频的倒放,以下是相关的示例代码。
#include <stdio.h>
#include<math.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char* argv[]) {undefined
int i = 0, j = 0, k = 0;
cvNamedWindow("Example3", CV_WINDOW_AUTOSIZE);
CvCapture* capture = 0;
capture = cvCreateFileCapture("gr18.avi");
if (!capture) {undefined
return -1;
}
IplImage *out = cvQueryFrame(capture);//Init the video read
//用于确定帧数
while ((out = cvQueryFrame(capture)) != NULL) {undefined
k++;
}
cvReleaseCapture(&capture);
capture = cvCreateFileCapture("gr18.avi");
out = cvQueryFrame(capture);//没有它J会多一帧。
double fps = cvGetCaptureProperty(
capture,
CV_CAP_PROP_FPS
);
CvSize size = cvSize(
(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)
);
CvVideoWriter *writer = cvCreateVideoWriter(
"gr13.avi",
CV_FOURCC('M', 'J', 'P', 'G'),
fps,
size
, 1
);
IplImage* logpolar_frame = cvCreateImage(
size,
IPL_DEPTH_8U,
3
);
//out = cvCloneImage(img);
int booll = 1;
while ((out = cvQueryFrame(capture)) != NULL)
{undefined
i = 0;
j++;;
booll = 0;
if (j == k)//用于从第J帧开始写入
{undefined
cvShowImage("Example3", out);
cvWaitKey(1);
cvWriteFrame(writer, out);
k--; j = 0;
//重复初始化
capture = cvCreateFileCapture("gr18.avi");
out = cvQueryFrame(capture);
}
//j++;
if (k == 0)break;
}
printf("||%d %d", k, j); getchar();
cvReleaseVideoWriter(&writer);
cvReleaseImage(&logpolar_frame);
cvReleaseCapture(&capture);
//cvReleaseCapture(&capture);
cvDestroyWindow("Example3");
return(0);
}到此这篇关于基于OpenCV实现视频循环播放的文章就介绍到这了,更多相关OpenCV视频播放内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









