「中秋来袭」没想到,用OpenCV竟能画出这么漂亮的月饼「附源码」

news2024/11/25 19:42:38

一、前言

中秋佳节即将来临,作为传统的中国节日之一,人们除了品尝美味的月饼、赏月外,还喜欢通过绘画来表达对这个节日的喜悦和祝福。而如今,随着科技的不断发展,竟然可以借助计算机视觉库OpenCV来绘制精美的月饼和可爱的玉兔图像,真是令人大开眼界。

OpenCV,全称为Open Source Computer Vision Library,是一个广泛应用于计算机视觉领域的开源库。它提供了许多强大的图像处理和计算机视觉函数,为开发者提供了丰富的工具和功能,使得实现各种图像操作变得相对容易。其灵活性和高效性受到了广大开发者的青睐。

在中秋节这样一个特殊的时刻,使用OpenCV来绘制月饼和玉兔的图像,不仅能够展示对传统文化的尊重与承托,更能结合现代技术的力量,创造出独特而精美的作品。通过OpenCV,可以绘制出具有浓厚节日氛围的月饼,无论是其光滑的外表还是凹凸不平的纹理,都能栩栩如生地展现在面前。同时,使用OpenCV绘制玉兔的图像,可以展现出可爱的卡通风格,将传统元素与时尚潮流相结合,给人耳目一新的感觉。

除了绘制月饼和玉兔,OpenCV还提供了丰富的绘图函数,例如绘制基本几何形状、线条和文字等功能,为提供了广泛的创作空间。通过调用这些函数,可以轻松实现各种绘图需求,并为自己的作品增添独特的视觉效果。

在使用OpenCV时,首先需要安装相应的库文件,并熟悉其使用方法。通过学习OpenCV的基本操作和函数调用,能够更好地利用这个强大的工具来实现自己的创意。无论是专业的计算机视觉开发者还是对图像处理有兴趣的初学者,掌握OpenCV都是一个不错的选择。

今年中秋节,不妨尝试一下用OpenCV来绘制精美的月饼和可爱的玉兔图像,感受传统文化与现代技术的碰撞。用画笔在计算机屏幕上挥洒,定格下这美好的瞬间,借助OpenCV的力量,一起迎接中秋佳节的到来。

这是加载图片显示的理想效果图。
image-20230913175620586

image-20230913175512032

二、绘制样图展示

image-20230913175222845

image-20230913175457441

image-20230913175725373

image-20230913175752185

三、OpenCV安装

3.1 OpenCV下载

OpenCV下载地址:https://opencv.org/releases/page/3/

目前最新的版本是4.3,那么就下载最新的版本。

image-20230906101920240

image-20230906102004369

下载下来是一个exe文件,双击就可以安装,实际就是解压,可以选择解压的路径,解压出来的文件包含源文件、库文件一大堆,比较大,可以直接放在一个固定的目录,后面程序里直接填路径来调用即可。 这个下载下来的库文件里只包含了X64的库,适用于MSVS 64位编译器。

image-20230906102712398

解压完成。

image-20230906103311462

解压后在build目录下看到有VC14和VC15的目录。这表示什么含义呢?

OpenCV VC14和VC15的区别在于它们所使用的编译器版本不同。VC14使用的是Visual Studio 2015的编译器,而VC15使用的是Visual Studio 2017的编译器。这意味着VC15可以利用更先进的编译器技术,从而提高代码的性能和效率。此外,VC15还支持更多的C++11和C++14特性,使得开发更加方便和灵活。

image-20230906103633870

3.2 VS2022环境

我这里介绍下我用的环境安装过程。 所有版本的VS都可以的,OpenCV只是个第三方库,哪里调用都行。

我当前环境是在Windows下,IDE用的是地表最强IDEVS2022。

下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/

image-20230913173131481

因为我这里只需要用到C++和C语言编程,那么安装的时候可以自己选择需要安装的包。

image-20230913173258088

安装好之后,创建项目。

image-20230913173330580

image-20230913173349914

3.3 新建工程

这是创建好的空工程,我写了一段OpenCV的代码。

image-20230913173536785

工程创建好之后需要添加OpenCV头文件的引用和OpenCV库文件的引用。

点击这个属性。

image-20230913173632169

第一步在C++、常规 选项里添加用到的OpenCV头文件路径。

image-20230913173709390

这个路径具体在哪里,要看自己的OpenCV安装路径。

image-20230913173753881

为了方便大家粘贴,我这里贴出来。

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

第二步就是设置库文件的路径。 在链接器-输入 选项里,添加依赖选项。

