目录
一、 运行环境
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包一句命令的事,后来想想年轻多折腾折腾不是坏事。