"Se acerca el Festival del Medio Otoño" No esperaba poder dibujar un pastel de luna tan hermoso usando OpenCV "Código fuente adjunto"

I. Introducción

Pronto llegará el Festival del Medio Otoño. Como uno de los festivales tradicionales chinos, además de degustar deliciosos pasteles de luna y admirar la luna, a la gente también le gusta expresar su alegría y bendiciones por este festival a través de pinturas. Hoy en día, con el continuo desarrollo de la tecnología, es realmente revelador que puedas usar la biblioteca de visión por computadora OpenCV para dibujar exquisitos pasteles de luna y lindas imágenes de conejos de jade.

OpenCV, nombre completo Open Source Computer Vision Library, es una biblioteca de código abierto ampliamente utilizada en el campo de la visión por computadora. Proporciona muchas funciones poderosas de procesamiento de imágenes y visión por computadora, brindando a los desarrolladores herramientas y funciones ricas, lo que hace que sea relativamente fácil implementar diversas operaciones de imágenes. Su flexibilidad y eficiencia son favorecidas por la mayoría de los desarrolladores.

En un momento especial como el Festival del Medio Otoño, usar OpenCV para dibujar imágenes de pasteles de luna y conejos de jade no solo puede mostrar respeto y apoyo a la cultura tradicional, sino también combinar el poder de la tecnología moderna para crear obras únicas y exquisitas. A través de OpenCV, puede dibujar pasteles de luna con un fuerte ambiente festivo, ya sea por su apariencia suave o su textura desigual, se pueden exhibir vívidamente frente a usted. Al mismo tiempo, usar OpenCV para dibujar la imagen del conejo de jade puede mostrar un lindo estilo de dibujos animados, combinando elementos tradicionales con tendencias de la moda, brindando a las personas una sensación refrescante.

Además de dibujar pasteles de luna y conejos de jade, OpenCV también proporciona una gran cantidad de funciones de dibujo, como dibujar formas geométricas básicas, líneas y texto, lo que proporciona una amplia gama de espacios creativos. Al llamar a estas funciones, puede satisfacer fácilmente diversas necesidades de dibujo y agregar efectos visuales únicos a sus trabajos.

Cuando utilice OpenCV, primero debe instalar los archivos de biblioteca correspondientes y familiarizarse con su uso. Al aprender las operaciones básicas y las llamadas a funciones de OpenCV, podrá utilizar mejor esta poderosa herramienta para realizar sus propias ideas. Si usted es un desarrollador profesional de visión por computadora o un principiante interesado en el procesamiento de imágenes, dominar OpenCV es una buena opción.

En este Festival del Medio Otoño, también puedes intentar usar OpenCV para dibujar exquisitos pasteles de luna y lindas imágenes de conejos de jade, y sentir la colisión de la cultura tradicional y la tecnología moderna. Utilice un pincel para pintar en la pantalla de la computadora, congele este hermoso momento y dé la bienvenida al Festival del Medio Otoño junto con el poder de OpenCV.

Esta es la representación ideal de una visualización de imagen de carga.
imagen-20230913175620586

imagen-20230913175512032

2. Dibujar pantalla de muestra

imagen-20230913175222845

imagen-20230913175457441

imagen-20230913175725373

imagen-20230913175752185

3. Instalación de OpenCV

3.1 Descarga OpenCV

Dirección de descarga de OpenCV: https://opencv.org/releases/page/3/

La última versión es 4.3, así que descargue la última versión.

imagen-20230906101920240

imagen-20230906102004369

La descarga es un archivo exe, que se puede instalar haciendo doble clic en él. En realidad, está descomprimido. Puede elegir la ruta de descompresión. El archivo descomprimido contiene muchos archivos fuente y archivos de biblioteca. Es relativamente grande y se puede colocar directamente en un directorio fijo Los siguientes procedimientos Simplemente complete la ruta directamente para llamarlo. Este archivo de biblioteca descargado solo contiene la biblioteca X64, que es adecuada para el compilador MSVS de 64 bits.

imagen-20230906102712398

La descompresión está completa.

imagen-20230906103311462

Después de la descompresión, verá directorios para VC14 y VC15 en el directorio de compilación. ¿Qué quiere decir esto?

