当前位置: 首页 > article >正文

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录

  • 相机话题
  • 获取图像
  • 颜色目标识别与定位
  • 目标跟随
  • 人脸检测

相机话题

启动仿真

roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect

/camera/image_raw:原始的、未经处理的图像数据。
/camera/image_rect:经过畸变校正的图像数据。
/camera/image_rect_color:彩色的、经过畸变校正的图像数据。
/camera/camera_info:相机的内参信息,如焦距、主点坐标和畸变系数等。

image_rect_color话题的消息格式就是sensor_msgs/Image

Header header          # 图像的头部信息
uint32 height           # 图像的高度(行数)
uint32 width            # 图像的宽度(列数)
string encoding         # 像素编码格式
uint8 is_bigendian      # 数据是否为大端序
uint32 step             # 每行的字节长度
uint8[] data            # 图像的原始数据

在这里插入图片描述

  1. 光线入射
    入射光线:光线从物体反射后进入相机镜头,最终到达相机的感光芯片(图像传感器)。
    光线包含红(R)、绿(G)、蓝(B)三种颜色的成分。
  2. 栅格滤镜
    Bayer 栅格滤镜:感光芯片上方覆盖了一层滤镜,称为 Bayer 栅格滤镜。它由红、绿、蓝三种颜色的滤光片以特定的排列方式组成。
    滤光片的作用:每个滤光片只允许特定颜色的光线通过:
    红色滤光片:只允许红色光线通过。
    绿色滤光片:只允许绿色光线通过。
    蓝色滤光片:只允许蓝色光线通过。
  3. 感光芯片
    感光芯片:光线通过滤光片后,照射到感光芯片上。感光芯片由许多光敏单元(像素)组成,每个像素只能检测到一种颜色的光强信息。
    光强信息:每个像素根据接收到的光强生成电信号,电信号的强度与光强成正比。
  4. 像素阵列
    像素阵列:感光芯片上的像素按照一定的排列方式组成一个二维阵列。每个像素存储的是经过滤光片过滤后的光强信息。
    颜色分离:由于每个像素只能检测到一种颜色,因此整个图像被分解为红、绿、蓝三个独立的像素阵列:
    红色像素阵列:存储红色光强信息。
    绿色像素阵列:存储绿色光强信息。
    蓝色像素阵列:存储蓝色光强信息。
  5. 图像重建
    插值算法:为了生成完整的彩色图像,需要对每个像素的颜色信息进行插值。插值算法会根据相邻像素的颜色信息,估计出每个像素的完整 RGB 值。
    最终图像:经过插值处理后,每个像素都包含完整的 RGB 信息,从而形成完整的彩色图像。

获取图像

在这里插入图片描述

catkin_create_pkg cv_pkg roscpp rospy cv_bridge
 roslaunch wpr_simulation wpb_balls.launch rosrun cv_pkg cv_image_node
