#include <iostream>
#include <opencv.hpp>
#include <opencv_modules.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <Windows.h>
using namespace std;
using namespace cv;

const char s[] = " .,-'`:!1+*abcdefghijklmnopqrstuvwxyz<>()\/{}[]?234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ%&@#$";//键盘上可输入字符按复杂化程度进行排序用于对应灰度表示（灰度越高，表示支付越复杂）
int main(int argc,char* argv[])//添加参数用于输入地址
{
    SetConsoleTitle("视频转字符画");//设置控制台标题为“视频转字符画”
    string dizhi="";//输入视频地址
    cin>>dizhi;
    VideoCapture capture;//定义类对象
    if(capture.open(dizhi)==0){dizhi="";
    for(int i=1;i<argc;i++){
        if(i!=1) dizhi=dizhi+' '+argv[i];
        else dizhi=dizhi+argv[i];
    }}//读取视频文件
   if(capture.open(dizhi)==0){
            cout<<"输入地址错误！！"<<endl;
            return -1;
    }//地址无效返回-1
    CONSOLE_FONT_INFOEX zi;
    zi.cbSize=sizeof(zi);
    zi.dwFontSize.X=3;
    zi.dwFontSize.Y=7;
    SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE),false,&zi);//定义控制台字体结构体，将控制台字体设置为3，7（6号）
    int frame_width=capture.get(CAP_PROP_FRAME_WIDTH);
    int frame_hight=capture.get(CAP_PROP_FRAME_HEIGHT);
    double fps=capture.get(CAP_PROP_FPS);
    double frame=capture.get(CAP_PROP_FRAME_COUNT);//获取视频信息（分辨率，fps）
    int a=frame_hight/90,c=0;//用于下面转换
    Mat video,video1,video2;
    string out;
    while(true){
            out="";
        capture.read(video);
        if(video.empty())break;
        cvtColor(video,video1,COLOR_BGR2GRAY);
        resize(video1,video2,Size(0,0),1.0/a,1.0/a,1);//读入图像，并将其转化为灰度图再进行缩小（高度为90）
        for(int i=0;i<90;i++){
            for(int j=0;j<1.0/a*frame_width;j++){
                int a=video2.at<uchar>(i,j)*69/255;
                out=out+s[a];
            }
            out=out+'\n';
        }
    cout<<out;//对图片矩阵遍历，输出转换得到的字符串
		COORD hao;
		hao.X = 0;
		hao.Y = 0;
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), hao);//将控制台光标移至开头，用于覆盖输出
        int b=waitKey(1000/(int)fps);//保证视频帧数不变
        if(b==49&&c!=1)c=1;
        if(b==48&&c!=0)c=0;
        if(c==0)imshow("video",video);
        if(b==27)break;//按Esc键退出
    }
    capture.release();
    system("cls");
    return 0;
}