image-20230913173957033

这个库在哪里,根据自己OpenCV解压的路径进行填。

image-20230913174030657

这是我的路径:

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

3.4 运行库的拷贝

如果写好了OpenCV代码,直接按下Ctrl + F5 运行程序,如果第一次运行,会报错。

提示如下:

image-20230913174225139

这个提示是告诉我们,程序运行时找不到OpenCV的运行库。 只要使用了第三方库都需要知道这一点,运行的时候需要把用到的库拷贝到生成的exe同级目录下。

把OpenCV解压目录下的opencv_world430.dll文件拷贝到编译出来的exe运行同级目录下。 否则程序运行因为找不到库而导致异常结束。

image-20230912102245746

拷贝到这里。

image-20230913174403148

再次运行,程序就正常的运行了。

image-20230913175414887

四、OpenCV绘图函数介绍

OpenCV提供了一系列用于图像处理和绘图的函数,其中包括一些常用的绘图函数。下面是其中一部分常用的绘图函数:

4.1 cv::line:绘制一条直线

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);

参数说明:

  • img:要绘制直线的图像。
  • pt1:直线的起点坐标。
  • pt2:直线的终点坐标。
  • color:直线的颜色。
  • thickness:直线的线宽,默认为1。
  • lineType:直线的类型,默认为8连通线(cv::LINE_8)。
  • shift:坐标的小数位数,默认为0。

4.2 cv::rectangle:绘制一个矩形

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

参数说明:

  • img:要绘制矩形的图像。
  • rect:矩形的大小和位置信息,即左上角坐标和宽、高。
  • color:矩形的颜色。
  • thickness:矩形的线宽,默认为1。
  • lineType:矩形的类型,默认为8连通线(cv::LINE_8)。
  • shift:坐标的小数位数,默认为0。

4.3 cv::circle:绘制一个圆形

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);

参数说明:

  • img:要绘制圆形的图像。
  • center:圆心的坐标。
  • radius:圆形的半径。
  • color:圆形的颜色。
  • thickness:圆形的线宽,默认为1。
  • lineType:圆形的类型,默认为8连通线(cv::LINE_8)。
  • shift:坐标的小数位数,默认为0。

4.4 cv::ellipse:绘制一个椭圆形

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);

参数说明:

  • img:要绘制椭圆形的图像。
  • center:椭圆中心的坐标。
  • axes:椭圆的长轴和短轴大小。
  • angle:椭圆的旋转角度,以度为单位。
  • startAngle:椭圆的起始角度,以度为单位。
  • endAngle:椭圆的结束角度,以度为单位。
  • color:椭圆的颜色。
  • thickness:椭圆的线宽,默认为1。
  • lineType:椭圆的类型,默认为8连通线(cv::LINE_8)。
  • shift:坐标的小数位数,默认为0。

4.5 cv::putText:在图像中绘制文本

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);

参数说明:

  • img:要在其上绘制文本的图像。
  • text:要绘制的文本内容。
  • org:文本的左下角坐标。
  • fontFace:字体的类型。
  • fontScale:字体的缩放比例。
  • color:字体的颜色。
  • thickness:字体的线宽,默认为1。
  • lineType:字体的类型,默认为8连通线(cv::LINE_8)。
  • bottomLeftOrigin:是否以左下角为原点,默认为false,即以左上角为原点。

4.6 cv::polylines:绘制多边形的边界。

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);

参数说明:

  • img:要绘制多边形的图像。
  • pts:多边形每个顶点的坐标数组。
  • npts:多边形每个闭合环的顶点数量数组。
  • ncontours:多边形的数量。
  • isClosed:是否闭合多边形。
  • color:多边形的颜色。
  • thickness:多边形边界的线宽,默认为1。
  • lineType:多边形的类型,默认为8连通线(cv::LINE_8)。
  • shift:坐标的小数位数,默认为0。

4.7 cv::fillPoly:填充多边形内部。

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());

参数说明:

  • img:要填充多边形的图像。
  • pts:多边形每个顶点的坐标数组的指针。
  • npts:多边形每个闭合环的顶点数量数组。
  • ncontours:多边形的数量。
  • color:填充的颜色。
  • lineType:多边形的类型,默认为8连通线(cv::LINE_8)。
  • shift:坐标的小数位数,默认为0。
  • offset:填充多边形时的偏移量。

4.8 cv::polylines 和 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);

这段示例代码创建了一个白色的图像,并在图像上绘制了一个红色边界的矩形,同时填充了矩形的内部为绿色。通过使用 cv::polylinescv::fillPoly 函数,可以绘制更复杂的多边形形状和填充效果。

