VS+OpenCV字符动画ikun打篮球

简介: VS+OpenCV字符动画ikun打篮球

一、环境搭建

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

实现

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

效果

image.png
image.png

image.png

模糊知识点

  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;

资源

视频素材+源码

相关文章
|
C++ 计算机视觉 Python
OpenCV-图像字符化
OpenCV-图像字符化
|
7月前
|
计算机视觉 Python
OpenCV 库创建了一个简单的动画
OpenCV 库创建了一个简单的动画
80 2
|
7月前
|
前端开发 计算机视觉 Python
OpenCV中绘制运动的小球动画,
要在OpenCV中绘制运动的小球动画,并且将动画显示在Python GUI窗口内,可以按照以下步骤进行:
117 2
|
计算机视觉 Python
OpenCV中绘制文字和运动的小球动画
要在OpenCV中绘制文字和运动的小球动画,可以使用以下方法: 1. 导入所需库:
143 8
|
机器学习/深度学习 计算机视觉 vr&ar
OpenCV OpenGL手写字符识别
  另外一篇文章地址:这个比较详细,但是程序略显简单,现在这个程序是比较复杂的 http://blog.csdn.net/wangyaninglm/article/details/17091901     整个项目下载地址:   http://download.
903 0
|
算法 计算机视觉
OpenCV手写数字字符识别(基于k近邻算法)
  摘要 本程序主要参照论文,《基于OpenCV的脱机手写字符识别技术》实现了,对于手写阿拉伯数字的识别工作。识别工作分为三大步骤:预处理,特征提取,分类识别。预处理过程主要找到图像的ROI部分子图像并进行大小的归一化处理,特征提取将图像转化为特征向量,分类识别采用k-近邻分类方法进行分类处理,最后根据分类结果完成识别工作。
2139 0
|
2月前
|
计算机视觉
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
这篇文章详细介绍了OpenCV库中的图像二值化函数`cv2.threshold`,包括二值化的概念、常见的阈值类型、函数的参数说明以及通过代码实例展示了如何应用该函数进行图像二值化处理,并展示了运行结果。
525 0
Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解
|
3月前
|
算法 计算机视觉
opencv图像形态学
图像形态学是一种基于数学形态学的图像处理技术,它主要用于分析和修改图像的形状和结构。
55 4
|
3月前
|
存储 计算机视觉
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
本文介绍了使用OpenCV进行图像读取、显示和存储的基本操作,以及如何绘制直线、圆形、矩形和文本等几何图形的方法。
Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制
|
4月前
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
下一篇
DataWorks