OpenCV(一) —— 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){// 捕捉的图像传入矩阵 pcapture >> 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(opencvSHAREDnative-lib.cpp)target_link_libraries(opencvlogopencv_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.soarguments '-DANDROID_STL=c++_shared'}}}
}

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

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

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

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

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

相关文章

网络知识点之—QoS

QoS&#xff08;Quality of Service&#xff0c;服务质量&#xff09;指一个网络能够利用各种基础技术&#xff0c;为指定的网络通信提供更好的服务能力&#xff0c;是网络的一种安全机制&#xff0c; 是用来解决网络延迟和阻塞等问题的一种技术。QoS的保证对于容量有限的网络来…

C++11:右值引用和左值引用

1.decltype decltype可以推导出一个表达式的类型&#xff0c;可以用这个类型定义变量。 测试代码 template<class T1,class T2> void test1(T1 &a,T2 & b) {decltype(a* b) ret;cout << typeid(ret).name() << endl; } 2.范围for void test2()…

上位机图像处理和嵌入式模块部署(树莓派4b部署java环境)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 通常我们都会认为java是部署在pc服务器上面的&#xff0c;或者是用java开发android应用程序。其实不然&#xff0c;java也可以部署在嵌入式开发板子…

前端工程化03-贝壳找房项目案例JavaScript常用的js库

4、项目实战&#xff08;贝壳找房&#xff09; 这个项目包含&#xff0c;基本的ajax请求调用,内容的渲染&#xff0c;防抖节流的基本使用&#xff0c;ajax请求工具类的封装 4.1、项目的接口文档 下述接口文档&#xff1a; 简述内容baseURL&#xff1a;http://123.207.32.32…

ESP32 烧录固件

第一步&#xff1a;下载固件 git clone --recursive https://github.com/espressif/esp-at.git 第二步&#xff1a;执行编译 在该目录执行 python build.py install 如图&#xff1a; 第三步&#xff1a;选择芯片 输入2 第四步&#xff1a;选择固件 输入1 第五步&#…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时&#xff0c;报如上图所示错误&#xff0c;其中一条是&#xff1a; ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…

银行ETL-监管报送

1104报表 1104报表主要包括&#xff1a;资产负债&#xff0c;表外业务、流动性风险、贷款质量、投向行业和地区、重点客户等。 1104报表分类 普通报表、机构特色类报表。 反洗钱 大额交易、可疑交易。标签分类&#xff1a;疑似犯罪、疑似毒品、疑似传销。 反洗钱—接口报…

揭秘Fabric交易流程:一文带你深入了解

随着区块链技术的日益普及&#xff0c;Hyperledger Fabric作为一种联盟链解决方案&#xff0c;受到了广泛关注。那么&#xff0c;Fabric的交易流程究竟是怎样的呢&#xff1f;本文将为您一一揭晓。 1. Fabric交易的参与方 客户端&#xff1a;交易流程的发起方&#xff0c;发起…

Windows 容器镜像踩坑记录

为什么研究windows容器&#xff1f;emm&#xff0c;公司需要&#xff0c;不想多说。 dotnet后端 问题描述&#xff1a; 基于mcr.microsoft.com/dotnet/aspnet:6.0镜像撰写dockerfile编译.net core后端项目后运行容器出现类库不存在问题&#xff1a; 程序中使用了fastreport&a…

数据库(MySQL)—— DQL语句(基本查询和条件查询)

数据库&#xff08;MySQL&#xff09;—— DQL语句&#xff08;基本查询和条件查询&#xff09; 什么是DQL语句基本查询查询多个字段字段设置别名去除重复记录 条件查询语法条件 我们今天进入MySQL的DQL语句的学习&#xff1a; 什么是DQL语句 MySQL中的DQL&#xff08;Data Q…

【论文】关于网页上能打开的文章下载PDF“显示无效或损坏的 PDF 文件”的解决办法

1. 遇到的问题 今天我在 dl.acm.org/doi 下载论文时发现下载后的pdf打开出现“显示无效或损坏的 PDF 文件” 可是在原网址是可以打开并显示的 2. 解决方案 这里我用到了和之前【论文】去除PDF论文行号的完美解决方案 的相似的解决办法 就是下载的时候不直接下载&#xf…

【前端项目——分页器】手写分页器实现(JS / React)

组件介绍 用了两种方式实现&#xff0c;注释详细~ 可能代码写的不够简洁&#xff0c;见谅&#x1f641; 1. 包含内容显示的分页器 网上看了很多实现&#xff0c;很多只有分页器部分&#xff0c;没和内容显示联动。 因此我增加了模拟content的显示&#xff0c;这里模拟了32条数…

环形链表面试题详解

A. 环形链表1 给你一个链表的头节点 head &#xff0c;判断链表中是否有环. 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置…

【数据结构】第四讲:双向链表

目录 一、链表的分类 二、双向链表的结构及实现 1.带头双向链表的结构 2.创建节点 3.初始化 4.尾插 5.打印 6.头插 7.尾删 8.头删 9.在pos位置之后插入数据 10.删除pos节点 11.查找 12.销毁 个人主页&#xff1a;深情秋刀鱼-CSDN博客 数据结构专栏&#xff1a;数…

虚拟化技术 安装并配置ESXi服务器系统

安装并配置ESXi服务器系统 一、实验目的与要求 1.掌握创建VMware ESXi虚拟机 2.掌握安装VMware ESXi系统 3.掌握配置VMware ESXi系统的管理IP 4.掌握开启VMware ESXi的shell和ssh功能的方法 二、实验内容 1.安装VMware workstation 15或更高版本 2.创建VMware ESXi虚拟…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(三)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 继续接上一篇文章内容&#xff0c;讲述如何进行Phpsploit-Framework软件的基础使用和二次开发。 当我们点击 submit 提…

基于t972 Android9 AP6256,如何在设置中添加5G热点选项,并使其正常打开

通过设置的的WiFi热点选项可以知道关键词“2.4GHz”&#xff0c;因此可以其全局搜索&#xff0c;在packages\apps\Settings\res\values\strings.xml文件下找到如下图所示&#xff0c; 从上面注释可以知道&#xff0c;选项按键选择2.4GHz触发的按键关键词是“wifi_ap_choose_2G…

✔ ★Java项目——设计一个消息队列(五)【虚拟主机设计】

虚拟主机设计 创建 VirtualHost实现构造⽅法和 getter创建交换机删除交换机创建队列删除队列创建绑定删除绑定发布消息 ★路由规则1) 实现 route ⽅法2) 实现 checkRoutingKeyValid3) 实现 checkBindingKeyValid4) 实现 routeTopic5) 匹配规则测试⽤例6) 测试 Router 订阅消息1…

分布式websocket IM即时通讯聊天开源项目如何启动

前言 自己之前分享了分布式websocket的视频有同学去fork项目了&#xff0c;自己启动一下更方便理解项目嘛。然后把项目启动需要的东西全部梳理出来。支持群聊单聊,表情包以及发送图片。 支持消息可靠&#xff0c;消息防重&#xff0c;消息有序。同时基础架构有分布式权限&…

深入教程:在STM32上实现能源管理系统

引言 能源管理系统&#xff08;EMS&#xff09;在提高能源效率、减少能源消耗和支持可持续发展方面起着关键作用。本教程将介绍如何在STM32微控制器上开发一个能源管理系统&#xff0c;这种系统能够监控和控制能源使用&#xff0c;适用于家庭自动化、工业控制系统以及任何需要…