五、月饼、玉兔绘图代码

5.1 最简单的月饼

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

代码里创建了一个大小为400x400像素的黑色背景图像,使用cv::circle()函数绘制一个圆形的棕色月饼。通过指定圆心坐标、半径和颜色来绘制圆形月饼。最后,在窗口中显示绘制的月饼。

5.2 最简单的玉兔

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

代码l里创建了一个大小为400x400像素的黑色背景图像,使用cv::ellipse()cv::circle()函数来绘制兔子的身体、内耳朵、眼睛、嘴巴和鼻子。通过指定中心点、尺寸、角度和颜色等参数来绘制不同的部分。最后,在窗口中显示绘制的兔子。

5.3 绘制带花纹轮廓的月饼

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

代码创建了一个800x800像素的画布,使用OpenCV的函数和方法来绘制太阳花图案。cv::line()绘制直线,cv::circle()绘制圆,cv::ellipse()绘制半圆和圆弧。

5.4 绘制兔子

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

代码创建了一个800x800像素的画布,绘制了兔子的头部、眼睛、嘴巴、身体、脚和尾巴。

5.5 绘制嫦娥仙子-精简版

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


创建了一个800x800像素的画布,绘制了嫦娥仙子的头部、眼睛、嘴巴、身体、手、衣裙和发髻。

六、总结

中秋节是中国传统文化中重要的节日之一,而使用OpenCV绘制精美的月饼和玉兔图像,则是将传统与科技相结合的创新之举。通过OpenCV的强大功能,可以展现出独特的视觉效果,让传统元素焕发出新的魅力。同时,这也是对中秋佳节的一种独特表达方式,让大家在品味月饼和赏月的同时,感受到现代科技为我们带来的惊喜和乐趣。

无论是专业开发者还是普通爱好者,学习和掌握OpenCV都能够更好地发挥想象力和创造力,创作出属于自己的精美作品。在这个特殊的中秋节,借助OpenCV的魔力,在绘制月饼和玉兔的过程中,感受传统文化的魅力和现代科技的力量。用创意和技术,为这个美好的节日增添更多的喜悦和祝福。

提前----> 祝大家中秋快乐,月圆人团圆!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter的oktoast插件详解

文章目录 简介详细介绍安装和导入导入在MaterialApp外面套一层OKToast组件为什么是包住MaterialApp&#xff1f; 显示Toast消息&#xff1a; 高级使用Toast位置Toast持续时间自定义Toast样式高级用法 使用场景提示消息表单验证操作反馈网络请求状态调试信息小结 总结 简介 okt…

剑指offer刷题笔记 开端

剑指offer刷题笔记 文章目录 剑指offer刷题笔记注意内容 时间复杂度C 语法知识补充&#xff1a;优先级new 和 delete树的遍历 算法模板string类判断字符串为空归并递归整数二分算法模板 注意内容 map 是 O(logn) &#xff0c;底层实现是平衡树&#xff0c;unorder_map 是 O(1)…

Thinkphp6 配置并使用redis图文详解 小皮面板

这篇文章主要介绍了Thinkphp6 配置并使用redis的方法,结合实例形式详细分析了Redis的安装、配置以及thinkphp6操作Redis的基本技巧,需要的朋友可以参考下 一、安装redis ThinkPHP内置支持的缓存类型包括file、memcache、wincache、sqlite。ThinkPHP默认使用自带的采用think\Ca…

zabbix监控多实例redis

Zabbix监控多实例Redis 软件名称软件版本Zabbix Server6.0.17Zabbix Agent5.4.1Redis6.2.10 Zabbix客户端配置 编辑自动发现脚本 vim /usr/local/zabbix/scripts/redis_discovery.sh #!/bin/bash #Fucation:redis low-level discovery #Script_name redis_discovery.sh red…

软件外包开发原型图工具

国内有一些原型图管理工具&#xff0c;这些工具旨在帮助团队创建、协作和管理应用程序的原型图。以下是一些国内的原型图管理工具及其特点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.墨刀&…

学习视觉SLAM需要会些什么?

前言 SLAM是现阶段很多研究生的研究方向&#xff0c;我也是作为一个即将步入视觉SLAM的研究生&#xff0c;网上对于SLAM的介绍很多&#xff0c;但很少有人完整系统的告诉你学习视觉SLAM该有那些基础&#xff0c;那么此贴将告诉你学习SLAM你要有那些方面的基础。 文章目录 前言…

在Linux上利用宝塔面板搭建网站,并通过内网穿透方便地实现公网访问

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