rosrun wpr_simulation ball_random_move 
#include<ros/ros.h>
#include<cv_bridge/cv_bridge.h>
//包含 cv_bridge 头文件,用于在 ROS 图像消息(sensor_msgs/Image)和 OpenCV 图像格式(cv::Mat)之间进行转换。
#include<sensor_msgs/image_encodings.h>
//包含 sensor_msgs 中的图像编码格式定义,例如 BGR8、RGB8 等
#include<opencv2/imgproc/imgproc.hpp>
//包含 OpenCV 的图像处理模块头文件,提供图像处理功能,如图像滤波、边缘检测等
#include<opencv2/highgui/highgui.hpp>
//包含 OpenCV 的高级用户界面模块头文件,提供图像显示和窗口管理功能。
using namespace cv;
//使用 OpenCV 的命名空间 cv,避免在代码中多次使用 cv:: 前缀。
void Cam_RGB_Callback(const sensor_msgs::Image msg)
{cv_bridge::CvImagePtr cv_ptr;try{   //将 ROS 的图像消息(sensor_msgs::Image)转换为 OpenCV 的图像格式(cv::Mat)。//BGR8 是一种图像编码格式,表示每个像素由 3 个字节组成,分别对应蓝(Blue)、绿(Green)、红(Red)三个颜色通道,每个通道 8 位(1 字节)cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);}catch(cv_bridge::Exception& e){ROS_ERROR("Could not convert from '%s' to 'bgr8'.", e.what());return;}//cv_bridge::CvImagePtr 对象中获取 OpenCV 的 cv::Mat 图像数据Mat imageOriginal=cv_ptr->image;//作用:在窗口中显示图像。// "RGB_Image":窗口名称。// imageOriginal:要显示的图像数据。imshow("RGB_Image", imageOriginal);//作用:确保图像窗口能够有足够时间显示。waitKey(3);
}
int main(int argc, char** argv)
{ros::init(argc, argv, "cv_image_node");ros::NodeHandle nh;//kinect2含义:表示这是 Kinect 2 相机的数据话题。//qhd含义:表示 Quarter HD(四分之一高清)分辨率。ros::Subscriber rgb_sub = nh.subscribe("/kinect2/qhd/image_color_rect", 1, Cam_RGB_Callback);namedWindow("RGB_Image");ros::spin();
}

颜色目标识别与定位

在这里插入图片描述

RGB(Red, Green, Blue)颜色空间是一种基于光的加色模型,通过红、绿、蓝三种颜色光的不同强度组合来表示颜色。

  • 立方体结构:
    Red(红色):表示红色光的强度,从 0 到 255。
    Green(绿色):表示绿色光的强度,从 0 到 255。
    Blue(蓝色):表示蓝色光的强度,从 0 到 255。
  • 颜色表示:
    每个颜色由三个分量组成,例如 (R, G, B)。
    例如,纯红色为 (255, 0, 0),纯绿色为 (0, 255, 0),纯蓝色为 (0, 0, 255)。

在这里插入图片描述
HSV(Hue, Saturation, Value)颜色空间是一种基于人类视觉感知的颜色模型,
圆锥结构:

  • Hue(色调):表示颜色的类型,通常用角度表示,范围为 0° 到 360°。
    0° 或 360°:红色
    120°:绿色
    240°:蓝色
  • Saturation(饱和度):表示颜色的纯度,范围为 0 到 100%。
    0%:灰色(没有颜色)
    100%:最纯的颜色
  • Value(亮度):表示颜色的明暗程度,范围为 0 到 100%。
    0%:黑色
    100%:最亮的颜色

在这里插入图片描述

#include<ros/ros.h>
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/image_encodings.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>using namespace cv;
using namespace std;static int iLowH = 10;
static int iHighH = 40;static int iLowS = 90; 
static int iHighS = 255;static int iLowV = 1;
static int iHighV = 255;void Cam_RGB_Callback(const sensor_msgs::Image msg)
{cv_bridge::CvImagePtr cv_ptr;try{cv_ptr= cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);}catch(cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}Mat imgOriginal = cv_ptr->image;//创建一个 cv::Mat 对象 imgHSV,用于存储转换后的 HSV 图像Mat imgHSV;//将原始图像 imgOriginal 从 BGR 颜色空间转换为 HSV 颜色空间,并存储到 imgHSV 中。cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV);//创建一个 std::vector<cv::Mat> 对象 hsvSplit,用于存储 HSV 图像的三个通道(H、S、V)。vector<Mat> hsvSplit;//将 imgHSV 图像的三个通道(H、S、V)分离,并存储到 hsvSplit 中split(imgHSV, hsvSplit);//equalizeHist 是 OpenCV 中用于对单通道图像进行直方图均衡化(Histogram Equalization)的函数。//对 hsvSplit[2](V 通道,即亮度通道)进行直方图均衡化,并将结果存储回 hsvSplit[2] //将输入图像的直方图拉伸为均匀分布,从而增强图像的对比度。equalizeHist(hsvSplit[2], hsvSplit[2]);//将多个单通道图像合并为一个多通道图像的函数。//将处理后的 HSV 通道(H、S、V)重新合并为一个三通道图像,并存储到 imgHSV 中。merge(hsvSplit, imgHSV);Mat imgThresholded;inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);//创建一个 5x5 的矩形结构元素(kernel)。// MORPH_RECT:表示矩形形状。// Size(5, 5):表示结构元素的大小为 5x5Mat element=getStructuringElement(MORPH_RECT, Size(5, 5));// 对 imgThresholded 图像进行 开运算。// 开运算:先腐蚀后膨胀。开运算:白色噪声被去除,图像的亮区域变得更加平滑。// 腐蚀:去除图像中的小亮斑(白色噪声)。// 膨胀:恢复图像中的主要亮区域。morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);// 作用:对 imgThresholded 图像进行 闭运算。// 闭运算:先膨胀后腐蚀。闭运算:黑色噪声被填补,图像的暗区域变得更加平滑。// 膨胀:填补图像中的小暗斑(黑色噪声)。// 腐蚀:恢复图像中的主要暗区域。morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);int nTargetX = 0;int nTargetY = 0;int nPixCount = 0;int nImgWidth = imgThresholded.cols;int nImgHeight = imgThresholded.rows;int nImgChannels = imgThresholded.channels();for(int i=0; i<nImgHeight; i++){for(int j=0; j<nImgWidth; j++){if(imgThresholded.data[i*nImgWidth+j] == 255){nTargetX += j;nTargetY += i;nPixCount++;}}}if(nPixCount > 0){nTargetX /= nPixCount; nTargetY /= nPixCount;printf("颜色质心坐标( %d , %d)点数 = %d \n", nTargetX, nTargetY,nPixCount);//line_begin:定义了第一条线段的起点,坐标为 (nTargetX-10, nTargetY)。//line_end:定义了第一条线段的终点,坐标为 (nTargetX+10, nTargetY)。Point line_begin = Point(nTargetX-10, nTargetY);Point line_end = Point(nTargetX+10, nTargetY);//imgOriginal 图像上绘制一条从 line_begin 到 line_end 的红色线段。line(imgOriginal, line_begin, line_end, Scalar(0, 0, 255));//两点定义了一条垂直线段,长度为 20 个像素line_begin.x = nTargetX;line_begin.y = nTargetY-10;line_end.x = nTargetX;line_end.y = nTargetY+10;line(imgOriginal, line_begin, line_end, Scalar(0, 0, 255));}else{printf("未检测到目标!\n");}imshow("RGB", imgOriginal);imshow("HSV", imgHSV);imshow("Result", imgThresholded);cv::waitKey(5);
}int main (int argc, char** argv)
{ros::init(argc, argv, "cv_hsv_node");ros::NodeHandle nh;ros::Subscriber rgb_sub = nh.subscribe("kinect2/qhd/image_color_rect", 1, Cam_RGB_Callback);namedWindow("Threshold", WINDOW_AUTOSIZE);createTrackbar("LowH", "Threshold", &iLowH, 179); //Hue (0 - 179) 缩小一半createTrackbar("HighH", "Threshold", &iHighH, 179);createTrackbar("LowS", "Threshold", &iLowS, 255);//Saturation (0 - 255)createTrackbar("HighS", "Threshold", &iHighS, 255);createTrackbar("LowV", "Threshold", &iLowV, 255);//Value (0 - 255)createTrackbar("HighV", "Threshold", &iHighV, 255);namedWindow("RGB");namedWindow("HSV");namedWindow("Result");ros::Rate loop_rate(30);while(ros::ok()){ros::spinOnce();loop_rate.sleep();}
}

