11.RV1126-ROCKX项目 API和人脸检测画框
一.ROCKX的API
1.ROCKX的作用
ROCKX的AI组件可以快速搭建 AI的应用,这些应用可以是车牌识别、人脸识别、目标识别,人体骨骼识别等等。主要用于各种检测识别。例如下图:
2.ROCKX人脸识别的API
- rockx_ret_t rockx_create(rockx_handle_t *handle, rockx_module_t m, void *config, size_t config_size);
函数解释:rockx_create 创建 rockx 的句柄 rockx_handle_t。rockx_handle_t 也是管理整个 rockx 人脸检测、人脸识别的最重要结构体
第一个参数:rockx_handle_t 的结构体指针
第二个参数:rockx_module_t 的结构体,rockx_module_t 是一个枚举类型,设置当前 rockx 的处理类型。具体的如下:
ROCKX_MODULE_FACE_DETECTION:人脸检测模块
ROCKX_MODULE_FACE_LANDMARK_68:人脸 68 个特征点检测
ROCKX_MODULE_FACE_RECOGNIZE:人脸识别模块
ROCKX_MODULE_FACE_ANALYZE: 人脸分析模块
ROCKX_MODULE_OBJECT_DETECTION:目标检测模块
ROCKX_MODULE_POSE_BODY: 人体姿态检测模块,14 个关键点
ROCKX_MODULE_POSE_FINGER_21:手指检测模块,21 个关键点
ROCKX_MODULE_FACE_LANDMARK_5:人脸 5 个特征点检测
ROCKX_MODULE_HEAD_DETECTION: 人体头部检测模块
ROCKX_MODULE_CARPLATE_DETECTION: 车牌检测模块
ROCKX_MODULE_CARPLATE_ALIGN:车牌对齐模块
ROCKX_MODULE_CARPLATE_RECOG:车牌识别模块
ROCKX_MODULE_OBJECT_TRACK:物体追踪模块
ROCKX_MODULE_POSE_FINGER_3:手指检测模块, 支持 3 个关键点
ROCKX_MODULE_FACE_MASKS_DETECTION:人脸口罩检测,检测这个人是否戴口罩
ROCKX_MODULE_FACE_DETECTION_V2:人脸检测模块,Version2 版本
ROCKX_MODULE_BODY_MASK:人体身体遮挡检测,主要是检测当前人体是否有遮挡物
ROCKX_MODULE_POSE_BODY_V2:人体姿态检测,V2 是 Version2,能够检测 17 个关键点
ROCKX_MODULE_FACE_DETECTION_V3:人脸检测模块,V3 是 Version3,它只能检测 320 * 320 的人脸
ROCKX_MODULE_FACE_DETECTION_V3_LARGE:人脸检测模块加强版,V3 是 Version3,Large 能够检测 640 * 640 的人脸
ROCKX_MODULE_PERSON_DETECTION:行人检测模块,主要是检测当前图像中是否有行人
ROCKX_MODULE_FACE_LANDMARK_106:人脸关键点检测模型,总共能检测出 106 个关键点
ROCKX_MODULE_FACE_BEAUTY:人脸漂亮指数检测模型,主要是检测人的漂亮指数是多少
ROCKX_MODULE_FACE_SMILE_DETECT:人脸微笑检测模型,检测当前人是否微笑
ROCKX_MODULE_FACE_MASK_CLASSIFIER:人脸口罩分类检测模型,主要是检测当前口罩的类型是什么
ROCKX_MODULE_PERSON_DETECTION_V2:行人检测模型,V2 是 Version2,它只能检测 532 * 320 的行人图像
ROCKX_MODULE_PERSON_DETECTION_V3:行人检测模型,V3 是 Version3,它可以检测多尺寸的行人图像
第三个参数:rockx_config_t 结构体指针,主要是配置 rockx 的基本参数,它的创建是用rockx_add_config 来创建
第四个参数:config_size,默认是 0 就可以
- rockx_ret_t rockx_add_config(rockx_config_t *config, const char *key, const char *value);
函数解释:添加 rockx 的 config 配置
第一个参数:rockx_config_t 结构体指针,rockx_config_t 的创建是用 rockx_create_config 来分配,如:rockx_config_t *config =rockx_create_config();
第二个参数:config 的 key, 最常见的 KEY 是 ROCKX_CONFIG_DATA_PATH(ROCKX 的配置路径)
第三个参数:config 的 value, 跟 Key 一一对应, 比方说 Key 是 ROCKX_CONFIG_DATA_PATH, 那它的 value 就是对应的 rockx 的具体路径,如:/userdata/rockx_data/。
示例:
rockx_config_t *config = rockx_create_config();
rockx_add_config(config, ROCKX_CONFIG_DATA_PATH, "/userdata/rockx_data/");
- rockx_ret_t rockx_face_detect(rockx_handle_t handle, rockx_image_t *in_img,rockx_object_array_t *face_array, rockx_async_callback *callback);
函数解释:这个 API 主要是对人脸进行检测,得到人脸检测的位置信息
第一个参数:rockx_handle_t 的结构体指针
第二个参数:rockx_image_t 的结构体指针,这个是输入的图像,需要检测的图像,也可以是每一帧视频流。
第四个参数:config_size,默认是 0 就可以
第三个参数:rockx_object_array_t 的结构体指针,主要是输出检测结果,这个检测结果的结构体如下:
count:检测的人脸数量
rockx_object_t:检测的具体信息,具体的成员变量如下:
id:object 的 id 号
cls_idx:object 的 index 索引
score:object 物体信任分数
box:rockx 的区域信息,rockx_rect_t 结构体。
left:区域左边缘的 x 坐标,其实就是 x 轴数据
top: 区域顶的 y 坐标,其实就是 Y 轴数据
right:区域右边缘的 x 坐标,其实就是 left + width
bottom:区域底的 Y 坐标,其实就是 top + height
- rockx_ret_t rockx_face_recognize(rockx_handle_t handle, rockx_image_t *in_img, rockx_face_feature_t *out_feature);
函数定义:这个 API 主要是对人脸进行识别,并提取人脸数据
第一个参数:rockx_handle_t 的结构体指针
第二个参数:rockx_image_t 的结构体指针,这个是输入的图像,需要检测的图像,也可以是每一帧视频流。
第三个参数:rockx_face_feature_t 的结构体指针,rockx_face_feature_t 结构体主要是存储人脸的特征值和长度,我们来看看这个结构体的组成
version:人脸识别版本
len:人脸识别的长度
feature[512]:人脸识别的数据,512 的 float 数组,这个值是存储一个二进制数据
- rockx_ret_t rockx_face_feature_similarity(rockx_face_feature_t *in_feature1, rockx_face_feature_t *in_feature2, float *out_similarity);
函数的定义:这个 API 主要是对比两个人脸,并计算两个人脸的对比数值
第一个参数:in_feature1,需要对比的人脸特征值 1
第一个参数:in_feature2,需要对比的人脸特征值 2
第三个参数:in_feature1 和 in_feature2 对比的相似度值,一般小于 1.0 可以判断为同一个人
- rockx_ret_t rockx_face_align(rockx_handle_t handle, rockx_image_t *in_img, rockx_rect_t *in_box, rockx_face_landmark_t *in_landmark, rockx_image_t *out_img);
函数的定义:这个 API 主要是对目前检测的人脸进行对齐,这个对齐一般是用 face_landmark 检测人脸关键点进行对齐
第一个参数:rockx_handle_t 的结构体
第二个参数:in_img 输入的图像
第三个参数:in_box 是人脸检测的区域,用矩形来表示,我们来看看 rockx_rect_t 的结构体成员
left:表示矩形左边缘的 X 坐标。
top:表示矩形顶部的 y 坐标
right:表示矩形右边缘的 x 坐标
bottom:表示矩形底部的 y 坐标。
第四个参数:rockx_face_landmark_t 的结构体指针,主要是检测人脸关键点,我们来看看这个结构体的成员变量
image_width:图像的长度
image_height:图像的高度
face_box:人脸的检测区域,用矩形表示
landmarks_count:关键点个数
landmarks[128]:具体的人脸关键点,rockx_point_t 来表示,它本质上就是 x,y 的点
score:每个关键点的分数
- rockx_ret_t rockx_face_filter(rockx_handle_t handle, rockx_image_t *in_img, rockx_rect_t *in_box, int *is_false_face);
函数的定义:这个 API 主要是过滤人脸,过滤图像中不符合人脸的图像
第一个参数:rockx_handle_t 的结构体指针
第二个参数:in_img 是输入的图像
第三个参数:in_box 人脸检测区域,是一个矩形
第四个参数:is_falas_face 判断当前检测的图像是否是人脸,是人脸就等于 true,否则 false
- rockx_ret_t rockx_face_masks_detect(rockx_handle_t handle, rockx_image_t *in_img, rockx_face_mask_array_t *face_mask_array,rockx_async_callback *callback);
第一个参数:rockx_handle_t 的结构体指针
第二个参数:in_img 是输入的图像
第三个参数:face_mask_array 存放口罩的数据,我们来看看这个结构体的数据
count:口罩的数量
face_masks:rockx_face_mask_t,具体的口罩参数,如下图
face_box :是口罩的区域,用矩形表示
mask_score:口罩的分数
hasMask:是否有戴口罩
二. ROCKX图片检测人脸并画框
1.图片检测人脸并画框的流程:
这里有个重点就是如何知道脸的位置:由rockx_face_detect函数检测并获取位置传给opencv,那位置就是width:right-left,high:bottom-top。然后opencv画框。
2.代码实现
/****************************************************************************** Copyright (c) 2017 - 2019 by Rockchip Corp. All rights reserved.** The material in this file is confidential and contains trade secrets* of Rockchip Corporation. This is proprietary information owned by* Rockchip Corporation. No part of this work may be disclosed,* reproduced, copied, transmitted, or used in any way for any purpose,* without the express written permission of Rockchip Corporation.******************************************************************************/
#include <assert.h>
#include <cstddef>
#include <fcntl.h>
#include <getopt.h>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"
#include "rknn_rockx_include/rockx_type.h"
#include "rockx.h"
#include <opencv2/core.hpp>
// #include <opencv2/imgoroc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <memory.h>
#include <sys/time.h>
#include "rknn_rockx_include/rockx_type.h"
#include "rockx.h"
#include <opencv2/opencv.hpp>
#include <opencv2/imgcodecs.hpp>
#include "rknn_rockx_include/utils/rockx_config_util.h"
using namespace cv;int main(int argc, char **argv)
{const char *image_path = argv[1]; //输入图片路径//配置rockx的configrockx_config_t * face_detect_config = rockx_create_config();//创建配置rockx_add_config(face_detect_config,ROCKX_CONFIG_DATA_PATH, "/userdata/rockx_data");//设置配置//创建rockx的句柄rockx_ret_t face_ret;rockx_handle_t face_detect_handle ;rockx_module_t module = ROCKX_MODULE_FACE_DETECTION_V3;face_ret = rockx_create(&face_detect_handle,module,face_detect_config,0);//创建A模型if(face_ret != ROCKX_RET_SUCCESS){printf("create face detect handle failed.....\n");return -1;}//读取图片rockx_image_t image;rockx_image_read(image_path,&image,1);//读取图片printf("3");//检测人脸rockx_object_array_t face_array;face_ret = rockx_face_detect(face_detect_handle,&image,&face_array,nullptr);//检测人脸if(face_ret != ROCKX_RET_SUCCESS){printf("face detect failed.....\n");return -1;}//循环人脸数量并画框Mat face_mat = Mat(image.height,image.width,CV_8UC3,image.data);//将图片转为Matfor(int i = 0;i < face_array.count;i++){int left = face_array.object[i].box.left;int top = face_array.object[i].box.top;int width = face_array.object[i].box.right - face_array.object[i].box.left;int height = face_array.object[i].box.bottom - face_array.object[i].box.top;Rect boundingRect(left,top,width,height);//定义矩形框rectangle(face_mat,boundingRect,Scalar(0,0,255),1);//画框}//显示图片imwrite("face_detect.jpg",face_mat);rockx_destroy(face_detect_handle);return 0;
}
3.效果图(V2模型会出现多个框,所以改V3模型了)
三.ROCKX视频检测人脸并画框
1.视频检测人脸并画框的流程:
首先要初始化模块包括 VI 模块、VENC 模块、并启动 VI 模块采集视频流、rockx 模块的初始化。
初始化模块后,就要分两个线程处理了。
主线程是负责 rockx 对 VI 视频流的处理,并用 OPENCV 对人脸进行画框,最后把处理后的 VI 数据传输到 VENC 模块里面。
第二个线程 rockx_face_detect_venc_thread,从 VENC 模块获取到 H264 的编码码流数据,并把 VENC 码流数据保存。
2.代码实现
/****************************************************************************** Copyright (c) 2017 - 2019 by Rockchip Corp. All rights reserved.** The material in this file is confidential and contains trade secrets* of Rockchip Corporation. This is proprietary information owned by* Rockchip Corporation. No part of this work may be disclosed,* reproduced, copied, transmitted, or used in any way for any purpose,* without the express written permission of Rockchip Corporation.******************************************************************************/
#include <assert.h>
#include <cstddef>
#include <fcntl.h>
#include <getopt.h>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <pthread.h>
#include <signal.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>// #include "common/sample_common.h"
#include "rkmedia_api.h"
#include "rknn_rockx_include/rockx_type.h"
#include "rockx.h"
#include <opencv2/core.hpp>
// #include <opencv2/imgoroc.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>#define CAMERA_PATH "rkispp_scale0"
#define CAMERA_ID 0
#define CAMERA_CHN 0
#define VENC_CHN 0
#define WIDTH 1920
#define HEIGHT 1080
using namespace cv;void *rockx_face_detect_venc_thread(void *args)
{pthread_detach(pthread_self());FILE *face_detect_h264 = fopen("face_detect_venc.h264", "w+");MEDIA_BUFFER mb = NULL;while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VENC, VENC_CHN, -1);if (!mb){printf("Get Rockx_Venc Data break...\n");}fwrite(RK_MPI_MB_GetPtr(mb), RK_MPI_MB_GetSize(mb), 1, face_detect_h264);RK_MPI_MB_ReleaseBuffer(mb);}return NULL;
}int main(int argc, char **argv)
{int ret;VI_CHN_ATTR_S vi_chn_attr;vi_chn_attr.pcVideoNode = CAMERA_PATH; // Pathvi_chn_attr.u32Width = 1920; // Widthvi_chn_attr.u32Height = 1080; // Heightvi_chn_attr.enPixFmt = IMAGE_TYPE_NV12; // ImageTypevi_chn_attr.enBufType = VI_CHN_BUF_TYPE_MMAP; // BufTypevi_chn_attr.u32BufCnt = 3; // Cntvi_chn_attr.enWorkMode = VI_WORK_MODE_NORMAL; // Moderet = RK_MPI_VI_SetChnAttr(CAMERA_ID, CAMERA_CHN, &vi_chn_attr);if (ret){printf("Vi Set Attr Failed.....\n");return 0;}else{printf("Vi Set Attr Success.....\n");}ret = RK_MPI_VI_EnableChn(CAMERA_ID, CAMERA_CHN);if (ret){printf("Vi Enable Attr Failed.....\n");return 0;}else{printf("Vi Enable Attr Success.....\n");}VENC_CHN_ATTR_S venc_chn_attr;memset(&venc_chn_attr, 0, sizeof(VENC_CHN_ATTR_S));venc_chn_attr.stVencAttr.u32PicWidth = 1920;venc_chn_attr.stVencAttr.u32PicHeight = 1080;venc_chn_attr.stVencAttr.u32VirWidth = 1920;venc_chn_attr.stVencAttr.u32VirHeight = 1080;venc_chn_attr.stVencAttr.imageType = IMAGE_TYPE_NV12;venc_chn_attr.stVencAttr.enType = RK_CODEC_TYPE_H264;venc_chn_attr.stVencAttr.u32Profile = 66;venc_chn_attr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;venc_chn_attr.stRcAttr.stH264Cbr.u32Gop = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32BitRate = 1920 * 1080 * 3;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.fr32DstFrameRateNum = 25;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateDen = 1;venc_chn_attr.stRcAttr.stH264Cbr.u32SrcFrameRateNum = 25;ret = RK_MPI_VENC_CreateChn(VENC_CHN, &venc_chn_attr);if (ret){printf("ERROR: Create venc failed!\n");exit(0);}ret = RK_MPI_VI_StartStream(CAMERA_ID, CAMERA_CHN);if (ret){printf("RK_MPI_VI_StartStream Failed.....\n");return 0;}else{printf("RK_MPI_VI_StartStream Success.....\n");}pthread_t pid;pthread_create(&pid, NULL, rockx_face_detect_venc_thread, NULL);rockx_config_t *face_detect_config = rockx_create_config();rockx_add_config(face_detect_config, ROCKX_CONFIG_DATA_PATH, "/userdata/rockx_data");rockx_handle_t face_detect_handle;rockx_ret_t face_detect_ret;rockx_module_t face_detect_module = ROCKX_MODULE_FACE_DETECTION_V3;face_detect_ret = rockx_create(&face_detect_handle, face_detect_module, face_detect_config, 0);if (face_detect_ret != ROCKX_RET_SUCCESS){printf("rockx_create face_detect failed...\n");return -1;}rockx_image_t rv1126_rockx_image;//图像数据rv1126_rockx_image.width = WIDTH;//图像宽度rv1126_rockx_image.height = HEIGHT;//图像高度rv1126_rockx_image.pixel_format = ROCKX_PIXEL_FORMAT_YUV420SP_NV12;//图像格式MEDIA_BUFFER mb;while (1){mb = RK_MPI_SYS_GetMediaBuffer(RK_ID_VI, CAMERA_CHN, -1);if (!mb){printf("Get Vi Stream break....\n");break;}rv1126_rockx_image.data = (uint8_t *)RK_MPI_MB_GetPtr(mb);rv1126_rockx_image.size = RK_MPI_MB_GetSize(mb);Mat rv1126_image_mat = Mat(HEIGHT, WIDTH, CV_8UC1, rv1126_rockx_image.data);rockx_object_array_t face_detect_array;face_detect_ret = rockx_face_detect(face_detect_handle, &rv1126_rockx_image, &face_detect_array, NULL);if (face_detect_ret != ROCKX_RET_SUCCESS){printf("face_detect failed....\n");}for (int i = 0; i < face_detect_array.count; i++){int left = face_detect_array.object[i].box.left;int top = face_detect_array.object[i].box.top;int w = face_detect_array.object[i].box.right - face_detect_array.object[i].box.left;int h = face_detect_array.object[i].box.bottom - face_detect_array.object[i].box.top;Rect boundingRect(left, top, w, h);rectangle(rv1126_image_mat, boundingRect, Scalar(255, 255, 0));}RK_MPI_SYS_SendMediaBuffer(RK_ID_VENC, VENC_CHN, mb);RK_MPI_MB_ReleaseBuffer(mb);}RK_MPI_VENC_DestroyChn(VENC_CHN);RK_MPI_VI_DisableChn(CAMERA_ID, CAMERA_CHN);return 0;
}
3.效果图:不给看啦!!! 已验证,没问题
相关文章:

11.RV1126-ROCKX项目 API和人脸检测画框
一.ROCKX的API 1.ROCKX的作用 ROCKX的AI组件可以快速搭建 AI的应用,这些应用可以是车牌识别、人脸识别、目标识别,人体骨骼识别等等。主要用于各种检测识别。例如下图: 2.ROCKX人脸识别的API rockx_ret_t rockx_create(rockx_handle_t *han…...

超构光学与 AR 的深度融合 | 攻克 VAC 与眼动范围难题
原文信息 原文标题:“Three-dimensional varifocal meta-device for augmented reality display” 第一作者:宋昱舟,袁家琪,陳欽杪,刘小源 ,周寅,程家洛,肖淑敏*,陈沐…...

[ Qt ] | 与系统相关的操作(三):QFile介绍和使用
目录 之前的操作文件的方式 Qt中的文件操作简介 QFile 打开 读 写 关闭 一个例子来说明 QFileInfo 之前的操作文件的方式 C语言中,fopen 打开文件,fread fwrite 读写文件,fclose 关闭文件。 C中,fstream 打开文件&…...
RetroMAE 预训练任务
RetroMAE 预训练任务的具体步骤,围绕 编码(Encoding)、解码(Decoding)、增强解码(Enhanced decoding) 三个核心阶段展开,以下结合图中流程拆解: 一、阶段 A:…...

软件工程:如何做好软件产品
1、什么是产品 从项目到产品 产品:满足行业共性需求的标准产品。即要能够做到配置化的开发,用同一款产品最大限度地满足不同客户的需求,同时让产品具有可以快速响应客户需求变化的能力。 好的产品一定吸收了多个项目的共性,一定是…...

蓝桥杯 省赛 2025python(B组)题目(分析)
目录 第一题 为什么答案是103而不是104? 第二题 为什么必须按长度排序? 第三题 易错点总结 第四题 逻辑问题: 可能超过时间复杂度的代码示例 1. 暴力枚举所有可能的子串 2. 递归回溯 第五题 1. 暴力枚举法 2. 优化枚举 3.数…...

React - 组件通信
组件通信 概念:组件通信就是组件之间数据传递,根据组件嵌套关系不同,有不同的通信方法 父传子 —— 基础实现 实现步骤 父组件传递数据 - 在子组件标签上绑定属性子组件接收数据 - 子组件通过props参数接收数据 声明子组件并使用 //声明子…...
《前端面试题:CSS的display属性》
CSS display属性完全指南:深入理解布局核心属性 掌握display属性是CSS布局的基石,也是前端面试必考知识点 一、display属性概述:布局的核心控制 display属性是CSS中最重要、最基础的属性之一,它决定了元素在页面上的渲染方式和布…...

飞牛使用Docker部署Tailscale 内网穿透教程
之前发过使用docker部署Tailscale的教程,不过是一年前的事情了,今天再重新发表一遍,这次使用compose部署更加方便,教程也会更加详细一点,希望对有需要的朋友有所帮助! 对于大部分用户来说,白嫖 …...

《数据挖掘》- 房价数据分析
这里写目录标题 采用的技术1. Python编程语言2. 网络爬虫库技术点对比与区别项目技术栈的协同工作流程 代码解析1. 导入头文件2. 读取原始数据3. 清洗数据4. 数据分割4.1 统计房屋信息的分段数量4.2 将房屋信息拆分为独立列4.3 处理面积字段4.4 删除原始房屋信息列 5. 可视化分…...
centos中的ulimit命令
centos中的ulimit命令 ulimit的作用CENTOS系统文件配置配置文件地址配置格式 配置方法 ulimit的作用 ulimit用于限制shell启动进程所占用的资源,支持以下各种类型的限制:所创建的内核文件的大小、进程数据块的大小、Shell进程创建文件的大小、内存锁住的…...
git提交代码和解决冲突修复bug
提交到分支的步骤如下: 确保你当前在开发分支上,可以使用命令 git branch 来查看当前所在分支,并使用 git checkout 命令切换到开发分支。使用 git add 命令将修改的文件添加到暂存区。使用 git commit 命令提交代码到本地仓库。 解决合并冲…...
华为仓颉语言初识:并发编程之同步机制(上)
前言 线程同步机制是多线程下解决线程对共享资源竞争的主要方式,华为仓颉语言提供了三种常见的同步机制用来保证线程同步安全,分别是原子操作,互斥锁和条件变量。本篇文章详细介绍主要仓颉语言解决同步机制的方法,建议点赞收藏&a…...
php中实现邮件发送功能
要在php项目中实现邮件发送功能,推荐使用phpmailer库通过smtp协议配置。首先安装phpmailer扩展,可通过composer命令composer require phpmailer/phpmailer安装;若未使用composer则手动引入源码。接着配置smtp信息,包括服务器地址&…...

C++之动态数组vector
Vector 一、什么是 std::vector?二、std::vector 的基本特性(一)动态扩展(二)随机访问(三)内存管理 三、std::vector 的基本操作(一)定义和初始化(二…...
arc3.2语言sort的时候报错:(sort < `(2 9 3 7 5 1)) 需要写成这种:(sort > (pair (list 3 2)))
arc语言sort的时候报错:(sort < (2 9 3 7 5 1)) arc> (sort < (2 9 3 7 5 1)) Error: "set-car!: expected argument of type <pair>; given: 9609216" arc> (sort < (2 9 3 )) Error: "Function call on inappropriate object…...
Android动态广播注册收发原理
一、动态广播的注册流程 1. 注册方式 动态广播通过代码调用 Context.registerReceiver() 方法实现,需显式指定 IntentFilter 和接收器实例: // 示例:在 Activity 中注册监听网络变化的广播 IntentFilter filter new IntentFilter…...
Ubuntu 系统通过防火墙管控 Docker 容器
Ubuntu 系统通过防火墙管控 Docker 容器指南 一、基础防火墙配置 # 启用防火墙 sudo ufw enable# 允许 SSH 连接(防止配置过程中断联) sudo ufw allow 22/tcp二、Docker 配置调整 # 编辑 Docker 配置文件 sudo vim /etc/docker/daemon.json配置文件内…...
AI 模型分类全解:特性与选择指南
人工智能(AI)技术正以前所未有的速度改变着我们的生活和工作方式。AI 模型作为实现人工智能的核心组件,种类繁多,功能各异。从简单的线性回归模型到复杂的深度学习网络,从文本生成到图像识别,AI 模型的应用…...

【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载
🧠关键词:Zephyr、NVS、非易失存储、掉电保持、Flash、AT命令保存、配置管理 📌目标读者:希望在 BLE 模块中实现掉电不丢配置、支持产测参数注入与自动加载功能的开发者 📊文章长度:约 5200 字 🔍 为什么要使用 NVS? 在实际产品中,我们经常面临以下场景: 用户或…...

【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)
问题 项目打开之后,发现项目文件直接乱码, 这样子的 这本来是个Java文件,结果一打开变成了这种情况,跟见鬼一样,而且还不是这一个文件这样,基本上一个项目里面一大半都是这样的问题。 处理方法 此时遇到…...
n皇后问题的 C++ 回溯算法教学攻略
一、问题描述 n皇后问题是经典的回溯算法问题。给定一个 nn 的棋盘,要求在棋盘上放置 n 个皇后,使得任何两个皇后之间不能互相攻击。皇后可以攻击同一行、同一列以及同一对角线上的棋子。我们需要找出所有的合法放置方案并输出方案数。 二、输入输出形…...

一些免费的大A数据接口库
文章目录 一、Python开源库(适合开发者)1. AkShare2. Tushare3. Baostock 二、公开API接口(适合快速调用)1. 新浪财经API2. 腾讯证券接口3. 雅虎财经API 三、第三方数据平台(含免费额度)1. 必盈数据2. 聚合…...
DeepSeek本地部署及WebUI可视化教程
前言 DeepSeek是近年来备受关注的大模型之一,支持多种推理和微调场景。很多开发者希望在本地部署DeepSeek模型,并通过WebUI进行可视化交互。本文将详细介绍如何在本地环境下部署DeepSeek,并实现WebUI可视化,包括Ollama和CherryStudio的使用方法。 一、环境准备 1. 硬件要…...
机器学习算法时间复杂度解析:为什么它如此重要?
时间复杂度的重要性 虽然scikit-learn等库让机器学习算法的实现变得异常简单(通常只需2-3行代码),但这种便利性往往导致使用者忽视两个关键方面: 算法核心原理的理解缺失 忽视算法的数据适用条件 典型算法的时间复杂度陷阱 SV…...

SSIM、PSNR、LPIPS、MUSIQ、NRQM、NIQE 六个图像质量评估指标
评价指标 1. SSIM(Structural Similarity Index) 📌 定义 结构相似性指数(Structural Similarality Index)是一种衡量两幅图像相似性的指标,考虑了亮度、对比度和结构信息的相似性,比传统的 P…...

【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
下面是一份针对在旧版 MSYS2(安装在 D 盘)中,基于 Python 3.11 的 Poetry 虚拟环境下升级 Rust 的处理过程笔记(适用于 WIN 系统 SUNA 人工智能代理开源项目部署要求)的记录。 MSYS2 旧版环境中 Rust 升级问题及解决过…...
centos查看开启关闭防火墙状态
执行:systemctl status firewalld ,即可查看防火墙状态 防火墙的开启、关闭、禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:system…...
[论文阅读] 人工智能 | 大语言模型计划生成的新范式:基于过程挖掘的技能学习
#论文阅读# 大语言模型计划生成的新范式:基于过程挖掘的技能学习 论文信息 Skill Learning Using Process Mining for Large Language Model Plan Generation Andrei Cosmin Redis, Mohammadreza Fani Sani, Bahram Zarrin, Andrea Burattin Cite as: arXiv:2410.…...
MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912
MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912 产品简述 MS31912 是集成多种高级诊断功能的多通道半桥驱动。 MS31912 具有 12 个半桥,典型工作电压 13.5V 下,每一个半桥支持 1A 电流,典型工…...