大数据课程M2——ELK的ELASTICSEARCH概述

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解ELK的ELASTICSEARCH概括; ⚪ 掌握ELK的ELASTICSEARCH核心概念; 一、ELASTICSEARCH概括 1. ES安装和启动 注意:如果使用达内云主机,无需安装es,直接配置yml启动即可。 1. 安装 下…

普中51-蜂鸣器实验

蜂鸣器实验 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成&#xff0c;当接通电源后&#xff08;1.5~15V 直流工 作电压&#xff09;&#xff0c;多谐振荡…

量化INT8模型报错记录及解决方案

基于C将onnx 模型 转 TensorRT 模型&#xff08;int8&#xff09; 部分命令如下&#xff1a; config->setFlag(nvinfer1::BuilderFlag::kINT8); ICudaEngine* engine builder->buildEngineWithConfig(*network, *config); 出现以下报错&#xff1a; Error Code 4: I…

使用凌鲨进行聚合搜索

作为研发人员&#xff0c;我们经常需要在多个来源之间查找信息&#xff0c;以便进行研发工作。除了常用的搜索引擎如百度和必应之外&#xff0c;我们还需要查阅各种代码文档和依赖包等资源。这些资源通常分散在各个网站和文档库中&#xff0c;需要花费一定的时间和精力才能找到…

闲置的固定资产怎么账务管理

对于那些被遗忘或闲置的固定资产&#xff0c;如何进行有效的账务管理&#xff0c;以实现资产的最大价值&#xff0c;却往往被忽视。本文旨在探讨这一主题&#xff0c;并提供一些创新的策略和实践方法。  需要认识到&#xff0c;闲置的固定资产并非仅仅是财务问题。它们可能代…

【css | loading】各种简单的loading特效

先看一下简单的效果图 线上预览 https://code.juejin.cn/pen/7278511766991339579 代码 HTML <!-- / 1 --><section><div class"sk-rotating-plane"></div></section><!-- / 2 --><section><div class"sk-doub…

OOM分析实战

OOM分析&实战 OOM分析&实战引言&#xff1a;一、JVM内存结构二、JVM OOM错误情况三、实践案例一案例二案例三 四、总结五、分析工具推荐六、参考文献 OOM分析&实战 引言&#xff1a; 在Java开发中&#xff0c;随着应用程序变得越来越复杂&#xff0c;内存管理问题…

运动耳机哪个好、最好的运动牌子排名榜

很多朋友喜欢在运动的时候听音乐&#xff0c;为此&#xff0c;他们会为自己配备一款蓝牙耳机或是运动耳机&#xff0c;可以在运动的时候随身听&#xff0c;可是&#xff0c;一些人在挑选耳机的时候犯难了&#xff0c;市面上那么多运动耳机&#xff0c;运动耳机哪个好&#xff1…

【黄色手套22】6话:构造数据类型

目录 序言&#xff1a; 结构体&#xff1a; 结构体数组&#xff1a; 结构体数组的定义和引用 &#xff1a; 使用关键字typedef自定义类型名&#xff1a; 使用typedef语句为数组类型取别名&#xff1a; 结构体所占内存的大小&#xff1a; 结构体的嵌套&#xff1a; 共用体…

内网穿透——Windows搭建服务器

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 在现代五花八门的网络应用场景中&#xff0c;观看视频绝对是主力应用场景之一&…

vant 按需导入 vue2

vant 按需导入 vue2 1、通过npm安装 # Vue 3 项目&#xff0c;安装最新版 Vant&#xff1a; npm i vant -S# Vue 2 项目&#xff0c;安装 Vant 2&#xff1a; npm i vantlatest-v2 -S2、自动按需引入组件 babel-plugin-import 是一款 babel 插件&#xff0c;它会在编译过程中…

(Qt+Vs编译环境)报错:引发异常,写入访问权限冲突

起因&#xff1a;在一本Qt的书上看到使用这样的语句 &#xff0c;专门把原有的VS项目模板生成的代码做了修改&#xff0c;如下图所示&#xff1a; UI::MainWindow *ui; ui->setupUI(this); ui->lineEdit->Text(); 然后就开始引发异常&#xff0c;提示访问权限冲突。…

swaggo使用教程

安装与初始化 安装插件 go install github.com/swaggo/swag/cmd/swaglatest 安装依赖 go get -u github.com/swaggo/swag/cmd/swag 在包含main.go文件的项目根目录运行swag init。这将会解析注释并生成需要的文件&#xff08;docs文件夹和docs/docs.go&#xff09;。 swa…