OpenCV 入门(一) —— OpenCV 基础

OpenCV 入门系列:

OpenCV 入门(一)—— OpenCV 基础
OpenCV 入门(二)—— 车牌定位
OpenCV 入门(三)—— 车牌筛选
OpenCV 入门(四)—— 车牌号识别
OpenCV 入门(五)—— 人脸识别模型训练与 Windows 下的人脸识别
OpenCV 入门(六)—— Android 下的人脸识别
OpenCV 入门(七)—— 身份证识别

1、OpenCV 简介

OpenCV(Open Source Computer Vision Library)是一个基于 BSD 许可开源发行的跨平台的计算机视觉库。可用于开发实时的图像处理、计算机视觉以及模式识别程序。由英特尔公司发起并参与开发,以 BSD 许可证授权发行,可以在商业和研究领域中免费使用。英特尔公司的 IPP 可以对 OpenCV 进行加速处理。

OpenCV 拥有 C++,Python 和 Java 接口,并且支持 Windows, Linux, Mac OS, iOS 和 Android 系统。OpenCV 实现了图像处理和计算机视觉方面的很多通用算法,它具有如下模块:

模块功能
Core核心基础模块,定义了被所有其他模块和基本数据结构(包括重要的多维数组 Mat)使用的基本函数、底层数据结构和算法函数
Imgproc图像处理模块,包括:滤波、高斯模糊、形态学处理、几何变换、颜色空间转换及直方图计算等
Highgui高层用户交互模块,包括:GUI、图像与视频 I/O 等
Video视频分析,运动分析及目标跟踪
Calib3d3D 模块,包括:摄像机标定、立体匹配、3D 重建等
Features2d二维特征检测与描述模块,包括:图像特征检测、描述、匹配等
Objdetect目标检测模块,如:人脸检测等
MI机器学习模块,包括:支持向量机、神经网络等
Flann最近邻开源库。包含一系列查找算法,自动选取最快算法的机制
Imgcodecs图像编解码模块,图像文件的读写操作
Photo图像计算(处理)模块,图像修复及去噪
Shape形状匹配算法模块。描述形状、比较形状
Stitching图像拼接
Superres超分辨率模块
Videoio视频读写模块,视频文件包括摄像头的输入
Videostab解决拍摄的视频稳定
Dnn深度神经网络
contrib可以引入额外模块

OpenCV 常用链接:

  • OpenCV 官网
  • OpenCV GitHub 主页
  • OpenCV 中国 Wiki 论坛

2、OpenCV 与人工智能

计算机内部都是 0101,它是如何像人类那样认识判定事务的。简单来讲是通过模式匹配定位关键点。比如找人的眼睛,它的二进制排列方式是与其他事务不同的,将这种近似于眼睛的排列方式进行匹配即可定位到人的眼睛。此外,OpenCV 还可以用于图像建模、人工智能。

人类对于事务的认识源于从小到大的耳濡目染,计算机也是一样的,需要通过大量样本与素材的学习与训练,后续碰到未知元素时,将其套入到已有的模型中,从而进行判断与认知,这就是学习的过程,人工智能的本质就是学习。

线性回归是人工智能的基础,也是 OpenCV 分类算法最重要的一个章节。通过一个例子解释,X1 表示业绩,X2 表示工作表现,二者被称为特征。Y 轴表示工资,也就是目标。很容易能得出 X 与 Y 的关系是:

  • 业绩越高、工作表现越好,工资越高(Y 随着 X1 和 X2 的升高而升高)
  • 业绩越低、工作表现越差,工资越低(Y 随着 X1 和 X2 的降低而降低)

图像的特征(Feature)是图像上最具代表性的一些点。所谓最具代表性,就是说这些点包含了图像表述的大部分信息。即使旋转、缩放,甚至调整图像亮度,这些点仍然稳定地存在,不会丢失。找出这些点,就相当于确定了这张图像,它们可以用于匹配、识别等有意义的工作。

通常来说,角点容易成为特征点。角点是指图案中处于角落的点,这些点附近像素值变化剧烈,因而容易被检测出。

通过众多样本数据可以拟合一个平面(所有点到平面距离的方差最短):

在这里插入图片描述

工资的发放情况会符合高斯分布:

2024-3-28.高斯分布示意图