La diferencia entre OpenCV VC14 y VC15 es la versión del compilador que utilizan. VC14 usa el compilador Visual Studio 2015, mientras que VC15 usa el compilador Visual Studio 2017. Esto significa que VC15 puede aprovechar una tecnología de compilación más avanzada, mejorando así el rendimiento y la eficiencia de su código. Además, VC15 también admite más funciones de C++11 y C++14, lo que hace que el desarrollo sea más conveniente y flexible.

imagen-20230906103633870

3.2 Entorno VS2022

Aquí presentaré el proceso de instalación del entorno que uso. Todas las versiones de VS están disponibles. OpenCV es solo una biblioteca de terceros y se puede llamar desde cualquier lugar.

Mi entorno actual es Windows y el IDE que uso es el IDEVS2022 más potente de la superficie.

Dirección de descarga: https://visualstudio.microsoft.com/zh-hans/downloads/

imagen-20230913173131481

Debido a que aquí solo necesito usar programación en lenguaje C ++ y C, puede elegir los paquetes que necesita instalar al instalar.

imagen-20230913173258088

Después de la instalación, cree el proyecto.

imagen-20230913173330580

imagen-20230913173349914

3.3 Nueva construcción

Este es un proyecto vacío que creé y escribí un fragmento de código OpenCV.

imagen-20230913173536785

Una vez creado el proyecto, debe agregar una referencia al archivo de encabezado OpenCV y una referencia al archivo de la biblioteca OpenCV.

Haga clic en esta propiedad.

imagen-20230913173632169

El primer paso es agregar la ruta del archivo de encabezado OpenCV usado en C++ y las opciones generales.

imagen-20230913173709390

Dónde está exactamente esta ruta depende de su ruta de instalación de OpenCV.

imagen-20230913173753881

Para comodidad de todos, lo publico aquí.

C:/opencv_4.x/opencv/build/include/opencv2
C:/opencv_4.x/opencv/build/include/opencv
C:/opencv_4.x/opencv/build/include

El segundo paso es establecer la ruta al archivo de la biblioteca. En Opciones de entrada del vinculador, agregue opciones de dependencia.

imagen-20230913173957033

¿Dónde está esta biblioteca? Complétela según su ruta de descompresión de OpenCV.

imagen-20230913174030657

Este es mi camino:

C:/opencv_4.x/opencv/build/x64/vc15/lib/opencv_world430.lib

3.4 Copia de la biblioteca en tiempo de ejecución

Si ha escrito el código OpenCV, simplemente presione para Ctrl + F5ejecutar el programa, si lo ejecuta por primera vez, se informará un error.

Los consejos son los siguientes:

imagen-20230913174225139

Este mensaje nos indica que no se puede encontrar la biblioteca de tiempo de ejecución de OpenCV cuando el programa se está ejecutando. Siempre que utilice una biblioteca de terceros, debe saber esto: cuando se ejecuta, debe copiar la biblioteca utilizada al mismo directorio de nivel del exe generado.

Copie los archivos en el directorio de descompresión de OpenCV opencv_world430.dllal directorio al mismo nivel que el exe compilado. De lo contrario, el programa finalizará de forma anormal porque no se puede encontrar la biblioteca.

imagen-20230912102245746

Cópialo aquí.

imagen-20230913174403148

Ejecútelo nuevamente y el programa se ejecutará normalmente.

imagen-20230913175414887

4. Introducción a las funciones de dibujo de OpenCV

OpenCV proporciona una serie de funciones para el procesamiento y dibujo de imágenes, incluidas algunas funciones de dibujo de uso común. Las siguientes son algunas de las funciones de dibujo comúnmente utilizadas:

4.1 cv::line: Dibuja una línea recta

void cv::line(cv::Mat& img, cv::Point pt1, cv::Point pt2,
              const cv::Scalar& color, int thickness=1,
              int lineType=cv::LINE_8, int shift=0);

Descripción de parámetros:

  • img: La imagen para dibujar una línea recta.
  • pt1: Las coordenadas del punto inicial de la línea recta.
  • pt2: Las coordenadas del punto final de la línea recta.
  • color: El color de la línea.
  • thickness: Ancho de línea de la línea recta, el valor predeterminado es 1.
  • lineType: El tipo de línea recta, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • shift: El número de decimales para las coordenadas, el valor predeterminado es 0.

4.2 cv::rectangle: Dibuja un rectángulo

void cv::rectangle(cv::Mat& img, cv::Rect rect, const cv::Scalar& color,
                   int thickness=1, int lineType=cv::LINE_8,
                   int shift=0);

