赞
踩
使用默认的宽字符(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 640 int 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("楷体")); //设置字体Arial setbkmode(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; }
#pragma comment(lib, "winmm.lib")
预处理指令,用于告诉编译器在链接时自动引入指定的winmm.lib库文件。
_T("Arial")
宏定义,用于在 Windows 环境中支持 Unicode 和 ANSI 字符集之间的转换。在 ANSI 编译环境下会将字符串转换为 ANSI 格式,而在 Unicode 编译环境下会将字符串转换为 Unicode 格式
批量绘图模式
/*开启批量绘图模式。在调用该函数之后,所有的绘图操作都会被缓存起来,
而不会立即显示在屏幕上,直到调用FlushBatchDraw()或EndBatchDraw()函*/
BeginBatchDraw();
//刷新批量绘图缓存并将缓存的图形操作立即显示在屏幕上
FlushBatchDraw();
//结束批量绘图模式。调用该函数后,所有的图形绘制操作都会立即显示在屏幕上,并恢复到正常的即时绘图模式
EndBatchDraw();
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位)组成,分别表示蓝色、绿色和红色通道的值。
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());
int key = waitKey(22);//等待 22 毫秒来检测是否有按键被按下
if (key==' ') // 当按下 空格 键时退出循环
break;
if (key == 27) // 当按下 ESC 键时退出循环
break;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。