基于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++的控制台播放视频的主要内容,如果未能解决你的问题,请参考以下文章