VS+OpenCV字符动画ikun打篮球

news/2024/11/30 1:29:59/

目录

  • 一、环境搭建
  • 实现
  • 效果
  • 模糊知识点
  • 资源

一、环境搭建

  1. Visual Studio 2019
  2. VS+openCVVS2019配置opencv4.6.0手把手一步一步实现
  3. 导出OpenCV的VS项目模板从第四步导出项目模板开始看
  4. VS安装easyx图形库教程
  5. easyx.h报错:无法打开源文件 “xxx.h“ 的解决办法

使用默认的宽字符(Unicode)字符集
在这里插入图片描述

实现

#include <iostream>
#include <locale>
#include <codecvt>
#include <opencv2/opencv.hpp>
#include <easyx.h>
#include<mmsystem.h>// 多媒体
#pragma comment(lib,"winmm.lib")
//#pragma comment(lib, "winmm.lib") 预处理指令,用于告诉编译器在链接时自动引入指定的winmm.lib库文件。using namespace cv; 
using namespace std;// 窗口的宽高
#define WIDTH 960
#define HEIGHT 640int main()
{initgraph(WIDTH,HEIGHT);// 初始化窗口的宽高-字符动画窗口// 1. 打开视频和音频VideoCapture video("./1.mp4");/*_T("Arial") 宏定义,用于在 Windows 环境中支持 Unicode 和 ANSI 字符集之间的转换。*/mciSendString(_T("open 1.mp3"), NULL, 0, 0);//  Windows API函数通常使用宽字符形式的字符串作为参数// 2.图像处理Mat img;						//存储视频的每一帧Mat show;						//显示图像//准备替换的字符const char* str = "@#$&%=+*,';+()~.   ";int length = strlen(str);int index = 0;          // 替换字符的下标String text;//设置替换文字的样式settextstyle(12, 0,_T("楷体"));		//设置字体Arialsetbkmode(TRANSPARENT);			//去掉文字背景settextcolor(WHITE);			//设置文字颜色为白色/*开启批量绘图模式。在调用该函数之后,所有的绘图操作都会被缓存起来,而不会立即显示在屏幕上,直到调用FlushBatchDraw()或EndBatchDraw()函数*/BeginBatchDraw();while (1){video >> img;// 从输入流中读取数据的操作,但实际上是从 video 对象中读取下一帧视频数据,并将其存储到 img 对象中if (img.empty())	// 帧为空退出break;// 2.1调整图像的属性cvtColor(img,img, COLOR_BGR2GRAY);//把原图像变成一个灰度图resize(img, img, Size(150,50));   //调整图像大小// 2.2 字符动画处理cleardevice();                      //清屏for (int x = 0; x<img.rows; x++){for (int y= 0; y < img.cols; y++){/*<uchar> 是模板参数,用于指定图像的像素类型。对于灰度图像,每个像素表示为一个无符号字符(8位)<uchar>。如果是彩色图像,则可以使用 <Vec3b> 模板参数,其中每个像素由三个无符号字符(8位)组成,分别表示蓝色、绿色和红色通道的值。*///获取图像中 (x, y) 像素位置的颜色值int colorRgb = img.at<uchar>(x,y);// 通过计算颜色值百分比 确定 颜色相邻时使用 同一个字符index = colorRgb / 256.0 * length;text += str[index];}/*std::wstring_convert是一个字符串转换器类模板,它接受一个字符串编码转换器类作为模板参数,这里的std::codecvt_utf8_utf16<wchar_t>,是专门用于UTF-8到UTF-16转换的编码转换器类。使用converter.from_bytes()将UTF-8编码的字符串转换为UTF-16编码的宽字符串,或者使用converter.to_bytes()将UTF-16编码的宽字符串转换为UTF-8编码的字符串*/std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;std::wstring wideText = converter.from_bytes(text.data());outtextxy(0, x * textheight(str[index]), wideText.c_str());text.clear();}// 2.3灰度视频处理resize(img, show, Size(300, 100));  //调整图像大小imshow("iKun-灰度", show);mciSendString(_T("play 1.mp3"), NULL, 0, 0);// 2.4 停顿处理int key = waitKey(22);//等待 毫秒来检测是否有按键被按下if (key==' ')break;//刷新批量绘图缓存并将缓存的图形操作立即显示在屏幕上FlushBatchDraw();}//结束批量绘图模式。调用该函数后,所有的图形绘制操作都会立即显示在屏幕上,并恢复到正常的即时绘图模式EndBatchDraw();closegraph();// 关闭窗口return 0;
}

效果

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

模糊知识点

  1. #pragma comment(lib, "winmm.lib") 预处理指令,用于告诉编译器在链接时自动引入指定的winmm.lib库文件。

  2. _T("Arial") 宏定义,用于在 Windows 环境中支持 Unicode 和 ANSI 字符集之间的转换。在 ANSI 编译环境下会将字符串转换为 ANSI 格式,而在 Unicode 编译环境下会将字符串转换为 Unicode 格式

  3. 批量绘图模式

/*开启批量绘图模式。在调用该函数之后,所有的绘图操作都会被缓存起来,
而不会立即显示在屏幕上,直到调用FlushBatchDraw()或EndBatchDraw()函*/
BeginBatchDraw();//刷新批量绘图缓存并将缓存的图形操作立即显示在屏幕上
FlushBatchDraw();//结束批量绘图模式。调用该函数后,所有的图形绘制操作都会立即显示在屏幕上,并恢复到正常的即时绘图模式
EndBatchDraw();
  1. 模板参数
  template<typename _Tp> inline
