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ÿ…...

STM32 如何使用DMA和获取ADC
目录 背景 摇杆的原理 程序 端口配置 ADC 配置 DMA配置 背景 DMA是一种计算机技术,允许某些硬件子系统直接访问系统内存,而不需要中央处理器(CPU)的介入,从而减轻CPU的负担。我们可以通过DMA来从外设…...
【JAVA实战】JAVA实现Excel模板下载并填充模板下拉选项数据
背景 有这样一个场景:前端下载Excel模板,进行数据导入,这个下载模板过程需要经过后端接口去数据库查询数据进行某些列的下拉数据填充,下拉填充的数据过程中会出现错误String literals in formulas can’t be bigger than 255 cha…...
java面试笔记(一)
1. 一万个string类型的数据,设计一个算法如何按照String长度来排序 以使用 Arrays.sort() 方法,并结合一个自定义的比较器。以下是实现的示例代码: public class StringLengthSort {public static void main(String[] args) {// 定义一万个字符串的示例…...

【C++】36.C++IO流
文章目录 1. C语言的输入与输出2. 流是什么3. CIO流3.1 C标准IO流3.2 C文件IO流 4. stringstream的简单介绍 1. C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中。pri…...
Qt5开发入门指南:从零开始掌握跨平台开发
目录 Qt框架概述 开发环境搭建 基础语法与核心机制 第一个Qt窗口程序 常见问题解答 一、Qt框架概述 1.1 什么是Qt? Qt是一个1995年由挪威Trolltech公司开发的跨平台C图形用户界面应用程序框架。最新Qt5版本主要包含: GUI模块:支持Wind…...

Rook-ceph(1.92最新版)
安装前准备 #确认安装lvm2 yum install lvm2 -y #启用rbd模块 modprobe rbd cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules do[ -x \$file ] && \$file done EOF cat > /etc/sysconfig/modules/rbd.modules &l…...
深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
一、蛋白质-蛋白质相互作用(PPI)的定义与生物学意义 蛋白质-蛋白质相互作用(Protein-Protein Interaction, PPI)是指两个或多个蛋白质通过物理结合形成复合物,进而调控细胞信号传导、代谢、免疫应答等生命活动的过程。PPI是生物体内复杂功能网络的核心,例如酶与底物的结…...

网络安全学习架构 网络安全架构内容
网上买的《信息安全原理及应用》的书还没到,就找了一本《密码编码学与网络安全》的电子书,写的也不错,计划今天和明天把第一章绪论和第二章的数论给看完 1. 计算机网络安全概念 计算机安全的三个核心是:完整性(只要特…...

硕成C语言24
不管风吹浪打,胜似闲庭信步! 1.选择排序: 不管风吹浪打,胜似闲庭信步!1.选择排序: // 这个宏定义用于忽略 Visual Studio 中一些安全相关的警告,使得可以使用像 scanf 这样的函数而不产生警告…...
《Stable Diffusion绘画完全指南:从入门到精通的Prompt设计艺术》-配套代码示例
第一章:模型加载与基础生成 1.1 基础模型加载 from diffusers import StableDiffusionPipeline import torch# 加载SD 1.5基础模型(FP32精度) pipe StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5",…...

Linux下为Intel核显安装OpenCL
实验环境 CPU:N5105运行内存:32G系统:almalinux 8 (类似CentOS系统) 安装过程 检查i915驱动 输入命令dmesg | grep i915查看驱动的加载信息。 我这里没接显示器,输出正确的驱动加载信息如下图所示&…...

用deepseek学大模型04-机器学习建模过程
https://metaso.cn/s/7tEmBHr 目前已经学完深度学习的数学基础,给出机器学习建模的基本过程 好的,我现在需要回答用户的问题:已经学完深度学习的数学基础,现在要给出机器学习建模的基本过程。我需要结合我搜索到的资料来构建一个详…...

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接
目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…...

Unity3D实现接入DeepSeek对话
系列文章目录 unity知识点 文章目录 系列文章目录👉前言👉一、使用第一步👉1-1、登录注册DeepSeek👉1-2、创建API-key👉二、使用第二步👉三、使用第三步👉壁纸分享👉总结👉前言 随着人工智能和机器学习技术的不断进步,DeepSeek的未来发展趋势充满了无限可能…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析②】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase02 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-002测试用例 用例ID测试场景验证要点参考条款预期…...

前端新手必看:10 大 UI 组件库全面解析,快速搭建高质量 Web 应用」 「从零开始:Vue 和 React 最受欢迎的 UI 组件库入门指南」 「超实用!PC 端和移动端 UI 组件库推荐与实战
前端新手必看:10 大 UI 组件库全面解析,快速搭建高质量 Web 应用 目录 什么是 UI 组件库?为什么需要 UI 组件库?PC 端 UI 组件库推荐 Ant DesignElement UIVuetifyBootstrapVueiView (View UI)Quasar FrameworkMaterial-UI (MUI…...

【MySQL高级】17 - MySQL中常用工具
1. mysql 该mysql不是指mysql服务,而是指mysql的客户端工具。语法: mysql [options] [database]1.1 连接选项 参数 : -u, --username 指定用户名-p, --password[name] 指定密码-h, --hostname 指定服务器IP或域名-P, --por…...

【Linux】Linux 文件系统——有关 inode 不足的案例
ℹ️大家好,我是练小杰,今天周二了,明天星期三,还有三天就是星期五了,坚持住啊各位!!!😆 本文是对之前Linux文件权限中的inode号进行实例讨论,看到博客有错误…...

计算机视觉:卷积神经网络(CNN)基本概念(二)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络(附代码) 第五章࿱…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...