目标跟随

识别的物体的质心与中点的距离作为移动速度和旋转速度

#include<ros/ros.h>
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/image_encodings.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<geometry_msgs/Twist.h>using namespace cv;
using namespace std;static int iLowH = 10;
static int iHighH = 40;static int iLowS = 90; 
static int iHighS = 255;static int iLowV = 1;
static int iHighV = 255;geometry_msgs::Twist vel_cmd;
ros::Publisher vel_pub;void Cam_RGB_Callback(const sensor_msgs::Image msg)
{cv_bridge::CvImagePtr cv_ptr;try{cv_ptr= cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);}catch(cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}Mat imgOriginal = cv_ptr->image;Mat imgHSV;vector<Mat> hsvSplit;cvtColor(imgOriginal, imgHSV, CV_BGR2HSV);split(imgHSV, hsvSplit);equalizeHist(hsvSplit[2], hsvSplit[2]);merge(hsvSplit, imgHSV);Mat imgThresholded;inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element); morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);int nTargetX = 0;int nTargetY = 0;int nPixCount = 0;int nImgWidth = imgThresholded.cols;int nImgHeight = imgThresholded.rows;int nImgChannels = imgThresholded.channels();for(int i=0; i<nImgHeight; i++){for(int j=0; j<nImgWidth; j++){if(imgThresholded.data[i*nImgWidth+j] == 255){nTargetX += j;nTargetY += i;nPixCount++;}}}if(nPixCount > 0){nTargetX /= nPixCount;nTargetY /= nPixCount;printf("颜色质心坐标( %d , %d)点数 = %d \n", nTargetX, nTargetY,nPixCount);nImgWidth;Point line_begin = Point(nTargetX-10,nTargetY);Point line_end = Point(nTargetX+10,nTargetY);line(imgOriginal,line_begin,line_end,Scalar(255,0,0));line_begin.x = nTargetX; line_begin.y = nTargetY-10; line_end.x = nTargetX; line_end.y = nTargetY+10; line(imgOriginal,line_begin,line_end,Scalar(255,0,0));float fVeFoward=(nImgHeight/2-nTargetY)*0.002; //差值越大,移动速度越大float fVelTurn=(nImgWidth/2-nTargetX)*0.002;  //差值越大,旋转速度越大vel_cmd.linear.x = fVeFoward;vel_cmd.linear.y = 0;vel_cmd.linear.z = 0;vel_cmd.angular.x = 0;vel_cmd.angular.y = 0;vel_cmd.angular.z= fVelTurn;}else{printf("未检测到颜色\n");vel_cmd.linear.x = 0;vel_cmd.linear.y = 0;vel_cmd.linear.z = 0;vel_cmd.angular.x = 0;vel_cmd.angular.y = 0;vel_cmd.angular.z= 0;}vel_pub.publish(vel_cmd);printf("移动速度:%f,%f,%f 旋转速度:%f,%f,%f\n",vel_cmd.linear.x,vel_cmd.linear.y,vel_cmd.linear.z,vel_cmd.angular.x,vel_cmd.angular.y,vel_cmd.angular.z);imshow("RGB", imgOriginal);imshow("Result", imgThresholded);cv::waitKey(1);
}
int main(int argc, char** argv)
{   ros::init(argc, argv, "cv_follow_node");ros::NodeHandle nh;ros::Subscriber rgb_sub = nh.subscribe("kinect2/qhd/image_color_rect", 1, Cam_RGB_Callback); vel_pub = nh.advertise<geometry_msgs::Twist>("cmd_vel", 1);namedWindow("Threshold", WINDOW_AUTOSIZE);createTrackbar("LowH", "Threshold", &iLowH, 179); //Hue (0 - 179) 缩小一半createTrackbar("HighH", "Threshold", &iHighH, 179);createTrackbar("LowS", "Threshold", &iLowS, 255);//Saturation (0 - 255)createTrackbar("HighS", "Threshold", &iHighS, 255);createTrackbar("LowV", "Threshold", &iLowV, 255);//Value (0 - 255)createTrackbar("HighV", "Threshold", &iHighV, 255);namedWindow("RGB");namedWindow("Result");ros::spin();}

人脸检测

roslaunch wpr_simulation wpr1_single_face.launch rosrun cv_pkg cv_face_detect
rosrun wpr_simulation keyboard_vel_ctrl 
#include<ros/ros.h>
#include<cv_bridge/cv_bridge.h>
#include<sensor_msgs/image_encodings.h>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/objdetect/objdetect.hpp>using namespace std;
using namespace cv;static CascadeClassifier face_cascade;//cv::CascadeClassifier 对象,用于加载 Haar 特征分类器文件。static Mat frame_gray; //存储黑白图像
static vector<Rect> faces;static vector<Rect>::const_iterator face_iter;void CallbackRGB(const sensor_msgs::ImageConstPtr& msg)
{cv_bridge::CvImagePtr cv_ptr;try{cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);}catch( cv_bridge::Exception& e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}Mat imgOriginal = cv_ptr->image;//将原始图像转换为灰度图像,因为人脸检测通常在灰度图像上进行cvtColor(imgOriginal, frame_gray, CV_BGR2GRAY);equalizeHist(frame_gray, frame_gray);//detectMultiScale:CascadeClassifier 类的成员函数,用于检测图像中的多尺度特征(如人脸)// frame_gray:输入的灰度图像。// faces:输出的矩形框数组,表示检测到的人脸区域。// 1.1:尺度因子,表示每次图像缩放的比例。// 2:最小邻居数,表示每个候选区域的最小邻居数。// 0|CASCADE_SCALE_IMAGE:检测选项,包括图像缩放。// Size(30, 30):最小检测窗口大小,表示检测到的人脸的最小尺寸。face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30));if(faces.size()>0){   //遍历检测到的所有人脸区域。for(face_iter = faces.begin(); face_iter != faces.end(); ++face_iter){   // imgOriginal:原始图像,用于绘制矩形框。// Point(face_iter->x, face_iter->y):矩形框的左上角点。// Point(face_iter->x + face_iter->width, face_iter->y + face_iter->height):矩形框的右下角点。// CV_RGB(255, 0, 255):矩形框的颜色,表示为 RGB 值,这里是紫色。// 2:矩形框的边框厚度。rectangle(imgOriginal, Point(face_iter->x , face_iter->y), Point(face_iter->x+face_iter->width, face_iter->y+face_iter->height), CV_RGB(255, 0, 255),2);}}imshow("face", imgOriginal);waitKey(1);
}
int main(int argc, char** argv)
{ros::init(argc, argv, "cv_face_detect");namedWindow("face");std::string strLoadFile;char const* home = getenv("HOME");strLoadFile = home;strLoadFile += "/AI_Study_Note/Embodied-AI/ROS/catkin_ws/src";//haarcascade_frontalface_alt.xml 文件是一个 XML 文件,包含了用于人脸检测的 Haar 特征分类器的模型参数strLoadFile += "/wpr_simulation/config/haarcascade_frontalface_alt.xml";bool res=face_cascade.load(strLoadFile);if(res==false){ROS_ERROR("Load haarcascade_frontalface_alt.xml failed!");return 0;}ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("/kinect2/qhd/image_color_rect", 1, CallbackRGB);ros::spin();return 0;
}

