基于OpenCV和C++的控制台播放视频

Posted A Tiger

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于OpenCV和C++的控制台播放视频相关的知识,希望对你有一定的参考价值。

基于OpenCV和C++的控制台播放视频

目录

一、 运行环境

VScode=1.74.3
OpenCV=4.5.2
MinGW=8.1.0
我是使用OpenCV配合vscode的C++的环境,用VS比较简单一点,不用编译OpenCV(我电脑内存不多,实在不想装VS)
为C++配置OpenCV参考教程
配置教程

二、 实现思路

三、 实现代码

代码主要是跟着B站上面的一个视频写的,但是那个视频不是很全,全靠一点一点的暂停看

#include <opencv2/opencv.hpp>
#include <iostream>
#include<windows.h>

using namespace cv;
using namespace std;

int main()

    
    VideoCapture video;//打开视频文件
    bool ret =video.open("./firework.mp4");
    if (ret==false)
        cout<<"video open failed!";
    else cout<<"video open successed!";
    // while(1)

    // 
    int framecount=video.get(CAP_PROP_FRAME_COUNT);//视频帧数
    int fps=video.get(CAP_PROP_FPS);
    int cols=video.get(CAP_PROP_FRAME_WIDTH);
    int rows=video.get(CAP_PROP_FRAME_HEIGHT);
    char charImgs[]=" .,-^:;+*=#%@";//字符元素表


    int hSize=20;
    int wSize=11;

    int width=cols/wSize;
    int height=rows/hSize;
  

    char cmd[512];
    sprintf_s(cmd,sizeof(cmd),"mode con cols=%d lines=%d",width,height);
    system(cmd);

    //申请内存
    int frameSize=height*(width+1)+1;
    char * data=(char *)malloc(frameSize * framecount);
    if(data==NULL)
        cout<<"memerory not enough!";
    

    Mat frameImg;
    Mat grayImg;
    for(int n=0;n<framecount;n++)
        char* p=data+n*frameSize;
        int k=0;
        video.read(frameImg);
        cvtColor(frameImg,grayImg,COLOR_BGR2GRAY);
    for(int row=0;row<rows-hSize;row+=hSize)
        for(int col=0;col<cols-wSize;col+=wSize)
            int value=grayImg.at<uchar>(row,col);
            p[k++]=charImgs[value/20];

        
        p[k++]='\\n';
    
    p[k++]=0;
    system("cls");
    cout<<"reading: "<<n+1<<"/"<<framecount<<endl;
    
    //播放
    HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos=0,0;
   
    while(1)
        for (int  i = 0; i < framecount; i++)
        
            /* code */
            char * p=data+i*frameSize;
            SetConsoleCursorPosition(h,pos);
            cout<<p;
            Sleep(1500/fps);
              
    

    return 0;


四、 执行结果

将视频素材firework.mp4与.exe文件放在同一目录下,运行.exe文件

五、源码及附件

链接:https://pan.baidu.com/s/1WQEUSU_EtBxwt-6kyfujhg
提取码:N12K

六、总结

综上,写这个最难的不是代码,而是环境的配置,断断续续的找教程,试了四个,最主要的还是要学会看日志文件,先前没有这种思想,后面静下心来加上翻译,发现日志文件也不是很难懂,后面慢慢的根据日志上面出现的问题一条一条解决。其实中途想过放弃,用python写,导入opencv包一句命令的事,后来想想年轻多折腾折腾不是坏事。

以上是关于基于OpenCV和C++的控制台播放视频的主要内容,如果未能解决你的问题,请参考以下文章

C/C++提升 | 基于FFmpeg的视频播放器

OpenCV视频读取播放,视频转换为图片

Opencv 初探录制视频保持视频播放视频

基于opencv,开发摄像头播放程序

基于OPenCV的视频播放变慢

基于python + opencv的视频播放调节功能