Animation de personnage VS + OpenCV ikun jouant au basket

1. Construction de l'environnement

  1. Studio visuel 2019
  2. VS+openCV VS2019 configure opencv4.6.0 étape par étape
  3. Exportez le modèle de projet VS d'OpenCV pour commencer à partir de la quatrième étape pour exporter le modèle de projet
  4. Tutoriel de la bibliothèque graphique easyx d'installation de VS
  5. erreur easyx.h : impossible d'ouvrir le fichier source "xxx.h" solution

Utiliser le jeu de caractères larges (Unicode) par défaut
insérez la description de l'image ici

accomplir

#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;
}

Effet

insérez la description de l'image ici
insérez la description de l'image ici

insérez la description de l'image ici

connaissances floues

  1. #pragma comment(lib, "winmm.lib") Directive de prétraitement, utilisée pour indiquer au compilateur d'importer automatiquement le fichier de bibliothèque winmm.lib spécifié lors de la liaison.

  2. _T("Arial")Définition de macro pour prendre en charge la conversion entre les jeux de caractères Unicode et ANSI dans l'environnement Windows. Dans l'environnement de compilation ANSI, la chaîne sera convertie au format ANSI, et dans l'environnement de compilation Unicode, la chaîne sera convertie au format Unicode

  3. mode de dessin par lots

/*开启批量绘图模式。在调用该函数之后,所有的绘图操作都会被缓存起来,
而不会立即显示在屏幕上,直到调用FlushBatchDraw()或EndBatchDraw()函*/
BeginBatchDraw();

//刷新批量绘图缓存并将缓存的图形操作立即显示在屏幕上
FlushBatchDraw();

//结束批量绘图模式。调用该函数后,所有的图形绘制操作都会立即显示在屏幕上,并恢复到正常的即时绘图模式
EndBatchDraw();
  1. Paramètres du modèle
  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_convertModèle de classe de convertisseur de chaîne
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. Attendre des millisecondes pour détecter si une touche est enfoncée
int key = waitKey(22);//等待 22 毫秒来检测是否有按键被按下
if (key==' ')	// 当按下 空格 键时退出循环
    break;
if (key == 27)	// 当按下 ESC 键时退出循环
       break;

Ressource

Matériel vidéo + code source

Je suppose que tu aimes

Origine blog.csdn.net/qq_47355554/article/details/131382280
conseillé
Classement