当前位置:   article > 正文

opencv实现视频转字符画

视频转字符画

废话不多说,先看看效果。 

 


1.先讲一下环境搭配

小编用的IDE是VS2019,配置了opencv 4.6.0,版本不一定要相同。相信手眼通天的大家早就一定会配的好的。不过要实现本例,这里小编提几个醒。

必须是Debug x64模式,不然运行报错的。

 

 确保这几个包含目录和库目录已经有了opencv

 

 还有这个附加依赖项不要忘了。

还有,我们要有个图形库。这里大家要在网上自己下载graphics.h这个库,或者下载一个最简单的库easyx.h就行了 (小编亲测有效) ,用来显示源视频和图形画。

至于这几个库和头文件,其实是自带的。

  1. #include<windows.h>
  2. #include<mmsystem.h>
  3. #pragma comment(lib,"winmm.lib")

2.基本原理

其实整体原理很简单,我们利用opencv的一些库函数,先获取视频(相对路径),再用流的方法读取视频中每一帧图片,将3通道的RGB图片转换为2通道的GRAY图片,然后循环读取各个像素的灰度值,将其除以256乘以字符串的长度就是index,转换成的字符就是str[index]。这个字符串是自己敲的。

const char* str = "@#$%&!=+*,';+~.  ";

 通常由复杂到简单,其实这里就是电脑键盘第二排上的哟(^_^),当然你也可以更改。

循环输出每一行的字符串到初始化的窗口上。详细见下面代码。


 3.贴代码

  1. #include<string>
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<opencv2/opencv.hpp>
  5. #include<graphics.h>
  6. #include<windows.h>
  7. #include<mmsystem.h>
  8. #pragma comment(lib,"winmm.lib")
  9. using namespace std;
  10. using namespace cv;
  11. int main() {
  12. initgraph(960, 640);//图形库初始化一个960*640的窗口
  13. setbkcolor(BLACK);
  14. cleardevice();
  15. settextstyle(12, 0, "楷体");//这个楷体很重要,不然每一行都对不齐
  16. setbkmode(TRANSPARENT);
  17. VideoCapture mvideo("./video1.mp4");
  18. const char* str = "@#$%&!=+*,';+~. ";//通常由复杂到简单
  19. int len = strlen(str);
  20. BeginBatchDraw();//开启双缓冲绘图,因为要显示在窗口上
  21. Mat frame;
  22. Mat show;
  23. string text;
  24. int index = 0;
  25. while (1)
  26. {
  27. mvideo >> frame;
  28. if (frame.empty())
  29. {
  30. printf("视频未找到");
  31. break;
  32. }
  33. cvtColor(frame, frame, COLOR_BGR2GRAY);//RBG转GRAY
  34. //转换每一帧图片大小
  35. resize(frame, show, Size(300, 150));
  36. resize(frame, frame, Size(150, 50));
  37. cleardevice();
  38. for (int x = 0; x < frame.rows; x++)
  39. {
  40. for (int y = 0; y < frame.cols; y++)
  41. {
  42. int grayval = frame.at<uchar>(x, y);//每个像素点的灰度值
  43. index = grayval / 256.0 * len;
  44. text += str[index];//这里折比换算成index,将对应的各种字符加在后面
  45. }
  46. outtextxy(0, x * textheight(str[index]), text.data());
  47. //图形库操作,打印一行字符
  48. text.clear();
  49. }
  50. imshow("视频转字符画", show);//源视频也一起显示一下
  51. int key = cv::waitKey(10);
  52. if (key == 32) //32是空格键哟
  53. break;
  54. FlushBatchDraw();
  55. }
  56. return 0;
  57. }

这是小编第一次写文章,点个赞再走吧。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/94231
推荐阅读
相关标签
  

闽ICP备14008679号