人工智能的雏形就是高斯分布与拟合平面两个公式:

2024-3-28.高斯分布与拟合平面公式得到似然函数

2024-3-28.似然函数的最终解决目的

似然函数的数学模式是一个凹函数,从每个点找到最低点的过程就是学习的过程。

2024-3-28.机器学习之向量机

在机器学习中,支持向量机是在分类与回归分析中分析数据的监督式学习模型与相关的学习算法。假设我们要进行一个图像分类任务,当前有一系列标签:汽车、狗、猫、飞机……

一辆汽车的图像在计算机中可以表现为一个三维数组:

2024-3-28.汽车的图像在计算机中的表示

机器学习需要数据,让机器能够准确的识别一辆车,需要大概 5 万条数据。

识别一辆汽车,需先进行线性分类:

2024-3-28.OpenCV线性分类

将一个图像分成多个网格,每个网格有权重和评分,将所有网格的评分乘以权重后累加,哪个事务得分值越高,是该种事务的可能性就越大:

2024-3-28.OpenCV分区评分

学习率:

2024-3-28.学习率

3、OpenCV 的配置

本节会介绍 OpenCV 在不同 IDE 中的通用配置。虽然是以 Android 为主的文章,但是由于在 Windows 的 IDE 上通常可以更快的看到图像的处理效果(比如 Windows 启动摄像头只需要调用一个方法,但是 Android 就要用 Camera、Camera2 或者 CameraX 多写一些代码才可以,并且还需要经过打包 -> 编译 -> 安装这套流程才能验证代码效果),因此有时我们会将 OpenCV 处理图像的代码先在 Windows 上实现证明效果无误后,再移植到 Android 上。所以我们也会介绍在 Windows IDE 中如何配置与开发。

官网找到想要使用的版本,比如 4.1.0,下载 Windows 和 Android 两个版本的 SDK:

2024-3-28.OpenCV下载

3.1 Visual Studio 配置

我们首先打开 OpenCV Windows 的 exe 执行文件,它不会安装 OpenCV 的程序,而是将其解压到指定目录中。解压后的 build 目录下有多个目录,其中 include 头文件所在目录,lib 是库文件目录:

2024-5-2.OpenCV Windows版本目录

我们使用 Visual Studio 创建一个 CMake 项目,在次级的 CMakeLists.txt 中导入头文件和库文件目录,并让动态库文件 opencv_world410d.dll 链接到目标库中:

cmake_minimum_required (VERSION 3.8)

# 导入头文件目录,注意路径用斜杠隔开而不是反斜杠
include_directories("G:/Tools/OpenCV/build/include")

# 导入库文件目录
link_directories("G:/Tools/OpenCV/build/x64/vc15/lib")

# 将源代码添加到此项目的可执行文件。
add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")

# 将 lib 下的动态库文件 opencv_world410d 链接到目标库
target_link_libraries(CMakeProject1 opencv_world410d)

这里点击运行应该可以成功编译,并在项目的 /out/build/x64-Debug/CMakeProject1 目录下生成可执行文件:

2024-3-28.VS配置1

为了项目能正常使用 OpenCV 的函数,将动态库 opencv_world410d.dll 拷贝到该目录下(或者将该文件添加到环境变量中也可以),然后在源文件中开始使用 OpenCV 展示一张图片:

#include "CMakeProject1.h"
#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

void test1() 
{
	// 读取一张图片
	Mat img = imread("C:/Users/69129/Desktop/bg.png");
	// 显示图片
	imshow("img", img);
	// 将图片进行灰度处理
	cvtColor(img, img, COLOR_BGR2GRAY);
	// 在 img2 窗口中显示灰度处理后的图片
	imshow("img2", img);
	// 等待键入,避免程序直接运行结束使得图片一闪而过
	waitKey();
}

int main()
{
	test1();
	return 0;
}

也可以使用 OpenCV 驱动摄像头进行录制:

void test2()
{
	// 打开摄像头
	VideoCapture capture(0);
	if (!capture.isOpened()) {
		cout << "打开摄像头失败!" << endl;
		return;
	}
	Mat p;
	while (true)
	{
		// 捕捉的图像传入矩阵 p
		capture >> p;
		if (p.empty()) {
			cout << "读取摄像头数据失败!" << endl;
			return;
		}
		imshow("img", p);
		// ESC 退出
		if (waitKey(30) == 27) {
			break;
		}
	}
}