_Tp& Mat::at(int i0, int i1)Mat img;
int colorRgb = img.at<uchar>(x,y);<uchar> 是模板参数,用于指定图像的像素类型。对于灰度图像,每个像素表示为一个无符号字符(8位)<uchar>。
如果是彩色图像,则可以使用 <Vec3b> 模板参数,其中每个像素由三个无符号字符(8位)组成,分别表示蓝色、绿色和红色通道的值。
  1. std::wstring_convert字符串转换器类模板
std::wstring_convert是一个字符串转换器类模板,它接受一个字符串编码转换器类作为模板参数,
这里的std::codecvt_utf8_utf16<wchar_t>,是专门用于UTF-8到UTF-16转换的编码转换器类。
使用converter.from_bytes()将UTF-8编码的字符串转换为UTF-16编码的宽字符串,
或者使用converter.to_bytes()将UTF-16编码的宽字符串转换为UTF-8编码的字符串
#include <locale>
#include <codecvt>
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wideText = converter.from_bytes(text.data());
outtextxy(0, x * textheight(str[index]), wideText.c_str());
  1. 等待 毫秒来检测是否有按键被按下
int key = waitKey(22);//等待 22 毫秒来检测是否有按键被按下
if (key==' ')	// 当按下 空格 键时退出循环break;
if (key == 27)	// 当按下 ESC 键时退出循环break;

资源

视频素材+源码


http://www.ppmy.cn/news/617273.html

相关文章

Windows环境下设置redis开启自动启动

一、首先下载好Redis 二、设置Redis服务 由于上面虽然启动了redis&#xff0c;但是只要一关闭cmd窗口&#xff0c;redis就会消失。所以要把redis设置成windows下的服务。 打开电脑的服务列表发现并没有所谓的Redis的服务。 我们需要进入到你安装的Redis的目录中&#xff0c;通…

蓝宝石压力传感器工作原理与优势

蓝宝石压力传感器利用应变电阻式工作原理&#xff0c;采用硅-蓝宝石作为半导体敏感元件&#xff0c;具有无与伦比的计量特性。   蓝宝石系由单晶体绝缘体元素组成&#xff0c;不会发生滞后、疲劳和蠕变现象&#xff1b;蓝宝石比硅要坚固&#xff0c;硬度更高&#xff0c;不怕…

《炬丰科技-半导体工艺》利用蓝宝石衬底表面纹理化提高LED的发光效率

书籍&#xff1a;《炬丰科技-半导体工艺》 文章&#xff1a;植入物表面的钛纳米级蚀刻 编号&#xff1a;JFKJ-21-985 作者&#xff1a;炬丰科技 引言 近几年来&#xff0c;氮化镓基发光二极管取得了持续快速的发展。氮化镓基发光二极管目前被用于各种显示和照明应用&#xff…

彩色宝石链

题目描述 有一条彩色宝石项链&#xff0c;是由很多种不同的宝石组成的&#xff0c;包括红宝石&#xff0c;蓝宝石&#xff0c;钻石&#xff0c;翡翠&#xff0c;珍珠等。有一天国王把项链赏赐给了一个学者&#xff0c;并跟他说&#xff0c;你可以带走这条项链&#xff0c;但是王…

CVD-氮化硼BN薄膜 多层/单层;CVD-蓝宝石基底氮化硼薄膜 ;

CVD六方氮化硼薄膜&#xff08;基底可选&#xff09; 单层、双层、多层等需求定制&#xff1b; 尺寸&#xff1a;1*1cm 基底&#xff1a;石英基底/PET基底/蓝宝石基底/Sio2/Si 六方氮化硼(h-BN)是与石墨烯结构类似的二维绝缘体材料,它作为介电层在提高场效应晶体管器件的迁…

蓝宝石压力传感器安装使用注意事项

蓝宝石压力传感器利用应变电阻式工作原理&#xff0c;采用硅-蓝宝石作为半导体敏感元件&#xff0c;具有无与伦比的计量特性。因此&#xff0c;利用硅-蓝宝石制造的半导体敏感元件&#xff0c;对温度变化不敏感&#xff0c;即使在高温条件下&#xff0c;也有着很好的工作特性;蓝…

PCB板上的蓝宝石---关于光学定位点的DFM

作者&#xff1a;王辉东 一博科技高速先生团队队员 “这个PCB光学定位点的设计就像秋高&#xff0c;把我给气爽了” 正在伤春悲秋感叹中的赵理工&#xff0c;耳畔突然传来了大师兄这不和谐的声音&#xff0c;不禁扭头关切的问道&#xff1a;“什么事呀大师兄&#xff0c;整得…

2022版全球及中国蓝宝石材料产业容量预测与十四五投资战略研究报告

2022版全球及中国蓝宝石材料产业容量预测与十四五投资战略研究报告 ------------------------------------- 《出版单位》&#xff1a;鸿晟信合研究院【专员客服对接】 《修订日期》&#xff1a;2022年2月 《客服人员》&#xff1a;周文文 【具体数据分析内容可咨询鸿晟信合研…