相关文章:

ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测

文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw&#xff1a;原始的、未经处理的图像数据。 /camera/image_rect&#xff…...

破解Docker镜像拉取难题:为Docker配置代理加速镜像拉取

为Docker配置代理加速镜像拉取 概述守护进程配置&#xff08;推荐长期使用&#xff09;Systemd环境变量配置&#xff08;适合临时调整&#xff09;其他 概述 为什么需要配置代理与镜像加速? 跨国网络限制&#xff1a;境外镜像仓库拉取速度慢或无法访问企业安全策略&#xff…...

细分数字货币钱包的不同种类

文章目录 一、中心化钱包1.1 中心化钱包架构1.2 中心化钱包业务细节流程 二、去中心化钱包(HD 钱包)2.1 去中心化钱包架构2.2 去中心化钱包细节业务流程 三、硬件钱包3.1 硬件钱包架构3.2 硬件钱包细节业务流程 四、MPC 托管钱包五、多签钱包 中心化钱包 &#xff1a;钱包私钥一…...

推理模型时代:大语言模型如何从对话走向深度思考?

一、对话模型和推理模型的区别概述 对话模型是专门用于问答交互的语言模型,符合人类的聊天方式,返回的内容可能仅仅只是一个简短的答案,一般模型名称后面会带有「chat」字样。 推理模型是比较新的产物,没有明确的定义,一般是指输出过程中带有<think>和</think&…...