int main()
{
	test2();
	return 0;
}

3.2 CLion 配置

CLion 的配置要比同样是 Windows 平台的 Visual Studio 要复杂一些。因为 OpenCV 官方提供的动态库是 Visual Studio 编译的版本,CLion 不能直接用,只能自己通过编译 OpenCV 的源码获取动态库。

编译 OpenCV 源码需要准备以下工具:

  1. 编译工具:MinGW 或者 TDM-GCC,安装后将 bin 目录添加到环境变量中(注意路径中不要有空格)
  2. 构建工具:CMake
  3. 源码:Windows 版本的 SDK 的 source 目录内是源码

在 CMake 安装目录的 bin 目录下找到 cmake-gui.exe 并打开:

2024-4-25.OpenCV源码编译1

打开后执行如下三步:

2024-4-24.CMake编译OpenCV1

点击 Configure 后要配置生成器:

2024-4-25.OpenCV源码编译3

一般情况下选择第一项,使用默认本地编译器即可。我们这里选择第二项手动指定,点击 Next 会让你指定 C 和 C++ 编译器:

2024-4-25.OpenCV源码编译4

我们这里使用 TDM-GCC,C 的编译器指定为 gcc,C++ 的编译器指定为 g++。点击 Finish 后开始配置,如果看到 Configuring done 字样表示配置成功。

在开始编译之前,先在 search 框内依次输入 test、java、python 并取消搜索结果中已经被勾选的项目:

2024-4-25.OpenCV源码编译5

因为我们使用的是 C++ 接口,用不到这些项目,取消勾选可以缩短编译时间。

生成成功会在 mingw_build 目录下生成如下文件:

2024-4-25.OpenCV源码编译6

在该目录中打开 cmd 执行编译命令:

# -j 表示启动几个线程进行编译
mingw32-make -j8

