4:机器人目标识别无序抓取程序二次开发
判断文件是否存在
//判断文件在不在
int HandEyeCalib::AnsysFileExists(QString FileAddr)
{QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddr+QString::fromLocal8Bit("文件不存在"));return -1;}else{return 0;}
}
图像九点坐标的获取与显示
1.首先进行九点标定
在UI界面上添加九点标定QT设计师类
在主程序中声明此类头文件,并添加此界面
.h文件
private:
//手眼标定类HandEyeCalib *m_PHandEyeCalib=NULL;
.cpp文件
m_PHandEyeCalib=new HandEyeCalib();ui->MainTab->addTab(m_PHandEyeCalib,QString::fromLocal8Bit("标定"));if(m_PHandEyeCalib!=NULL){delete m_PHandEyeCalib;m_PHandEyeCalib=NULL;}
第一步应该是打开一张拍摄好的九点图像,或者是打开相机现场采集。
则读图操作为:
//读图
void HandEyeCalib::on_pB_OpenImage_clicked()
{//调取 不同的图像 在这里完成测试//传入路径QString path = QFileDialog::getOpenFileName(this,"选择图片","","JPG文件(*.jpg;*.bmp)");if(path == "") return;//read imageHTuple file2=HTuple(path.toStdString().c_str());ReadImage(&halconImage,file2);//2592 1544SetPart(WindowHandle, 0, 0, 1544, 2592);DispObj(halconImage,WindowHandle);
}
绘制像素坐标点或者圆
可以现在HALCON中编写程序,如何导出C++添加到QT中
//绘制点
void MainWindow::on_action_triggered()
{HObject Cross;DrawPoint(WindowHandle, &Row, &Column);GenCrossContourXld(&Cross, Row, Column, 116, 0.785398);DispObj(Cross, WindowHandle);
}
由于绘制的点,在九点标定类中需要用到,所以要把得到的XY坐标点声明在全局变量中
HTuple Row, Column; //绘制点
然后在九点标定类的上面引用这两个变量(这是个通用方法,如果两个类都需要用到同一个变量,则可以使用此方法;也可以利用信号与槽机制)
extern HTuple Row, Column; //画点 -
在得到像素点之后,则可以显示加载在界面上
//加载显示像素点
void HandEyeCalib::on_pB_LoadPixelCoord_clicked()
{// Row 的长度为0// try catch ----HTuple Length;TupleLength(Row, &Length);if(Length[0].D()==0){QMessageBox::warning(this,"warning",QString::fromLocal8Bit("数据异常"));return;}//点1if(ui->spinBox_PointNum2->value()==1){//界面的点1 的 xy 更新为 row columnui->x_17->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_17->setValue(Column[0].D());}//点2if(ui->spinBox_PointNum2->value()==2){//界面的点1 的 xy 更新为 row columnui->x_18->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_18->setValue(Column[0].D());}//点3if(ui->spinBox_PointNum2->value()==3){//界面的点1 的 xy 更新为 row columnui->x_19->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_19->setValue(Column[0].D());}//点4if(ui->spinBox_PointNum2->value()==4){//界面的点1 的 xy 更新为 row columnui->x_20->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_20->setValue(Column[0].D());}//点5if(ui->spinBox_PointNum2->value()==5){//界面的点1 的 xy 更新为 row columnui->x_21->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_21->setValue(Column[0].D());}//点6if(ui->spinBox_PointNum2->value()==6){//界面的点1 的 xy 更新为 row columnui->x_22->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_22->setValue(Column[0].D());}//点7if(ui->spinBox_PointNum2->value()==7){//界面的点1 的 xy 更新为 row columnui->x_23->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_23->setValue(Column[0].D());}//点8if(ui->spinBox_PointNum2->value()==8){//界面的点1 的 xy 更新为 row columnui->x_24->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_24->setValue(Column[0].D());}//点9if(ui->spinBox_PointNum2->value()==9){//界面的点1 的 xy 更新为 row columnui->x_25->setValue(Row[0].D()); //HTUPLE 转换为 doubleui->y_25->setValue(Column[0].D());}}
机械臂坐标的获取与显示
包含库目录
include文件
lib文件
realse文件
.pro目录
INCLUDEPATH += $$PWD/include/libfairinoLIBS += -L$$PWD/lib/FairinoLib/ -lfairino
LIBS += -L$$PWD/lib/FairinoLib/ -lfairinod
头文件声明
#include <QWidget>
#include "robot.h"
#ifdef WINDOWS_OPTION
#include <string.h>
#include <windows.h>
#elif LINUX_OPTION
#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <unistd.h>
#endif#include <chrono>
#include <thread>
添加机械臂的UI类,并在主函数中声明添加界面
.h文件
//法奥机器人类FairinoRobtics *m_pFairinoRobtics=NULL;
.cpp文件
//机器人UI类的实例化m_pFairinoRobtics= new FairinoRobtics();ui->MainTab->addTab(m_pFairinoRobtics,QString::fromLocal8Bit("法奥机器人"));if(m_pFairinoRobtics!=NULL){delete m_pFairinoRobtics;m_pFairinoRobtics=NULL;}
获取坐标
在机械臂类中,实例化具体的对象 —名字叫:robot
FRRobot robot;//声明机器人对象
连接机械臂
void FairinoRobtics::on_pushButton_2_clicked()
{robot.RPC("192.168.1.2");
}
获取当前坐标点
void FairinoRobtics::on_ptn_ModifyA_clicked()
{GetTargetTCPPose(nowPos);//获取坐标函数RobX=nowPos.tran.x;RobY=nowPos.tran.y;}//获取坐标定义
void FairinoRobtics::GetTargetTCPPose(DescPose &nowPos)
{int ret=robot.GetActualTCPPose(0,&nowPos);ui->Dx->setValue(nowPos.tran.x);ui->Dy->setValue(nowPos.tran.y);ui->Dz->setValue(nowPos.tran.z);ui->Drx->setValue(nowPos.rpy.rx);ui->Dry->setValue(nowPos.rpy.ry);ui->Drz->setValue(nowPos.rpy.rz);}
机械臂走点
void FairinoRobtics::on_pushButton_clicked()
{DescPose desc_pos;//创建一个笛卡尔空间位置数据memset(&desc_pos, 0, sizeof(DescPose));//初始化笛卡尔空间位置数据double x = ui->Dx->value();//取得ui空间的值(doubleSpinBox)double y = ui->Dy->value();//取得ui空间的值(doubleSpinBox)double z = ui->Dz->value();//取得ui空间的值(doubleSpinBox)double rx = ui->Drx->value();//取得ui空间的值(doubleSpinBox)double ry = ui->Dry->value();//取得ui空间的值(doubleSpinBox)double rz = ui->Drz->value();//取得ui空间的值(doubleSpinBox)desc_pos.tran.x = x; //为desc_pos赋值desc_pos.tran.y = y;desc_pos.tran.z = z;desc_pos.rpy.rx = rx;desc_pos.rpy.ry = ry;desc_pos.rpy.rz = rz;int tool = ui->sTool->value();int user = ui->sUser->value();double vel = 100;double acc = 100;double ovl = 100;double blendT = -1;double config = -1;robot.MoveCart(&desc_pos,tool,user,vel,acc,ovl,blendT,config);
}
在获取到坐标之后,需要把前两个参数传给九点标定的类中,所以需要把下面这两个坐标声明为全局变量
double RobX=1.5;
double RobY=1.6;
然后在九点标定类中引用这两个点
extern double RobX;
extern double RobY;
加载显示机械臂的点
void HandEyeCalib::on_pB_LoadRobCoord_clicked()
{if(ui->spinBox_PointNum1->value()==1) //value 获取值{ui->x_1->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_1->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==2) //value 获取值{ui->x_2->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_2->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点3if(ui->spinBox_PointNum1->value()==3) //value 获取值{ui->x_3->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_3->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==4) //value 获取值{ui->x_4->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_4->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==5) //value 获取值{ui->x_5->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_5->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==6) //value 获取值{ui->x_6->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_6->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==7) //value 获取值{ui->x_7->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_7->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==8) //value 获取值{ui->x_8->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_8->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}//点2if(ui->spinBox_PointNum1->value()==9) //value 获取值{ui->x_9->setValue(RobX); //机器人类的变量 extern 引用,赋值 设置值ui->y_9->setValue(RobY); //机器人类的变量 extern 引用,赋值 设置值}
}
上面已经完整对像素和机械臂的坐标加载显示;为了方便需要保存这些点
//保存所有点
void HandEyeCalib::on_pB_SaveParamters_clicked()
{//机器人坐标 ---QSeting ,htuple WriteTuple//像素坐标 PixelX,PixelYHTuple RobX,RobY,PixelX,PixelY;RobX = HTuple();RobX[0]=ui->x_1->value();RobX[1]=ui->x_2->value();RobX[2]=ui->x_3->value();RobX[3]=ui->x_4->value();RobX[4]=ui->x_5->value();RobX[5]=ui->x_6->value();RobX[6]=ui->x_7->value();RobX[7]=ui->x_8->value();RobX[8]=ui->x_9->value();RobY = HTuple();RobY[0]=ui->y_1->value();RobY[1]=ui->y_2->value();RobY[2]=ui->y_3->value();RobY[3]=ui->y_4->value();RobY[4]=ui->y_5->value();RobY[5]=ui->y_6->value();RobY[6]=ui->y_7->value();RobY[7]=ui->y_8->value();RobY[8]=ui->y_9->value();PixelX=HTuple();PixelX[0]=ui->x_17->value();PixelX[1]=ui->x_18->value();PixelX[2]=ui->x_19->value();PixelX[3]=ui->x_20->value();PixelX[4]=ui->x_21->value();PixelX[5]=ui->x_22->value();PixelX[6]=ui->x_23->value();PixelX[7]=ui->x_24->value();PixelX[8]=ui->x_25->value();PixelY = HTuple();PixelY[0]=ui->y_17->value();PixelY[1]=ui->y_18->value();PixelY[2]=ui->y_19->value();PixelY[3]=ui->y_20->value();PixelY[4]=ui->y_21->value();PixelY[5]=ui->y_22->value();PixelY[6]=ui->y_23->value();PixelY[7]=ui->y_24->value();PixelY[8]=ui->y_25->value();//判断文件夹是否存在QString FileAddr="./data/Param";QFile File1(FileAddr);if(File1.exists()){WriteTuple(RobX, "./data/Param/robX.tup");WriteTuple(RobY, "./data/Param/robY.tup");WriteTuple(PixelX, "./data/Param/RowS.tup");WriteTuple(PixelY, "./data/Param/ColumnS.tup");ui->textBrowser->append(QString::fromLocal8Bit("保存成功"));}else{ui->textBrowser->append(FileAddr+QString::fromLocal8Bit("文件不存在,无法保存"));}}
重新读图保存的坐标
void HandEyeCalib::on_pB_LoadParameters_clicked()
{HTuple RobX,RobY;QString FileAddr="./data/Param";QFile File1(FileAddr);try{if(File1.exists()){ReadTuple("./data/Param/robX.tup", &RobX);ReadTuple("./data/Param/robY.tup", &RobY);ui->textBrowser->append(QString::fromLocal8Bit("读取成功"));ui->x_1->setValue(RobX[0].D());ui->x_2->setValue(RobX[1].D());ui->x_3->setValue(RobX[2].D());ui->x_4->setValue(RobX[3].D());ui->x_5->setValue(RobX[4].D());ui->x_6->setValue(RobX[5].D());ui->x_7->setValue(RobX[6].D());ui->x_8->setValue(RobX[7].D());ui->x_9->setValue(RobX[8].D());ui->y_1->setValue(RobY[0].D());ui->y_2->setValue(RobY[1].D());ui->y_3->setValue(RobY[2].D());ui->y_4->setValue(RobY[3].D());ui->y_5->setValue(RobY[4].D());ui->y_6->setValue(RobY[5].D());ui->y_7->setValue(RobY[6].D());ui->y_8->setValue(RobY[7].D());ui->y_9->setValue(RobY[8].D());}else{ui->textBrowser->append(FileAddr+QString::fromLocal8Bit("文件不存在,无法保存"));}}catch(...){ui->textBrowser->append(FileAddr+QString::fromLocal8Bit("文件缺失"));}}
因为保存点和重新读图点,都是数组点;可以现在HALCON软件中写好程序,然后导出更方便
最终生成标定文件
void HandEyeCalib::on_pB_GenCalibResult_clicked()
{HTuple RowS, ColumnS, RobX, RobY;HTuple HomMat2D;//1.获取 4---9个点的 像素坐标系RowS = HTuple();ColumnS = HTuple();RobX = HTuple();RobY = HTuple();QString FileAddr;FileAddr="./data/Param/robX.tup";//判断文件在不在int ret=AnsysFileExists( FileAddr);if(ret==-1){return;}FileAddr="./data/Param/robY.tup";ret=AnsysFileExists( FileAddr);if(ret==-1){return;}FileAddr="./data/Param/RowS.tup";ret=AnsysFileExists( FileAddr);if(ret==-1){return;}FileAddr="./data/Param/ColumnS.tup";ret=AnsysFileExists( FileAddr);if(ret==-1){return;}try{ReadTuple("./data/Param/robX.tup", &RobX);ReadTuple("./data/Param/robY.tup", &RobY);ReadTuple("./data/Param/RowS.tup", &RowS);ReadTuple("./data/Param/ColumnS.tup", &ColumnS);//生成一个矩阵 HomMat2DVectorToHomMat2d(RowS, ColumnS, RobX, RobY, &HomMat2D);WriteTuple(HomMat2D, "./data/Param/HomMat2D.tup"); //标定文件QMessageBox::warning(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("创建标定矩阵成功"));return;}catch(...){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("创建标定矩阵失败"));return;}}
HALCON程序附录
保存、读图数组、绘制点、绘制圆
九点标定
*1.获取 4---9个点的 像素坐标系RowS:=[]ColumnS:=[]RobX:=[]RobY:=[]dev_open_window(0, 0, 512, 512, 'black', WindowHandle)* read_image(Image, '标定')
* draw_circle(WindowHandle, Row, Column, Radius)
* CenterCoord:=[Row, Column]Pose:=[253.871, 342.389]write_tuple(Pose,'./像素/Pose0.dat')Pose:=[253.487, 591.21]write_tuple(Pose,'./像素/Pose1.dat')Pose:=[251.388, 849.435]write_tuple(Pose,'./像素/Pose2.dat')Pose:=[496.451, 340.278]write_tuple(Pose,'./像素/Pose3.dat')Pose:=[499.304, 590.602]write_tuple(Pose,'./像素/Pose4.dat')Pose:=[502.83, 851.243]write_tuple(Pose,'./像素/Pose5.dat')Pose:=[707.115, 339.089]write_tuple(Pose,'./像素/Pose6.dat')Pose:=[700.256, 591.442]write_tuple(Pose,'./像素/Pose7.dat')Pose:=[694.649, 853.365]write_tuple(Pose,'./像素/Pose8.dat')*获取9个点的像素点for I := 0 to 8 by 1FileName:='./像素/Pose'+I+'.dat'read_tuple(FileName, Pose)RowS[I]:=Pose[0]ColumnS[I]:=Pose[1]endfor*获取9个点的机械手坐标*2获取4---9个点 机械手 坐标! (mm)for I := 11 to 19 by 1FileName:='./坐标/Pose'+I$'01d'+'.dat'read_pose(FileName, Pose)RobX[I-11]:=Pose[0]RobY[I-11]:=Pose[1]endfor*两者进行仿射变换 ,就可以得到 像素坐标和 机械手坐标的变换 。 *相机固定位置 , 机械手 定点拍照 都可以使用 *如果机械手移动拍照 , + 机械手 和标定 时刻拍照间的差值 !*生成一个矩阵 HomMat2Dvector_to_hom_mat2d(RowS ,ColumnS,RobX,RobY, HomMat2D)write_tuple(HomMat2D, 'HomMat2D')**识别图像的坐标 假如是RowS[0] ,ColumnS[0]*根据 这个矩阵 能否求出机械手坐标!Row1:=512Column1:= 640affine_trans_point_2d(HomMat2D,253.871, 342.389,Qx, Qy)
TCP标定
1.法兰盘姿态换算到工具姿态
*法兰盘坐标 换算到 工具末端坐标*X219.108Y579.008Z364.915RX-179.026RY0.549RZ-64.079,2*法兰盘 坐标 记录pose1:=[219.108,579.008,364.915,-179.026,0.549,-64.079,2]*坐标换算 旋转轴2 换算到旋转轴0convert_pose_type(pose1, 'Rp+T', 'gba', 'point', Pose11)*标定的 工具与法兰盘的 位置 tcptcpPose:=[-5.593,7.166,249.3040,0,0,0,0]*法兰盘 换算到 工具坐标系pose_compose( Pose11,tcpPose, PoseCompose1)*工具坐表 旋转 状态变换convert_pose_type(PoseCompose1, 'Rp+T', 'abg', 'point', Pose22)if(Pose22[3]>180)Pose22[3]:=Pose22[3]-360 endifif(Pose22[4]>180)Pose22[4]:=Pose22[4]-360 endifif(Pose22[5]>180)Pose22[5]:=Pose22[5]-360 endif*Pose22 就是最终的姿态结果*[212.986, 584.908, 115.59, 180.92, 0.636037, 64.0786,2]
2.工具姿态换算到法兰盘姿态
* 工具末端坐标换算到法兰盘坐标 *X212.988Y584.915Z115.59RX-179.026RY0.549RZ-64.079Pose22:=[212.986, 584.908, 115.59, -179.026, 0.549, -64.079, 2]*坐标换算 旋转轴2 换算到旋转轴0convert_pose_type(Pose22, 'Rp+T', 'gba', 'point', Pose2)*标定的 工具与法兰盘的 位置 tcptcpPose:=[-5.593,7.166,249.3040,0,0,0,0]*对标定结果进行逆变换pose_invert(tcpPose, PoseInvert1)pose_compose( Pose2, PoseInvert1, Pose11)*工具坐表 旋转 状态变换convert_pose_type(Pose11, 'Rp+T', 'abg', 'point', Pose1)if(Pose1[3]>180)Pose1[3]:=Pose1[3]-360 endifif(Pose1[4]>180)Pose1[4]:=Pose1[4]-360 endifif(Pose1[5]>180)Pose1[5]:=Pose1[5]-360 endif*Pose1 就是最终的姿态结果*[219.108, 579.008, 364.915, -179.026, 0.549, -64.079, 2]*法兰盘 坐标 记录*pose1:=[219.108,579.008,364.915,-179.026,0.549,-64.079,2]
已经看到这里了,点个赞和关注吧!
刚开始写文章,如有不足请多多包含;之后会持续更新关于(halcon学习,VS联合编程,QT联合编程,C++,C#,Opencv图像处理库,三维点云库pcl,相机以及机器人的二次开发)等系统化学习文章。
相关文章:
4:机器人目标识别无序抓取程序二次开发
判断文件是否存在 //判断文件在不在 int HandEyeCalib::AnsysFileExists(QString FileAddr) {QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddrQString::fromLocal8Bit("文件不存在"));retu…...
数据结构篇:线性表的另一表达—链表之单链表(下篇)
目录 1.前言 2.是否使用二级指针 3.插入/删除 3.1 pos位置前/后插入 3.2 查找函数 3.3 pos位置删除 3.4 pos位置后面删除 3.5 函数的销毁 4.断言问题 4.1 断言pphead 4.2 断言*pphead 5.三个文件的代码 5.1 头文件 5.2 具体函数实现 5.3 测试用例 1.前言 之前是讲…...
C# 异步详解
C# 异步编程详解 一、异步编程基础概念 1. 同步 vs 异步 同步(Synchronous):任务按顺序执行,前一个任务完成后才会执行下一个异步(Asynchronous):任务可以非阻塞地启动,主线程可以继续执行其他操作 2. 异步编…...
X²+1素数问题
X1素数问题是与哥德巴赫猜想和孪生素数猜想同时代的著名数学难题。是否有无穷个正整数x,使得x1总是素数? 其困难程度不亚于哥德巴赫猜想。特别是100多年以来,许许多多一流数论学者对这个问题进行了研究。 X1素数 X1素数是一个著名的猜想&…...
【自定义控件实现最大高度和最大宽度实现】
背景 开发中偶尔遇到控件宽度或者高度在自适应的情况下,有个边界值,也就是最大值。 比如高度自适应的情况下最大高度300dp这种场景。 实现 关键节点代码: Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)…...
基于C++的IOT网关和平台4:github项目ctGateway交互协议
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。 源码指引:github源码指引_初级代码游戏的博客-CSDN博客 …...
DeepSeek谈《凤凰项目 一个IT运维的传奇故事》
《凤凰项目:一个IT运维的传奇故事》(The Phoenix Project: A Novel About IT, DevOps, and Helping Your Business Win)是Gene Kim、Kevin Behr和George Spafford合著的一部小说,通过虚构的故事生动展现了IT运维中的核心挑战和Dev…...
Spyglass:官方Hands-on Training(一)
相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 本文是对Spyglass Hands-on Training中第一个实验的翻译(有删改),Lab文件可以从以下链接获取。Spyglass Hands-on Traininghttps:…...
10.idea中创建springboot项目_jdk17
10.idea中创建springboot项目_jdk17 1. 准备工作 安装 JDK 17: 确保已安装 JDK 17,并配置环境变量 JAVA_HOME 指向 JDK 17 的安装路径。在 IntelliJ IDEA 中验证 JDK 配置:File → Project Structure → SDKs。 安装 IntelliJ IDEA&#x…...
指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?
1. GCC 自动循环展开是怎么展开的? 当你使用 -O3 这样的优化选项时,GCC 会分析你的循环。如果它认为展开循环有利可图,它会做类似这样的事情(概念上的): 原始循环 (Conceptual C Code): for (int i 0; i …...
hadoop伪分布式模式
以下是 Hadoop 伪分布式模式(Pseudo-Distributed Mode)的环境搭建步骤。伪分布式模式下,Hadoop 的各个组件(如 HDFS、YARN、MapReduce)以独立进程运行,但所有服务均部署在单台机器上,模拟多节点…...
C++入门小馆: 模板
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
# 基于 Python 和 jieba 的中文文本自动摘要工具
基于 Python 和 jieba 的中文文本自动摘要工具 在信息爆炸的时代,快速准确地提取文本核心内容变得至关重要。今天,我将介绍一个基于 Python 和 jieba 的中文文本自动摘要工具,帮助你高效地从长文本中提取关键信息。 一、背景与需求 在处理…...
.NET平台用C#在PDF中创建可交互的表单域(Form Field)
在日常办公系统开发中,涉及 PDF 处理相关的开发时,生成可填写的 PDF 表单是一种常见需求,例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同,带有**表单域(Form Field)**的文档支持…...
Azure AI Foundry实战:从零开始构建智能应用
1. 引言 在人工智能快速发展的今天,如何高效地开发和部署AI应用已成为众多开发者和企业关注的焦点。微软的Azure AI Foundry应运而生,为AI应用开发提供了一站式解决方案。本文将带您深入了解Azure AI Foundry,并通过实战指南,帮助您从零开始构建智能应用。 2. Azure AI Found…...
YOLO视觉模型可视化训练与推理测试工具
推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…...
数据清洗的定义跟实际操作
数据清洗的定义 数据清洗(Data Cleaning) 是指对原始数据进行处理,以纠正、删除或填补不完整、不准确、重复或无关的数据,使其符合分析或建模的要求。数据清洗是数据预处理的关键步骤,直接影响后续分析和机器学习模型…...
如何用AI生成个人职业照/西装照?
一、核心工具推荐与对比 1. 搜狐简单AI • 特点: • 一键生成:上传1张生活照,AI自动生成职业照/西装照,支持商务精英、韩系女主等20模板。 • 自然微调:优化五官比例、柔化法令纹,保留个人特色࿰…...
Ecology中拦截jquery.ajax请求接口后的数据
功能:获取调用接口之后的数据在进行返回参数重写 首先ecology中一般直接看不到源码的,为什么知道是jquery.ajax请求呢,需要用到开发者工具 点开这里之后就能知道调用接口具体走的是什么逻辑然后返回值又做了哪些操作 一般来说,文…...
基于站点观测的中国1km土壤湿度日尺度数据集(2000-2022)
A 1 km daily soil moisture dataset over China based on in-situ measurement (2000-2022) 关键数据集分类地表参数数据集时间分辨率日空间分辨率1km - 10km共享方式开放获取数据大小592.76 GB数据时间范围 1999-12-31 — 2022-12-31 元数据更新时间2024-08-09 数据集摘要 …...
Django 自定义celery-beat调度器,查询自定义表的Cron表达式进行任务调度
学习目标: 通过自定义的CronScheduler调度器在兼容标准的调度器的情况下,查询自定义任务表去生成调度任务并分配给celery worker进行执行 不了解Celery框架的小伙伴可以先看一下我的上一篇文章:Celery框架组件分析及使用 学习内容ÿ…...
第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题
一、选择题 第 1 题 单选题 题目:在 C++ 中下列哪个不属于字符型常量 ( )。 A. ‘a’ B. ‘\x2A’ C. ‘@’ D. “F” 答案:D 解析:字符型常量使用单引号括起单个字符(如 A、C),或转义字符(如 B 中的十六进制转义字符)。D 选项 “F” 使用双引号,属于字符串常量,而…...
windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)
服务器数据库的搭建和远程访问 mysql数据库安装(详细) window安装mysql详细流程 路程:重设MySQL5密码,发现远程服务器原本有一个MySQL5,尝试在服务器本地建立连接被拒绝,因为不知道密码。 (1…...
w~大模型~合集14
我自己的原文哦~ https://blog.51cto.com/whaosoft/13884560 #Attention as an RNN Bengio等人新作:注意力可被视为RNN,新模型媲美Transformer,但超级省内 , 既能像 Transformer 一样并行训练,推理时内存需求又不随 token 数…...
2025平航杯—团队赛
2025平航杯团队赛 计算机取证 分析起早王的计算机检材,起早王的计算机插入过USB序列号是什么(格式:1)分析起早王的计算机检材,起早王的便签里有几条待干(格式:1)分析起早王的计算机检材,起早王的计算机默认浏览器是什…...
5、SpringBoot整合RabbitMQ
5.1 工作队列模式 1、生产者 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…...
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning Describe Anything: Detailed Localized Image and Video Captioning PDF: https://arxiv.org/pdf/2504.16072 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: htt…...
Seata客户端@GlobalTransactional核心源码解析
文章目录 前言一、GlobalTransactional1.1、wrapIfNecessary1.2、handleGlobalTransaction1.3、invoke 二、总结 前言 Seata是阿里开源的分布式事务解决方案。在Spring传统的事务中,开启事务,执行事务,回滚/提交事务,统一由Spring…...
某大麦某眼手机端-抢票
引言 仅供学习研究,欢迎交流 抢票难,难于上青天!无论是演唱会、话剧还是体育赛事,大麦网的票总是秒光。作为一名技术爱好者,你是否想过用技术手段提高抢票成功率?本文将为你揭秘大麦手机端抢票的核心技术…...
深入探索ChatClient:简化AI模型交互的强大工具
深入探索ChatClient:简化AI模型交互的强大工具 前言 在人工智能飞速发展的当下,大语言模型(LLM)的应用越来越广泛。然而,构建基于LLM的应用程序并非易事,通常需要多个组件协同工作,如提示词模…...
AI 知识库:企业知识管理的利器
在数字化转型的今天,企业每天都会产生海量的信息和数据。从客户资料到内部文档,从市场调研到项目经验,这些宝贵的知识资源构成了企业的核心竞争力。然而,你是否注意到这样一个问题:很多企业在快速发展的同时࿰…...
【STM32实物】基于STM32的RFID多卡识别语音播报系统设计
演示视频: 基于STM32的RFID多卡识别语音播报系统设计 前言:本项目可实现多个电子标签IC卡RFID识别,刷卡识别后进行中文语音播报反馈,同时进行控制对应的灯光开关。以此也可扩展开发更多功能。 本项目所需主要硬件包括:STM32F103C8T6最小系统板、RFID-RC522模块、五个IC电…...
[实战] Petalinux驱动开发以及代码框架解读
目录 Petalinux驱动开发以及代码框架解读一、引言二、步骤2.1 创建PetaLinux工程2.2 配置硬件描述文件2.3 设备树配置2.4 建立驱动框架2.5 编辑 .bb 文件2.6 编写驱动文件2.7 编写 Makefile2.8 验证配方配置2.9 集成驱动到 RootFS2.10 全系统编译与部署2.11 启动验证 三、框架解…...
ArcGIS Pro几个小知识点分享
相信熟悉ArcGIS 10.X系统的朋友接触ArcGIS Pro或者QGIS的上手难度都很低,因此向大家分享我最近才注意到的一些ArcGIS Pro小的知识点或者注意事项等,用来查缺补漏。如果是GIS新手小白,建议先去了解GIS相关理论基础,再摸索GIS相关软…...
运维仙途 第1章 灵机突现探监控
第1章 灵机突现探监控 情节梗概 凌运维本是青云门杂役弟子,负责看守藏经阁灵脉枢纽。某日子夜,护山大阵突然灵力紊乱,阁中古籍无风自动。危急时刻,他意外触发祖师留下的「混沌钟」,获得观测灵脉状态的能力… 技术映…...
深入解析Java架构师面试:从核心技术到AI应用
深入解析Java架构师面试:从核心技术到AI应用 在互联网大厂的Java求职者面试中,技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构(拥有十年研发及架构设计经验)之间的对话为背景,详细展示了…...
Grounding DINO
论文标题: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 代码地址: GitHub - IDEA-Research/GroundingDINO: [ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO …...
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践 一、MCP的本质:标准化共识的协议框架 MCP(Model Context Protocol)是Anthropic于2024年提出的开放通信协议,其核心价值在于建立自然语言…...
区块链+医疗:破解数据共享困局,筑牢隐私安全防线
在医疗健康领域,数据共享与隐私保护一直是一对难以调和的矛盾。一方面,分散在不同机构的医疗数据(如电子病历、检查报告、用药记录)阻碍了诊疗效率和科研进展;另一方面,患者隐私泄露事件频发,加…...
Arduino IDE中更新esp32 3.2.0版本的办法
在Arduino IDE中更新esp32-3.2.0版本是个不可能的任务,下载文件速度极慢。网上提供了离线的办法,提供了安装文件,但是没有3.2.0的版本。 下面提供了一种离线安装方法 一、腾讯元宝查询解决办法 通过打开开发板管理地址:通过在腾…...
关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146354088 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
毫米波通信的技术挑战与解决方案
毫米波通信的技术挑战与解决方案 随着5G技术的迅速发展,毫米波通信(Millimeter Wave, mmWave)作为一种具有巨大潜力的通信技术,正在成为实现超高速数据传输、低延迟和大规模连接的关键。然而,毫米波通信虽然在理论上具…...
软考中级-软件设计师 数据库(手写笔记)
基本概念 数据库分析设计过程 E-R模型 关系模式 关系模式相关名词和完整性约束和关系的三种类型 七种基本算法 并交查和笛卡尔积 投影选择和连接 题 规范化-函数依赖 求候选码 非规范化可能处于的问题 问题 题 关系-模型分解 事务管理 备份和恢复 数据仓库和数据挖掘...
Compose笔记(二十一)--AnimationVisibility
这一节主要了解一下Compose的AnimationVisibility,AnimatedVisibility 是 Jetpack Compose 里用于实现组件可见性动画效果的组件,借助它能让组件在显示和隐藏时带有平滑的过渡动画,从而提升用户体验。现总结如下: API 1. visible 含义:这是一…...
生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向
信息传递中的“击鼓传花” 新特性的突现 功能柱:简化节点 高级视皮层中的信息走向...
记录idea可以运行但是maven install打包却找不到问题
解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬,那么可以把相关的springboot的东西移除掉,改造成普通项⽬。如果不想改造项⽬,那就添加部分的配置,因为springboot项⽬打包的时候会⽣…...
牛客:AB5 点击消除
链接:点击消除_牛客题霸_牛客网 题解: 利用栈,遍历输入的字符串,栈为空则入栈,栈不为空则去除栈顶字符和当前遍历到的字符比较,相等则栈顶字符出栈,当前遍历的字符也不入栈,不相等…...
vue3 动态修改系统title
vue3 动态修改系统title 修改前 修改后 1、封装 useTitle 工具函数 创建组合式 API,通过 watchEffect 监听标题变化: // composables/useTitle.js import { ref, watchEffect } from vue;export function useTitle(initialTitle) {const title r…...
产品经理.产品设计.产品设计工具
一、 产品经理常用工具 1. 业务流程图---系统流程图 业务流程图,面向用户调研,描述业务的流转和数据的处理要求,跟用户和业务方确认;---业务角色的泳道流程图。 系统流程图,面向产品需求设计, prd系描述各…...
kibana重建es索引
kibana如何重命名es索引名 背景 在初期设计es索引文档的时候考虑不是很周全,会多出很多无效字段。如果不删除或禁用对后续数据增量以及文档维护会有不良影响。 技术实现 使用 _reindex 1.执行Reindex # 复制旧索引数据到新索引 POST _reindex {"source&qu…...