调用click.getchar()时Windows PyCharm无法模拟键盘输入

文章目录 问题描述解决方案参考文献 问题描述 调用 click.getchar() 时&#xff0c;Windows PyCharm 无法模拟键盘输入 解决方案 Run → Edit Configurations… → Modify options → Emulate terminal in output console 参考文献 Terminal emulator | PyCharm Documentati…...

关于ES中text类型时间字段范围查询的结构化解决方案

前言 有关es中text类型的时间字段范围查询的问题&#xff0c;比如&#xff1a; {"query": {"range": {"insertTime": {"gte": "2025-02-01T00:00:00","lte": "2025-11-30T23:59:59","format&quo…...

易基因: ChIP-seq+DRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性|NAR

原文&#xff1a;ChIP-seqDRIP-seq揭示AMPK通过调控H3K4me3沉积和R-loop形成以维持基因组稳定性和生殖细胞完整性&#xff5c;NAR 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 在饥饿等能量胁迫条件下&#xff0c;生物体会通过调整…...

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器(Locators)2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架)总结前言 JetBrains 的 Aqua IDE 提供强大的 Web Inspector 工具,帮…...

数据中心储能蓄电池状态监测管理系统 组成架构介绍

安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高&#xff0c;蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性&#xff0c;分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...

01数据准备 抓取图片 通过爬虫方式获取bing的关键词搜索图片