编译过程中可能会遇到如下错误:

  1. 编译 directx.cpp 时报错:

    modules\core\CMakeFiles\opencv_core.dir\build.make:417: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/src/directx.cpp.obj' failed
    mingw32-make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/src/directx.cpp.obj] Error 1
    mingw32-make[2]: *** Waiting for unfinished jobs....
    CMakeFiles\Makefile2:1518: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed
    mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
    Makefile:164: recipe for target 'all' failed
    mingw32-make: *** [all] Error 2
    

    解决方法,在生成 CMake 文件之前,反选所有 OpenCL 相关选项重新生成:

    2024-4-25.OpenCV源码编译7

  2. 找不到 windres.exe 工具:

    [ 57%] Building RC object modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj
    'D:\Program' 不是内部或外部命令,也不是可运行的程序
    或批处理文件。
    D:\Program Files\TDM-GCC-64\bin\windres.exe: preprocessing failed.
    modules\core\CMakeFiles\opencv_core.dir\build.make:1510: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj' failed
    mingw32-make[2]: *** [modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
    mingw32-make[2]: *** Waiting for unfinished jobs....
    CMakeFiles\Makefile2:1518: recipe for target 'modules/core/CMakeFiles/opencv_core.dir/all' failed
    mingw32-make[1]: *** [modules/core/CMakeFiles/opencv_core.dir/all] Error 2
    Makefile:164: recipe for target 'all' failed
    mingw32-make: *** [all] Error 2
    

    这是由于我们配置的编译工具路径中有空格导致没有找到 windres.exe,需要将 TDM-GCC 安装到一个没有空格的路径中重新添加环境变量,重新在 CMake 中进行配置、生成、编译过程。这也是为什么我们前面提到编译工具安装路径不能有空格的原因

如果编译成功,再执行安装命令:

mingw32-make install

会在 mingw_build 目录下再生成一个 install 目录,内容如下:

2024-4-25.OpenCV源码编译8

最后在 CLion 的 CMakeLists.txt 文件中添加如下配置:

# 创建 OpenCV_DIR 变量
set(OpenCV_DIR G:/Tools/opencv410/mingw_build/install)

# 查找并加载 OpenCV_DIR 地址下的 OpenCVConfig.cmake 文件
find_package(OpenCV REQUIRED)

# 包含头文件目录
include_directories(${OpenCV_INCLUDE_DIRS})

# 将库文件链接到项目中
target_link_libraries(OpenCV_CLion ${OpenCV_LIBS})

这个配置方式在 /mingw_build/install/OpenCVConfig.cmake 中有所介绍:

#  Usage from an external project:
#    In your CMakeLists.txt, add these lines:
#
#    FIND_PACKAGE(OpenCV REQUIRED)
#    TARGET_LINK_LIBRARIES(MY_TARGET_NAME ${OpenCV_LIBS})
#
#    Or you can search for specific OpenCV modules:
#
#    FIND_PACKAGE(OpenCV REQUIRED core imgcodecs)
#
#    If the module is found then OPENCV_<MODULE>_FOUND is set to TRUE.
#
#    This file will define the following variables:
#      - OpenCV_LIBS                     : The list of libraries to link against.
#      - OpenCV_INCLUDE_DIRS             : The OpenCV include directories.
#      - OpenCV_COMPUTE_CAPABILITIES     : The version of compute capability
#      - OpenCV_VERSION                  : The version of this OpenCV build: "4.1.0"
#      - OpenCV_VERSION_MAJOR            : Major version part of OpenCV_VERSION: "4"
#      - OpenCV_VERSION_MINOR            : Minor version part of OpenCV_VERSION: "1"
#      - OpenCV_VERSION_PATCH            : Patch version part of OpenCV_VERSION: "0"
#      - OpenCV_VERSION_STATUS           : Development status of this build: ""

FIND_PACKAGE() 指示要寻找 OpenCV,REQUIRED 用于确保在找不到指定的包时发生错误并停止构建过程。

包含头文件使用的 ${OpenCV_INCLUDE_DIRS} 和链接库文件时所使用的 ${OpenCV_LIBS} 都是这个 CMake 文件生成的变量,用 message 打印变量值可以发现:

-- G:/Tools/opencv410/mingw_build/install/include
-- opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio

${OpenCV_INCLUDE_DIRS} 就是 install 目录下的 include 文件夹,${OpenCV_LIBS} 则是 install/x64/mingw/bin 目录下的动态库:

2024-4-25.OpenCV Windows版编译得到的动态库

当然一切的前提都是要指定 OpenCV 的路径,如果没有指定或者指定错误,会有相关的提示:

2024-4-25.OpenCV Windows编译指定路径

运行代码可能会发生崩溃,此时可以做如下尝试:

  1. 将前面编译 OpenCV 的编译工具,比如 TDM-GCC 添加到 Toolchains 中,并指定 Build Tool 为编译 OpenCV 时使用的 ming32-make:
    2024-4-25.CLion配置OpenCV0
  2. 点击 Edit Configurations:
    2024-4-25.CLion配置OpenCV1
    将编译 OpenCV 并安装后的 install 目录下的 bin 目录添加到 Environment variables 和 Working directory 中:
    2024-4-25.CLion配置OpenCV2

3.3 Android AS 配置

解压 OpenCV 的 Android SDK,在如图所示的目录中拿到动态库文件 libopencv_java4.so:

2024-3-28.OpenCV Android端配置

至于头文件,Android SDK 中并没有提供,因此我们要使用 Windows 版本提供的通用头文件:

2024-3-28.OpenCV通用头文件

在 AS 模块的 CMakeLists.txt 中引入头文件和库文件:

cmake_minimum_required(VERSION 3.22.1)

project("opencv")

# 导入头文件
include_directories(${CMAKE_SOURCE_DIR}/opencv/include)

# 导入库文件
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/libs/${CMAKE_ANDROID_ARCH_ABI}")


add_library(
        opencv
        SHARED
        native-lib.cpp)

target_link_libraries(
        opencv
        log
        opencv_java4 # 链接 OpenCV 动态库
        android # 如果要在 Native 层通过 ANativeWindow 渲染,需要链接 libandroid
)

在模块的 build.gradle 中添加 CPU 架构类型的过滤:

android {
	...
    defaultConfig {
        ...
        externalNativeBuild {
            cmake {
                abiFilters 'armeabi-v7a'
            }
        }
        ndk {
            abiFilters 'armeabi-v7a'
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs("src/main/cpp/opencv/libs")
        }
    }
    ...
}

这里要特意说一下 sourceSets 的配置。由于 Android 项目的库文件通常位于 jniLibs 目录下,并且 Gradle 默认会将该目录下的库文件复制到 APK 中的正确位置。这种默认行为可以适用于大多数情况。但是现在我们将库文件放在了 /src/main/cpp/opencv/libs/ 目录下:

2024-3-29.OpenCV AS配置目录

此时需要显式地配置 Gradle 来处理库文件的复制和加载,就像上面那样在 sourceSets 中指定 jniLibs 的路径,以保证库可以被正确地复制到 APK 中并在运行时加载。否则在执行 System.loadLibrary() 去加载 Native 的动态库时,会抛出异常说找不到 OpenCV 的动态库 libopencv_java4.so:


此外,如果运行 Demo 时抛出异常:

FATAL EXCEPTION: main
java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found

由于 libopencv_java.so 依赖 STL 标准库(比如 std、malloc() 等等),并且依赖的是标准库的动态库 libc++_shared.so。而 CMake 构建 C++ 运行时的默认值是 libc++_static.a,因此你需要在 build.gradle 中增加一个配置参数:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                cppFlags ""
                abiFilters 'armeabi-v7a'
                // 指定 CMake 使用 c++ 标准动态库 libc++_shared.so
                arguments '-DANDROID_STL=c++_shared'
            }
        }
    }
}