Descripción de parámetros:

  • img: La imagen del rectángulo que se va a dibujar.
  • rect: La información de tamaño y posición del rectángulo, es decir, las coordenadas de la esquina superior izquierda, ancho y alto.
  • color:El color del rectángulo.
  • thickness: Ancho de línea del rectángulo, el valor predeterminado es 1.
  • lineType: El tipo de rectángulo, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • shift: El número de decimales para las coordenadas, el valor predeterminado es 0.

4.3 cv::circle: Dibuja un círculo

void cv::circle(cv::Mat& img, cv::Point center, int radius,
                const cv::Scalar& color, int thickness=1,
                int lineType=cv::LINE_8, int shift=0);

Descripción de parámetros:

  • img: Para dibujar una imagen circular.
  • center: Las coordenadas del centro del círculo.
  • radius: El radio del círculo.
  • color: El color del círculo.
  • thickness: El ancho de línea del círculo, el valor predeterminado es 1.
  • lineType: El tipo de círculo, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • shift: El número de decimales para las coordenadas, el valor predeterminado es 0.

4.4 cv::ellipse: Dibuja una elipse

void cv::ellipse(cv::Mat& img, cv::Point center,
                 cv::Size axes, double angle, double startAngle,
                 double endAngle, const cv::Scalar& color,
                 int thickness=1, int lineType=cv::LINE_8,
                 int shift=0);

Descripción de parámetros:

  • img: Para dibujar una imagen elíptica.
  • center: Las coordenadas del centro de la elipse.
  • axes: El tamaño de los ejes mayor y menor de la elipse.
  • angle: El ángulo de rotación de la elipse, en grados.
  • startAngle: El ángulo inicial de la elipse, en grados.
  • endAngle: El ángulo final de la elipse, en grados.
  • color:El color de la elipse.
  • thickness: El ancho de línea de la elipse, el valor predeterminado es 1.
  • lineType: El tipo de elipse, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • shift: El número de decimales para las coordenadas, el valor predeterminado es 0.

4.5 cv::putText: Dibujar texto en imagen

void cv::putText(cv::Mat& img, const std::string& text,
                 cv::Point org, int fontFace, double fontScale,
                 const cv::Scalar& color, int thickness=1,
                 int lineType=cv::LINE_8, bool bottomLeftOrigin=false);

Descripción de parámetros:

  • img: La imagen sobre la que dibujar el texto.
  • text: El contenido del texto que se va a dibujar.
  • org: Las coordenadas de la esquina inferior izquierda del texto.
  • fontFace: Tipo de fuente.
  • fontScale: La relación de escala de la fuente.
  • color: El color de la fuente.
  • thickness: El ancho de línea de la fuente, el valor predeterminado es 1.
  • lineType: Tipo de fuente, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • bottomLeftOrigin: Ya sea para tomar la esquina inferior izquierda como origen, el valor predeterminado es falso, es decir, la esquina superior izquierda es el origen.

4.6 cv::polylines: Dibuja los límites de los polígonos.

void cv::polylines(cv::Mat& img, const cv::Point* pts,
                   const int* npts, int ncontours,
                   bool isClosed, const cv::Scalar& color,
                   int thickness=1, int lineType=cv::LINE_8,
                   int shift=0);

Descripción de parámetros:

  • img: La imagen del polígono que se va a dibujar.
  • pts: Matriz de coordenadas de cada vértice del polígono.
  • npts: Matriz del número de vértices de cada bucle cerrado del polígono.
  • ncontours: El número de polígonos.
  • isClosed: si se debe cerrar el polígono.
  • color: El color del polígono.
  • thickness: Ancho de línea del límite del polígono, el valor predeterminado es 1.
  • lineType: El tipo de polígono, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • shift: El número de decimales para las coordenadas, el valor predeterminado es 0.

4.7 cv::fillPoly: Rellena el interior del polígono.

void cv::fillPoly(cv::Mat& img, const cv::Point** pts,
                  const int* npts, int ncontours,
                  const cv::Scalar& color,
                  int lineType=cv::LINE_8, int shift=0,
                  cv::Point offset=cv::Point());

Descripción de parámetros:

  • img: La imagen con la que rellenar el polígono.
  • pts: Puntero a la matriz de coordenadas de cada vértice del polígono.
  • npts: Matriz del número de vértices de cada bucle cerrado del polígono.
  • ncontours: El número de polígonos.
  • color: Color de relleno.
  • lineType: El tipo de polígono, el valor predeterminado es 8 líneas conectadas ( cv::LINE_8).
  • shift: El número de decimales para las coordenadas, el valor predeterminado es 0.
  • offset: Desplazamiento al rellenar polígonos.