为了获取训练所需的图片,我们最常用的手段就是自己去写一个爬虫去获取相关图片。本文将重点围绕如何采用爬虫的方式获取训练所需的图片素材进行讲解,为了大家能够够直观的掌握相关技术,参考本文的相关过程和代码获取自己的数据图片素材,笔者将详细介绍实现过程。 1、确定图…...

【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记

本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码&#xff0c;当执行 addLast() 与 getLast() 方法时需要遍历链表&#xff0c;效率不高&#xff0c;因此可以添加一个指向链表末尾的索引&am…...

Git 工作流程

1、Git 工作流程 http://www.ruanyifeng.com/blog/2015/12/git-workflow.html git push -f origin HEAD^:master 删除服务器上最近的一次提交git push -f origin HEAD^:master 2、Git分支管理 动画形式演示分支效果&#xff1a; http://onlywei.github.io/explain-git-with-…...

DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署

DeepSeek接入Siri&#xff08;已升级支持苹果手表&#xff09;完整版硅基流动DeepSeek-R1部署 **DeepSeek** 是一款专注于深度学习和人工智能的工具或平台&#xff0c;通常与人工智能、机器学习、自动化分析等领域有关。它的主要功能可能包括&#xff1a;深度学习模型搜索&…...

【后端】gitHub访问速度太慢解决办法

问题描述 浏览器无法打开GitHub&#xff0c;加载非常慢 解决方法 1、修改本地hosts文件&#xff0c;增加到 http://github.global.ssl.fastly.net 和 http://github.com 的映射 本机hosts 文件位置&#xff1a; C:\Windows\System32\drivers\etc配置如下&#xff1a; # g…...

Hutool - Extra:功能丰富的扩展模块

一、简介 Hutool - Extra 作为 Hutool 工具包的扩展模块&#xff0c;对众多第三方库和功能进行了封装&#xff0c;极大地丰富了 Hutool 的功能体系。它涵盖了模板引擎、邮件发送、Servlet 处理、二维码生成、Emoji 处理、FTP 操作以及分词等多个方面&#xff0c;为开发者在不同…...

opencv实时二维码识别的一种实现与思路分享

在嵌入式平台上比如 rk3568 这种弱鸡的平台,要做到实时视频处理就非常鸡肋,不像英伟达那种 deepstrem 什么的。 开始的时候,我们使用python 下的 pyzbar + opencv opencv 读取摄像头的数据然后每帧送到 pyzbar 二维码识别函数里面进行处理,然后打印出识别的数字。结果,非常…...

深入剖析Linux C中线程未释放问题

深入剖析 Linux C 中线程未释放问题 在 Linux C 编程中&#xff0c;线程的正确使用对于程序的性能和稳定性至关重要。其中&#xff0c;线程资源的释放是一个容易被忽视但又极为关键的环节。本文将通过具体代码示例&#xff0c;深入探讨线程未释放的问题&#xff0c;并结合进程…...

个人博客5年回顾

https://huangtao01.github.io/ 五年前&#xff0c;看程序羊的b站视频做的blog&#xff0c;受限于网络&#xff0c;只能单向学习&#xff0c;没有人指导与监督&#xff0c;从来没有想过&#xff0c;有没有什么问题&#xff1f; 一、为什么要做个人博客&#xff1f; 二、我是怎么…...

nacos编写瀚高数据库插件

1、下载nacos源码 git clone gitgithub.com:alibaba/nacos.git 2、引入瀚高驱动 <dependency><groupId>com.highgo</groupId><artifactId>jdbc</artifactId><version>${highgo.version}</version></dependency> 3、DataSource…...

