所谓字符动画就是把一个视频里面的像素点都转换为字符,根据像素点里面颜色的不同转换为不同的字符,从而达到字符动画的效果
首先第一步,需要使用到opencv进行流视频操作,可以去相应的博客下载opencev,搭载好环境使用
先找一个坤坤打篮球的视频,导入到项目中
具体为看见有一堆.vcxproj 文件,就保存在这里面,然后定义一个img进行流视频,将视频里面的每一帧都导出来,再用imshow显示,就可以得到一个完整的视频,如下
但我们这个视频窗口只是提供一个转换的,所以我们将它缩小变灰,再弄一个新窗口来实现这个窗口的视频转换为字符动画
接下来就是在这个窗口里面实现字符动画,就是把流视频里面的每一帧图片提取到此窗口中,然后用文本来根据像素点颜色的深浅,显示不同的字符文本,从而达到字符动画的效果
这里采用二维数组来获取color的深浅,然后用文本接受字符数组,最后再清理,然后进入下一帧, 字符数组在第一张图中创建好了,length就是用strlen来获取的长度,最后设置文字颜色,样式,切记透明,代码较短比较简单,最后效果如下所示
坤坤还是风采依旧,此代码不止坤坤的视频可以运用 ,其他色彩分明较大的也可以,只有把视频放入videoCapture里面,然后再把视频移动到图二所示的文件地址里,就可以实现视频的字符动画啦
代码如下
#include <opencv2/opencv.hpp>
#include <easyx.h>
#include <iostream>
#include <mmsystem.h>
using namespace cv;
using namespace std;
#define WIDTH 960
#define HEGEH 480
int main()
{
initgraph(WIDTH, HEGEH);
VideoCapture vedio("./2.mp4"); //导入视频
Mat img; //存储每一帧
Mat show; //显示图像
const char* str = "@#$%=+&*,;?()^ ";
int length = strlen(str);
int index = 0;
String text;
settextstyle(12, 0,"楷体");
setbkmode(TRANSPARENT); //去掉文字背景
settextcolor(WHITE); //设置文字颜色
while (1)
{
vedio >> img; //流视频操作
if (img.empty())
{
break;
}
cvtColor(img, img, COLOR_BGR2GRAY);
resize(img, show, Size(300, 150));
resize(img, img, Size(150, 50));
cleardevice();
for (int x = 0; x < img.rows; x++)
{
for (int y = 0; y < img.cols; y++)
{
int color = img.at<uchar>(x, y);
index = color / 256.0 * length;
text += str[index];
}
outtextxy(0, x * textheight(str[index]),text.data());
text.clear();
}
imshow("ikun", img);
int kay = waitKey(10);
if (kay == ' ')
{
break;
}
}
closegraph();
return 0;
}
只要搭建好opencv环境,复制粘贴即可使用