4.8 Ejemplos de uso de cv::polylines y cv::fillPoly

cv::Mat image(500, 500, CV_8UC3, cv::Scalar(255, 255, 255));  // 创建一张白色图像

// 定义多边形的顶点坐标
cv::Point pts[1][4];
pts[0][0] = cv::Point(100, 100);
pts[0][1] = cv::Point(200, 100);
pts[0][2] = cv::Point(200, 200);
pts[0][3] = cv::Point(100, 200);

// 绘制多边形的边界
const cv::Point* ppt[1] = {
    
     pts[0] };
int npt[] = {
    
     4 };
cv::polylines(image, ppt, npt, 1, true, cv::Scalar(0, 0, 255), 2);

// 填充多边形的内部
cv::fillPoly(image, ppt, npt, 1, cv::Scalar(0, 255, 0));

// 显示图像
cv::imshow("Image", image);
cv::waitKey(0);

Este código de ejemplo crea una imagen blanca y dibuja un rectángulo con un borde rojo en la imagen, mientras llena el interior del rectángulo con verde. Al utilizar cv::polylineslas funciones y cv::fillPoly, puede dibujar formas poligonales más complejas y efectos de relleno.

5. Códigos de dibujo de Mooncake y Jade Rabbit

5.1 El pastel de luna más sencillo

#include <opencv2/opencv.hpp>

int main()
{
    
    
    // 创建一个黑色背景图像作为画布
    cv::Mat canvas(400, 400, CV_8UC3, cv::Scalar(0, 0, 0));

    // 定义月饼的参数
    cv::Point center(canvas.cols / 2, canvas.rows / 2);
    int radius = 150;
    cv::Scalar mooncakeColor(139, 69, 19); // 棕色

    // 绘制月饼的主体
    cv::circle(canvas, center, radius, mooncakeColor, cv::FILLED);

    // 在窗口中显示绘制的月饼
    cv::imshow("Circular Mooncake", canvas);
    cv::waitKey(0);

    return 0;
}

El código crea una imagen de fondo negro con un tamaño de 400x400 píxeles y utiliza cv::circle()la función para dibujar un pastel de luna marrón redondo. Dibuja un pastel de luna circular especificando las coordenadas del centro, el radio y el color. Finalmente, el pastel de luna dibujado se muestra en la ventana.

5.2 El Conejo de Jade más simple

#include <opencv2/opencv.hpp>

int main()
{
    
    
    // 创建一个黑色背景图像作为画布
    cv::Mat canvas(400, 400, CV_8UC3, cv::Scalar(0, 0, 0));

    // 绘制兔子身体
    cv::ellipse(canvas, cv::Point(canvas.cols / 2, canvas.rows / 2), cv::Size(150, 200), 0, 0, 360, cv::Scalar(255, 255, 255), cv::FILLED);

    // 绘制兔子内耳朵
    cv::ellipse(canvas, cv::Point(canvas.cols / 2 - 60, canvas.rows / 2 - 110), cv::Size(70, 100), 0, 0, 360, cv::Scalar(255, 255, 255), cv::FILLED);
    cv::ellipse(canvas, cv::Point(canvas.cols / 2 + 60, canvas.rows / 2 - 110), cv::Size(70, 100), 0, 0, 360, cv::Scalar(255, 255, 255), cv::FILLED);

    // 绘制兔子眼睛
    cv::circle(canvas, cv::Point(canvas.cols / 2 - 40, canvas.rows / 2), 20, cv::Scalar(0, 0, 0), cv::FILLED);
    cv::circle(canvas, cv::Point(canvas.cols / 2 + 40, canvas.rows / 2), 20, cv::Scalar(0, 0, 0), cv::FILLED);

    // 绘制兔子嘴巴
    cv::ellipse(canvas, cv::Point(canvas.cols / 2, canvas.rows / 2 + 60), cv::Size(60, 30), 0, 180, 360, cv::Scalar(0, 0, 0), cv::FILLED);

    // 绘制兔子鼻子
    cv::circle(canvas, cv::Point(canvas.cols / 2, canvas.rows / 2 + 40), 10, cv::Scalar(255, 0, 0), cv::FILLED);

    // 在窗口中显示绘制的兔子
    cv::imshow("Rabbit", canvas);
    cv::waitKey(0);

    return 0;
}

