基于OpenCV实现视频循环播放

作者:求则得之,舍则失之 时间:2023-07-13 09:10:33 

介绍

本文将介绍基于OpenCV实现视频的循环播放。

有以下三个步骤:

  • 首先设置一个frame的设置参数frame_counter,值为0

  • 在读帧时间,将每次加一

  • 当 frame_counter 达到视频总帧数时,将当前的帧设置为 0

视频总帧数:CAP_PROP_FRAME_COUNT

设置当前的帧:CAP_PROP_POS_FRAMES

VideoCaptureProperties通用属性标识符参考地址。

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);
}

来源:https://blog.csdn.net/weixin_43229348/article/details/123092505

标签:Python,C++,OpenCV,视频,播放
0
投稿

猜你喜欢

  • MySQL索引底层数据结构详情

    2024-01-23 09:47:53
  • 浅谈python3中input输入的使用

    2022-05-15 22:32:57
  • Mysql数据库group by原理详解

    2024-01-19 20:20:44
  • element中form组件prop嵌套属性的问题解决

    2023-07-02 16:49:18
  • python爬虫之基金信息存储

    2021-12-25 03:20:04
  • JS中call/apply、arguments、undefined/null方法详解

    2024-04-19 11:01:31
  • JavaScript setTimeout和setInterval的使用方法 说明

    2023-08-31 10:48:19
  • SQL Server使用T-SQL进阶之公用表表达式(CTE)

    2024-01-17 22:42:32
  • 使用 PHP Masked Package 屏蔽敏感数据的实现方法

    2023-09-03 23:49:13
  • Python序列对象与String类型内置方法详解

    2023-09-22 13:25:18
  • 完全讲解 使用MSCS建立SQL Server集群

    2009-01-19 14:10:00
  • Varchar与char的区别

    2008-02-28 12:44:00
  • Python编写淘宝秒杀脚本

    2021-01-31 23:23:42
  • 分享4个方便且好用的Python自动化脚本

    2023-05-31 02:20:32
  • php mysql获取表字段名称和字段信息的三种方法

    2023-11-18 22:47:26
  • PyTorch之torch.randn()如何创建正态分布随机数

    2022-10-20 01:22:18
  • nodejs微信公众号支付开发

    2024-05-11 09:17:11
  • 兼容主流浏览器的JS复制内容到剪贴板

    2024-04-30 08:52:57
  • Golang实现文件夹的创建与删除的方法详解

    2024-02-02 13:57:02
  • vue eslint报错error "Component name "*****" should always be multi-word"解决

    2024-05-13 09:10:32
  • asp之家 网络编程 m.aspxhome.com