当然,如果你的构建系统使用的是 clang,由于 clang 默认使用 c++_shared,也就不会出现上述问题:

2024-5-4.选择C++运行时

官方参考页面:C++库支持。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Springboot框架web开发实用功能-02

在些模块中汇总了一些web开发常用的配置和功能。 涉及的模块 springboot-common-config&#xff0c; 端口号&#xff1a;17000 Springboot框架web开发常用功能 Restful接口定义 查询参数 Data public class QueryParam {private String key;private String value; }Control…

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速

MATLAB实现杜拉德公式和凯夫公式的计算固液混合料浆临界流速: 杜拉德公式是用来计算非均质固液混合料浆在输送管中的临界速度的公式&#xff0c;具体形式为&#xff1a; uL FL (2gD / (ρ0 - ρ1))^(1/2) 其中&#xff1a; uL&#xff1a;表示料浆的临界速度&#xff0c;…

Hbase 常用shell操作

目录 1、创建表 1.1、启动HBase Shell 1.2、创建表 1.3、查看表 1.4、删除表 2、插入数据 2.1、put命令 3、查看数据 3.1、get命令 3.2、查询数据中文显示 4、更新数据 4.1、使用put来更新数据 5、删除数据 5.1、delete命令 5.2、删除指定列的数据 5.3、delete…

Pycharm debug 运行报错 (RuntimeError: cannot release un-acquired lock)

问题描述&#xff1a; 最近再跑一个 flask应用&#xff0c;Pycharm 运行没问题&#xff0c;debug断点启动时报错 如下&#xff1a; 解决方案&#xff1a; 在环境变量中增加 GEVENT_SUPPORTTrue 启动成功&#xff01;

libcity笔记:添加新模型(以RNN.py为例)

创建的新模型应该继承AbstractModel或AbstractTrafficStateModel 交通状态预测任务——>继承 AbstractTrafficStateModel类轨迹位置预测任务——>继承AbstractModel类 1 AbstractTrafficStateModel 2 RNN 2.1 构造函数 2.2 predict 2.3 calculate_loss

博客系统项目测试报告

文章目录 一.报告概要二.测试环境三.手工测试用例四.编写测试用例五.自动化测试Selenium测试项目主要特点 一.报告概要 项目概要 本项目是一个全功能的个人博客系统&#xff0c;旨在提供一个用户友好、功能全面的平台&#xff0c;允许用户注册、登录、浏览博客、查看详细内容、…

Mac跑llama.cpp过程中遇到的问题

原repo 在华为手机上安装termux、下载库&#xff1a;顺利在电脑上安装Android NDK&#xff1a;先下载Android Studio&#xff0c;再在里面下载Android SDK 安装Android Studio时&#xff0c;SDK的某些组件总是下载不成功。后来关了梯子、改了hosts&#xff0c;重新安装就成功了…

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …

Go实现树莓派控制舵机

