原创 Maye426 2020-11-29
收录于话题
#C语言图形界面项目练习
10个
1 视频转字符动画
在计算机逐步渗入社会生活各个层面的今天,计算机已经成为人们日常生活的一分,越来越多的人使用计算机办公、娱乐等等。
2 背景知识
视频转字符动画其实很简单,首先需要了解图片在内存里面是怎么存储的,然后对每一个像素点进行操作,转成相应的字符,输出到屏幕上即可。
表白程序设计原理:
第一步,配置OpenCV和easyx环境,配置easyx主要是为了显示字符动画时流畅的显示(如果不使用,直接输出到控制待也是可以的)
第二步,准备好不同颜色需要替换的字符
第三步,打开视频,逐帧获取图片,并转成灰度图
第四步,获取到图片的每个像素点的颜色值
第五步,然后根据颜色值得比例转成字符输出即可
3 错误及解决方案
此程序使用Vs209+OpenCV+easyx开发。刚开始学习C语言或者没接触过OpenCV和easyx的伙伴,拿到代码之后肯定有很多的错误,这就是所谓的给了源码也不能运行,所以配置环境和查看报错也是作为编程学习者,必须要掌握的技能。
vs安装使用教程:[点击查看教程]
OpenCV安装使用教程:[点击查看教程]
easyx安装使用教程:[点击查看教程]
4. 话不多说上代码先看代码,然后自己去敲代码练习哦~#include
#include
#include
#include
#include
#include
#pragma comment(lib,"winmm.lib")
using namespace cv;
using namespace std;
int main()
{
initgraph(960, 640);
VideoCapture mvideo("./极乐净土.mp4");
mciSendString("open ./干坤坤.mp3 alias bgm", 0, 0, 0);
const char* str = "@#$%&eb!*,';+^~. = ";
int len = strlen(str);
BeginBatchDraw();
while (1)
{
Mat frame;//视频帧
mvideo >> frame;//获取每一张图片
if (frame.empty())//如果读完就退出
break;
cvtColor(frame, frame, COLOR_BGR2GRAY);
resize(frame, frame, Size(150, 50));
String text;//保存转换后的字符串
cleardevice();
int index = 0;
//遍历图片像素的行和列
for (int x = 0; x
{
for (int y = 0; y
{
int grayval = frame.at(x, y);
index = grayval / 256.0 * len;//通过颜色比例,把颜色转成字符
text += str[index];
}
settextstyle(10, 0, "楷体");
outtextxy(0, x * textheight(str[index]), text.data());//逐行输出
text.clear();//每一行清除一次
}
imshow(" ", frame);
int key = cv::waitKey(10);
if (key == 32)//按空格退出
break;
mciSendString("play bgm", 0, 0, 0);
FlushBatchDraw();
}
cv::waitKey(0);
return 0;
}