Code l crea una imagen de fondo negro con un tamaño de 400x400 píxeles y utiliza las funciones cv::ellipse()y cv::circle()para dibujar el cuerpo, los oídos internos, los ojos, la boca y la nariz del conejo. Dibuje diferentes partes especificando parámetros como el punto central, el tamaño, el ángulo y el color. Finalmente, el conejito dibujado se muestra en la ventana.

5.3 Dibujar pasteles de luna con contornos estampados

#include <opencv2/opencv.hpp>

int main()
{
    
    
    // 创建一个画布,大小为800x800像素
    cv::Mat canvas(800, 800, CV_8UC3, cv::Scalar(255, 255, 255));

    // 设置画笔属性
    int thickness = 20;
    cv::Scalar color(245, 225, 111); // 黄色
    int lineType = cv::LINE_8;

    // 绘制太阳花花瓣
    for (int i = 0; i < 20; ++i)
    {
    
    
        // 计算当前花瓣的角度
        double angle = i * 18.0;

        // 计算当前花瓣的终点坐标
        double x = 400 + 220 * cos(angle * CV_PI / 180);
        double y = 400 + 220 * sin(angle * CV_PI / 180);

        // 绘制直线
        cv::line(canvas, cv::Point(400, 400), cv::Point(x, y), color, thickness, lineType);

        // 绘制半圆
        cv::Point center(x, y);
        cv::ellipse(canvas, center, cv::Size(40, 40), 0, 180, 360, color, -1);
    }

    // 绘制中心圆
    cv::Scalar fill_color(255, 153, 51); // 橙色
    cv::Point center(400, 400);
    cv::circle(canvas, center, 200, fill_color, -1);

    // 绘制花瓣图案
    cv::Scalar petal_color(245, 225, 111); // 黄色
    for (int i = 0; i < 12; ++i)
    {
    
    
        // 计算当前花瓣的起点和终点角度
        double startAngle = i * 30.0;
        double endAngle = startAngle + 120.0;

        // 绘制圆弧
        cv::ellipse(canvas, center, cv::Size(60, 60), 0, startAngle, endAngle, petal_color, -1);

        // 旋转180度,绘制对称的圆弧
        cv::ellipse(canvas, center, cv::Size(60, 60), 0, startAngle + 180, endAngle + 180, petal_color, -1);
    }

    // 显示结果
    cv::imshow("Sunflower", canvas);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

El código crea un lienzo de 800x800 píxeles y utiliza funciones y métodos OpenCV para dibujar el patrón de girasol. cv::line()Dibuja líneas rectas, cv::circle()dibuja círculos, cv::ellipse()dibuja semicírculos y arcos.

5.4 Dibujar un conejo

#include <opencv2/opencv.hpp>

int main()
{
    
    
    // 创建一个800x800像素的画布
    cv::Mat canvas(800, 800, CV_8UC3, cv::Scalar(255, 255, 255));

    // 设置画笔属性
    int thickness = -1; // 填充形状
    cv::Scalar color(0, 0, 0); // 黑色
    int lineType = cv::LINE_8;

    // 绘制兔子的头部
    cv::Point center(400, 400);
    cv::circle(canvas, center, 60, color, thickness, lineType);

    // 绘制兔子的眼睛
    cv::Point eye1(380, 500);
    cv::Point eye2(420, 500);
    cv::circle(canvas, eye1, 25, color, thickness, lineType);
    cv::circle(canvas, eye2, 25, color, thickness, lineType);

    // 绘制兔子的嘴巴
    cv::Point mouth_center(400, 480);
    cv::Size axes(10, 10);
    cv::ellipse(canvas, mouth_center, axes, 0, 0, 180, color, thickness, lineType);

    // 绘制兔子的身体
    cv::circle(canvas, center, 100, color, thickness, lineType);

    // 绘制兔子的脚
    cv::Point foot1(340, 600);
    cv::Point foot2(460, 600);
    cv::ellipse(canvas, foot1, axes, 0, 0, 180, color, thickness, lineType);
    cv::ellipse(canvas, foot2, axes, 0, 0, 180, color, thickness, lineType);

    // 绘制兔子的尾巴
    cv::Point tail(480, 400);
    cv::circle(canvas, tail, 20, color, thickness, lineType);

    // 显示结果
    cv::imshow("Rabbit", canvas);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}

El código crea un lienzo de 800x800 píxeles y dibuja la cabeza, los ojos, la boca, el cuerpo, las patas y la cola del conejito.

5.5 Dibujar Hada Chang'e-Versión Lite

#include <opencv2/opencv.hpp>

int main()
{
    
    
    // 创建一个800x800像素的画布
    cv::Mat canvas(800, 800, CV_8UC3, cv::Scalar(255, 255, 255));

    // 设置画笔属性
    int thickness = -1; // 填充形状
    cv::Scalar color(0, 0, 0); // 黑色
    int lineType = cv::LINE_8;

    // 绘制头部
    cv::Point head_center(400, 300);
    cv::circle(canvas, head_center, 80, color, thickness, lineType);

    // 绘制眼睛
    cv::Point eye1(360, 270);
    cv::Point eye2(440, 270);
    cv::circle(canvas, eye1, 10, color, thickness, lineType);
    cv::circle(canvas, eye2, 10, color, thickness, lineType);

    // 绘制嘴巴
    cv::Point mouth_center(400, 330);
    cv::Size axes(30, 30);
    cv::ellipse(canvas, mouth_center, axes, 0, 0, 180, color, thickness, lineType);

    // 绘制身体
    cv::Point body_top(400, 380);
    cv::Point body_bottom(400, 550);
    cv::line(canvas, body_top, body_bottom, color, 2, lineType);

    // 绘制衣裙
    cv::Point skirt_top(370, 550);
    cv::Point skirt_bottom(430, 700);
    cv::line(canvas, body_bottom, skirt_top, color, 2, lineType);
    cv::rectangle(canvas, cv::Rect(350, 570, 100, 130), color, thickness, lineType);

    // 绘制左手
    cv::Point hand1_start(400, 420);
    cv::Point hand1_end(320, 500);
    cv::line(canvas, hand1_start, hand1_end, color, 2, lineType);

    // 绘制右手
    cv::Point hand2_start(400, 420);
    cv::Point hand2_end(480, 500);
    cv::line(canvas, hand2_start, hand2_end, color, 2, lineType);

    // 绘制发髻
    cv::Point hair_top(400, 200);
    cv::Size hair_axes(80, 40);
    cv::ellipse(canvas, hair_top, hair_axes, 0, 180, 360, color, thickness, lineType);

    // 绘制发丝
    cv::Point hair1_start(400, 160);
    cv::Point hair1_end(320, 220);
    cv::line(canvas, hair1_start, hair1_end, color, 2, lineType);

    cv::Point hair2_start(400, 160);
    cv::Point hair2_end(480, 220);
    cv::line(canvas, hair2_start, hair2_end, color, 2, lineType);

    // 显示结果
    cv::imshow("Chang'e", canvas);
    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}


Se creó un lienzo de 800x800 píxeles y se dibujaron la cabeza, los ojos, la boca, el cuerpo, las manos, el vestido y el moño del Hada Chang'e.

6. Resumen

El Festival del Medio Otoño es uno de los festivales más importantes de la cultura tradicional china, y utilizar OpenCV para dibujar exquisitas imágenes de pasteles de luna y conejos de jade es un movimiento innovador que combina tradición y tecnología. A través de las potentes funciones de OpenCV, se pueden mostrar efectos visuales únicos, dando un nuevo encanto a los elementos tradicionales. Al mismo tiempo, esta es también una expresión única del Festival del Medio Otoño, que permite a todos sentir la sorpresa y la diversión que nos brinda la tecnología moderna mientras prueban pasteles de luna y admiran la luna.

Ya sea que sea un desarrollador profesional o un entusiasta común, aprender y dominar OpenCV puede dar rienda suelta a su imaginación y creatividad y crear sus propios trabajos exquisitos. En este Festival especial del Medio Otoño, con la ayuda de la magia de OpenCV, puedes sentir el encanto de la cultura tradicional y el poder de la tecnología moderna en el proceso de elaboración de pasteles de luna y conejos de jade. Utilice la creatividad y la tecnología para agregar más alegría y bendiciones a este maravilloso festival.

De antemano ----> ¡Les deseo a todos un feliz Festival del Medio Otoño y una reunión para aquellos bajo la luna llena!

Supongo que te gusta

Origin blog.csdn.net/xiaolong1126626497/article/details/132874507
Recomendado
Clasificación