bboss v7.3.5来袭!新增异地灾备机制和Kerberos认证机制,助力企业数据安全

ETL & 流批一体化框架 bboss v7.3.5 发布&#xff0c;多源输出插件增加为特定输出插件设置记录过滤功能&#xff1b;Elasticsearch 客户端新增异地双中心灾备机制&#xff0c;提升框架高可用性&#xff1b;Elasticsearch client 和 http 微服务框架增加对 Kerberos 认证支持…...

【编程语言】委托与函数指针

委托与函数指针的相似之处&#xff1a; 指向方法&#xff1a;C# 的委托和 C 的函数指针都可以用来指向一个方法或函数。调用方法&#xff1a;它们都可以通过引用&#xff08;委托或函数指针&#xff09;来调用指向的方法。 委托与函数指针的主要区别&#xff1a; 类型安全&am…...

《Python实战进阶》专栏 No2: Flask 中间件与请求钩子的应用

专栏简介 《Python实战进阶》专栏共68集&#xff0c;分为 模块1&#xff1a;Web开发与API设计&#xff08;共10集&#xff09;&#xff1b;模块2&#xff1a;数据处理与分析&#xff08;共10集&#xff09;&#xff1b;模块3&#xff1a;自动化与脚本开发&#xff08;共8集&am…...

Redis三剑客解决方案

文章目录 缓存穿透缓存穿透的概念两种解决方案: 缓存雪崩缓存击穿 缓存穿透 缓存穿透的概念 每一次查询的 key 都不在 redis 中&#xff0c;数据库中也没有。 一般都是属于非法的请求&#xff0c;比如 id<0&#xff0c;比如可以在 API 入口做一些参数校验。 大量访问不存…...

OpenCV机器学习(8)随机森林(Random Forests)算法cv::ml::RTrees类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::RTrees 是 OpenCV 机器学习模块中的一部分&#xff0c;用于实现随机森林&#xff08;Random Forests&#xff09;算法。随机森林是一种集…...

C++:线程当中的锁专题

在 C 多线程编程中&#xff0c;线程同步是确保程序正确运行的关键环节&#xff0c;而锁机制则是实现线程同步的重要手段。 一、线程的同步之互斥锁 1.1 互斥锁的概念 互斥锁&#xff08;Mutex&#xff0c;即 Mutual Exclusion 的缩写&#xff09;是一种最基本的线程同步工具…...

vue3 文件类型传Form Data数据格式给后端

在 Vue 3 中&#xff0c;如果你想将文件&#xff08;例如上传的 Excel 文件&#xff09;以 FormData 格式发送到后端&#xff0c;可以通过以下步骤实现。这种方式通常用于处理文件上传&#xff0c;因为它可以将文件和其他数据一起发送到服务器。 首先&#xff0c;创建一个 Vue…...

Frp部署文档

Frp部署文档 开源项目地址:https://github.com/fatedier/frp项目中文文档地址&#xff1a;https://github.com/fatedier/frp/blob/dev/README_zh.md官网文档地址: https://gofrp.org/zh-cn/docs/发布包地址&#xff1a;https://github.com/fatedier/frp/releases 要注意对应的…...

创建一个简单的spring boot+vue前后端分离项目

一、环境准备 此次实验需要的环境&#xff1a; jdk、maven、nvm和node.js 开发工具&#xff1a;idea或者Spring Tool Suite 4&#xff0c;前端可使用HBuilder X&#xff0c;数据库Mysql 下面提供maven安装与配置步骤和nvm安装与配置步骤&#xff1a; 1、maven安装与配置 1…...

Spring Boot项目@Cacheable注解的使用

Cacheable 是 Spring 框架中用于缓存的注解之一&#xff0c;它可以帮助你轻松地将方法的结果缓存起来&#xff0c;从而提高应用的性能。下面详细介绍如何使用 Cacheable 注解以及相关的配置和注意事项。 1. 基本用法 1.1 添加依赖 首先&#xff0c;确保你的项目中包含了 Spr…...

124.二叉树中的最大路径和 python

二叉树中的最大路径和 题目题目描述示例 1&#xff1a;示例 2&#xff1a;提示&#xff1a; 题解解决方案步骤Python 实现解释提交结果 题目 题目描述 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多…...