公式说明 毫秒&#xff08;ms&#xff09;是时间的单位&#xff0c;赫兹&#xff08;Hz&#xff09;是频率的单位&#xff0c;而DutyMax通常是一个PWM&#xff08;脉冲宽度调制&#xff09;信号中表示最大占空比的值。以下是它们之间的关系和一些相关公式&#xff1a; 频率&…

【华为】路由策略小实验

【华为】软考中级-路由策略实验 实验需求拓扑配置AR1AR2需求1需求2 AR3 检验 实验需求 1、让 R3 可以学到R1的 192.168.10.0/24和192.168.20.0/24的 路由&#xff0c;不能学到192.168.30.0/24。 2、让 R1可以学到 R3 的 172.16.20.0/24和172.16.30.0/24的路由&#xff0c;不能…

opencv图像处理详细讲(二)

联通组件分析 联通组件定义&#xff1a;像素值相同&#xff0c;通过四邻域或者八邻域相互连通的像素块。 换句话说&#xff0c;就是使用四邻域或八邻域的连通性&#xff0c;遍历图像的像素&#xff0c;并确定像素值相同并且连通的像素块&#xff0c;将它们标记为一个联通组件 两…

虚拟机VM VirtualBox安装openEuler+UKUI的安装和卸载_2024

虚拟机VM VirtualBox安装openEuler ps. 建议先看最后的其他 下载openEuler openEuler官网下载 一般来说标准版就够用了 使用虚拟机VM VirtualBox安装openEuler 新建虚拟机 修改用户名密码&#xff0c;建议修改&#xff0c;虽然之后还可以通过命令行修改&#xff08;注意密…

pyecharts绘制世界动态轨迹图(v0.5.X与v1.X版本对比)

一、问题引入 pyecharts官网&#xff1a;https://pyecharts.org/#/zh-cn/intro 在使用Geo或者GeoLines绘制动态轨迹图时&#xff0c;如果所选地区是中国的省份或者城市&#xff0c;是能够匹配到对应的经纬度并且正常绘制的&#xff1b;如果所选地区涉及到其他国家或者国外城市&…

Docker-harbor

一、搭建本地私有仓库 1.1 下载Registry镜像 1.2 添加本地私有仓库配置 1.3 重启服务并运行Registry容器 1.4.容器的操作 1.4.1 拉取Nginx镜像并为镜像打标签 1.4.2 上传到私有仓库 1.4.3 列出私有仓库所有镜像 1.4.4 列出私有仓库的镜像的所有标签 1.4.5 先删除原有…

Anaconda删除虚拟环境目录pkgs和envs|conda瘦身

这个文件夹里面是专门放不同环境中的包的&#xff0c;只是没有区分环境&#xff0c;都混在一起了&#xff0c; 一般在想要删除一个虚拟环境&#xff0c;除了在命令行中输入conda remove -n your_env_name(虚拟环境名称) --all 然后在envs中删除虚拟环境的文件夹&#xff0c; 还…

企业微信hook接口协议,ipad协议http,客户群发送任务,获取要发送的客户群列表

客户群发送任务&#xff0c;获取要发送的客户群列表 参数名必选类型说明uuid是String每个实例的唯一标识&#xff0c;根据uuid操作具体企业微信 请求示例 {"uuid": "1688853790533324","id":1101292747044333637, //群发任务id"keyword…

【Unity】如何获得TMP Button下的text内容

【背景】 unity项目中使用了TMP命名空间的Button UI组件。脚本中需要获得Button下Text的内容,但是发现用TextMeshPro仍然无法获得button下的text对象。 【分析】 Hierarchy结构上看明确Button下是有Text组件的: 括号里是TMP,所以理论上用TextMeshPro类型去FindComponent…

navicat 连接 阿里云 RDS mysql 数据库

首先上官方教程连接 下面是我的实操记录 1、先输入正确的账号、密码 2、再加上数据库名称

鸢尾花分类-pytorch实现

前言 本文用pytorch实现了鸢尾花分类&#xff0c;数据不多&#xff0c;只做代码展示用&#xff0c;后续有升级版本。 代码 -*- coding: utf-8 -*- File : main.py Author: Shanmh Time : 2024/05/06 上午9:37 Function&#xff1a;import torch from sklearn import datase…

算法(C++

题目&#xff1a;螺旋矩阵&#xff08;59. 螺旋矩阵 II - 力扣&#xff08;LeetCode&#xff09;&#xff09; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&am…