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 # 图像的原始数据
- 光线入射
入射光线:光线从物体反射后进入相机镜头,最终到达相机的感光芯片(图像传感器)。
光线包含红(R)、绿(G)、蓝(B)三种颜色的成分。 - 栅格滤镜
Bayer 栅格滤镜:感光芯片上方覆盖了一层滤镜,称为 Bayer 栅格滤镜。它由红、绿、蓝三种颜色的滤光片以特定的排列方式组成。
滤光片的作用:每个滤光片只允许特定颜色的光线通过:
红色滤光片:只允许红色光线通过。
绿色滤光片:只允许绿色光线通过。
蓝色滤光片:只允许蓝色光线通过。 - 感光芯片
感光芯片:光线通过滤光片后,照射到感光芯片上。感光芯片由许多光敏单元(像素)组成,每个像素只能检测到一种颜色的光强信息。
光强信息:每个像素根据接收到的光强生成电信号,电信号的强度与光强成正比。 - 像素阵列
像素阵列:感光芯片上的像素按照一定的排列方式组成一个二维阵列。每个像素存储的是经过滤光片过滤后的光强信息。
颜色分离:由于每个像素只能检测到一种颜色,因此整个图像被分解为红、绿、蓝三个独立的像素阵列:
红色像素阵列:存储红色光强信息。
绿色像素阵列:存储绿色光强信息。
蓝色像素阵列:存储蓝色光强信息。 - 图像重建
插值算法:为了生成完整的彩色图像,需要对每个像素的颜色信息进行插值。插值算法会根据相邻像素的颜色信息,估计出每个像素的完整 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:原始的、未经处理的图像数据。 /camera/image_rectÿ…...
Zabbix——Rocky9安装zabbix相关步骤记录
安装Zabbix 安装MariaDB 这里用MariaDB演示 https://mariadb.org/download/?trepo-config&dRedHatEnterpriseLinux9&v10.11&r_mneusoft 通过这个网址获得连接 选择对应的repo 根据系统版本和要安装的版本选择对应的repo 安装 新建一个repo文件,例…...
三轴云台之姿态测量篇
一、姿态测量的基本原理 三轴云台通过内置的传感器实时感知其姿态变化。这些传感器主要包括陀螺仪、加速度计和磁力计(在某些高级系统中)。 陀螺仪:用于检测云台的角速度变化,即绕三个轴的旋转速度。陀螺仪提供的数据是姿态测量的…...
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
out(协变) out 关键字用于实现泛型的协变。协变意味着如果 B 是 A 的子类型,那么 Producer<B> 可以被视为 Producer<A> 的子类型。这里的 Producer 是一个使用泛型类型参数的类或接口,并且该泛型类型参数被标记为 ou…...
VSCode 中使用 Snippets 设置常用代码块
背景 在开发中,有很多代码片段是重复的,例如:vue文件中的模版,react 中的模版,打印的 log 等等,很多很多。对于这些重复性的工作,vscode 官方提供了解决方案-Snippets in Visual Studio Code&a…...
在conda虚拟环境中安装jupyter lab-----deepseek问答记录
在 Conda 虚拟环境中安装 Jupyter Lab 的步骤如下: 1. 创建并激活 Conda 虚拟环境 如果你还没有创建虚拟环境,可以使用以下命令创建一个新的虚拟环境并激活它: conda create -n myenv python3.x # 将 myenv 替换为你的环境名称࿰…...
单元测试整理
在国外软件开发中,单元测试必不可少,但是国内并不太重视这一块,一个好的单元测试可以提前发现很多问题,也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…...
计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Java虚拟机面试题:内存管理(下)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【贝克街迷宫疑云:用侦探思维破解Java迷宫算法】
贝克街迷宫疑云:用侦探思维破解Java迷宫算法 "华生,把煤气灯调亮些。"福尔摩斯用放大镜仔细端详着桌上的羊皮纸,“这个案子比表面上看起来要复杂得多——它是个三维的思维迷宫。” 第一幕:离奇委托 1895年秋的伦敦笼…...
网络安全示意图 网络安全路线图
其实网络安全本身的知识点并不算难,但需要学的东西比较多,如果想要从事网络安全领域,肯定是需要系统、全面地掌握清楚需要用到的技能的。 自学的方式基本是通过看视频或者相关的书籍,不论是什么方法,都是很难的&#…...
ubuntu22.04离线安装K8S
1. 准备离线安装包 参考教程离线包准备教程 2. 准备环境 2.1. 准备主机 主机名ip系统k8s-master192.168.38.128ubuntu22.04k8s-node192.168.38.131ubuntu22.04 2.2. 设置host 修改 /etc/hosts 文件,添加master和node节点,需要和主机名保持一致 2…...
985本硕,网络安全方向,走算法还是走开发?
今天给大家分享的是一位粉丝的提问,985本硕,网络安全方向,走算法还是走开发? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: 985本硕ÿ…...
如何清理 Linux 缓存 ?
和其他操作系统一样,Linux 使用缓存来优化系统性能。随着时间的推移,这些缓存可能会累积起来,尽管 Linux 擅长管理内存,但在某些情况下,手动清除可能是有益的,例如用于系统诊断、应用程序性能测试或其他特定…...
cv2库的使用及图像预处理02
目录 八,图像缩放 1. 图像缩放操作 2. 插值方法 (1)最邻近插值(cv2.INTER_NEAREST) (2)双线性插值(cv2.INTER_LINEAR) 3. 显示缩放结果 4. 目标尺寸 5. 总结 九,线性灰度变…...
硬件学习笔记--45 电磁兼容试验-9 无线电干扰抑制试验介绍
目录 电磁兼容试验- 无线电干扰抑制试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验- 无线电干扰抑制试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备(EUT)在经受扫频频带的电磁影响量或电磁干扰的情况下&a…...
P1464 Function(记忆化递归)
#include <bits/stdc.h> using namespace std;#define ll long longll dp[21][21][21]; // dp数组,用来记忆已经计算过的结果ll w(ll a, ll b, ll c) {if (a < 0 || b < 0 || c < 0) {return 1;}if (a > 20 || b > 20 || c > 20) {return …...
OpenCV机器学习(7)人工神经网络 定义模型训练过程中参数的搜索范围cv::ml::ParamGrid 类
OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::ParamGrid 类是 OpenCV 机器学习模块中的一个辅助类,用于定义模型训练过程中参数的搜索范围。它通常被用作某些机器学习算法(如支持向量机 SVM&…...
STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)
目录 一、B2109 统计数字字符个数 - 洛谷 算法代码: 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录: 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一:算法代…...
游戏引擎学习第107天
仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中,讨论了如何处理游戏中的三维效果,特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型,因此实现三维效果变得非常具有挑战性。虽然可…...
网页制作01-html,css,javascript初认识のhtml的基本标记
一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1)头部标…...
WebSocket在分布式环境中的局限性及解决方案
WebSocket 在分布式环境中存在一些局限性,特别是当系统需要扩展多个服务实例时,单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此,必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...
Windows日志分析
查看服务日志文件 windows下我们可以通过时间查看器来查看windows系统下服务,应用,系统等产生的事件以及日志 1.打开方式是: winr 输入eventvwr.msc 2.控制面板--系统与安全--事件查看器 事件类型分为5种 错误:标识问题很严重…...
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试 一、软件测试二、自动化测试三、单元测试四、Django 单元测试(一)、创建测试用例(二)、运行测试(三)、常用测试功能 课题摘要: 本文全面介绍了软件…...
WPF 中为 Grid 设置背景图片全解析
WPF 中为 Grid 设置背景图片全解析 在 WPF(Windows Presentation Foundation)开发中,界面的美观度是吸引用户的重要因素之一。而添加背景图片是提升界面视觉效果的常见手段。今天,我们就来深入探讨在 WPF 里如何为 Grid 设置背景…...
3.10 实战Hugging Face Transformers:从文本分类到模型部署全流程
实战Hugging Face Transformers:从文本分类到模型部署全流程 一、文本分类实战:IMDB电影评论情感分析 1.1 数据准备与预处理 from datasets import load_dataset from transformers import AutoTokenizer # 加载IMDB数据集 dataset = load_dataset("imdb") …...
Android中获取so文件来源于哪个库
Android app中可能有很多的.so文件,有时我们不确定这些.so文件都是来源于哪些库的,可以通过在build.gradle中添加代码来统计。具体方法如下: 1.在com.android.application模块的build.gradle文件最后添加如下代码: // 获取所有的…...
地面沉降监测,为地质安全保驾护航
地面沉降,不容忽视的城市隐患 随着城市化进程的加速,大规模的工程建设、地下水过度开采等因素,导致地面沉降现象日益严重。地面沉降不仅会使建筑物开裂、倾斜,影响其使用寿命和安全性,还会破坏地下管线,引…...
宝塔docker 安装oracle11G
1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...
unity学习39:连续动作之间的切换,用按键控制角色的移动
目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition,使用trigger 1.2 在2个连续状态之间的转换,使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…...
DeepSeek等大模型功能集成到WPS中的详细步骤
记录下将**DeepSeek功能集成到WPS中**的步骤,以备忘。 1. 下载并安装OfficeAI插件 访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 注意,有两个插件࿰…...
基于Python的Flask微博话题舆情分析可视化系统
✅️配套lun文 1w9字 ✅️爬虫可用 12月数据 ✅️实时微博热点分析 技术栈:爬虫➕Flask后端框架➕bert深度学习模型➕mysql数据库系统功能:爬取微博数据(可以是同类型文章或者制定文章),微博文章情感分析,微博评论情感…...
服务器A到服务器B免密登录
#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…...
Unity中可靠的UDP实现
可靠 UDP(Reliable UDP)是一种在用户数据报协议(UDP)基础上,通过添加额外机制来实现可靠数据传输的技术。与传统 UDP 相比,它克服了 UDP 本身不保证数据可靠性、顺序性以及可能丢失数据的缺点,同…...
轮播图html
题十二:轮播图 要求: 1.鼠标不在图片上方时,进行自动轮播,并且左右箭头不会显示;当鼠标放在图片上方时,停止轮播,并且左右箭头会显示; 2.图片切换之后,图片中下方的小圆…...
二十多年前的苹果电源Power Mac G4 Mdd 电源接口
在1999年,苹果推出了最初的Power Mac G4电脑。第一代Power Mac G4有与G3系列相似的外壳和两种主板设置,分别使用PCI和AGP显示总线。第二代电脑被昵称为快银或水银机,来自2001年的它们有更高速的PowerPC 7450系列芯片,增强了L2缓存…...
java听书项目
项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...
RadASM环境,win32汇编入门教程之三
;运行效果 ;win32汇编环境,RadAsm入门教程之三 ;在这个教程里,我们学一下如何增加控件,比如按钮,其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件,可以比较一下,增加了什么内…...
【机器学习】线性回归 多元线性回归
【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 多元线性回归 V1.0多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最…...
线性代数中的正交和标准正交向量
在线性代数中,理解正交向量和正交向量至关重要,尤其是对于机器学习中的应用。这篇博文将简化这些概念,而不会太深入地深入研究复杂的数学。 正交向量 如果两个向量的点积等于零,则认为这两个向量是正交的。但点积到底是什么呢&am…...
Vue 项目登录的基本流程
Vue 用户登录的基本流程包括以下6个步骤: 步骤: 1. 创建登录表单 在前端,首先要创建一个登录表单,用户输入账号(用户名、邮箱、手机号等)和密码。 示例:Login.vue <template><div…...
坐井说天阔---DeepSeek-R1
前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...
Spring 是如何解决循环依赖问题的?
Spring框架通过使用三级缓存机制来解决单例Bean之间的循环依赖问题。以下是详细的解释,包括循环依赖的概念、Spring的解决方案以及三级缓存的具体作用。 什么是循环依赖? 循环依赖是指两个或多个Bean之间相互依赖,形成一个闭环。例如&#…...
【数据可视化-17】基于pyecharts的印度犯罪数据可视化分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
thingboard告警信息格式美化
原始报警json内容: { "severity": "CRITICAL","acknowledged": false,"cleared": false,"assigneeId": null,"startTs": 1739801102349,"endTs": 1739801102349,"ackTs": 0,&quo…...
Javaweb中,使用Servlet编写简单的接口
案例:网页提交用户名和密码信息,后端校验密码长度需在6-12位之间 后端部分 WebServlet("/valid") public class SimpleServlet extends HttpServlet{public void service(HttpServletRequest req, HttpServletResponse resp) throws IOExcepti…...
三层渗透测试-DMZ区域 二三层设备区域
DMZ区域渗透 信息收集 首先先进行信息收集,这里我们可以选择多种的信息收集方式,例如nmap如此之类的,我的建议是,可以通过自己现有的手里小工具,例如无影,密探这种工具,进行一个信息收集。以免…...
Java 开发者需要了解的 PDF 基础知识
PDF 代表“可移植文档格式”(Portable Document Format),它是全球最流行的文件格式。因此,Java 开发人员很可能会经常需要处理它。然而,与 Microsoft Word 或 HTML/XML 这样的格式相比,PDF 并不那么直观。理…...
基于图像处理的裂缝检测与特征提取
一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…...
Webpack 基础入门
一、Webpack 是什么 Webpack 是一款现代 JavaScript 应用程序的静态模块打包工具。在 Web 开发中,我们的项目会包含各种类型的文件,如 JavaScript、CSS、图片等。Webpack 可以将这些文件打包成一个或多个文件,以便在浏览器中高效加载。它就像…...