news 2026/10/15 0:06:48

VisionPro二开之九点标定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
VisionPro二开之九点标定

VisionPro二开之九点标定

方式1:

CogCalibNPointToNPointTool

方式2

安装

平移九点标定

usingSystem;usingSystem.Collections.Generic;usingMathNet.Numerics.LinearAlgebra;namespace平移标定的数学公式{publicclassCoordinateCalibration{// 存储标定点对privateList<(PointF image,PointF robot)>calibrationPoints=newList<(PointF,PointF)>();// 仿射变换参数 [a, b, c; d, e, f]privateMatrix<double>transformMatrix;publicstructPointF{publicfloatX;publicfloatY;publicPointF(floatx,floaty){X=x;Y=y;}}// 添加标定点publicvoidAddCalibrationPoint(PointFimagePoint,PointFrobotPoint){calibrationPoints.Add((imagePoint,robotPoint));}// 执行标定计算publicboolCalculateCalibration(){if(calibrationPoints.Count<3){Console.WriteLine("至少需要3个标定点");returnfalse;}// 构建矩阵方程 A * params = B// 参数矩阵 params = [a, b, c, d, e, f]^Tintn=calibrationPoints.Count;Matrix<double>A=Matrix<double>.Build.Dense(2*n,6);Matrix<double>B=Matrix<double>.Build.Dense(2*n,1);for(inti=0;i<n;i++){var(image,robot)=calibrationPoints[i];// 填充A矩阵 - X坐标相关行A[2*i,0]=image.X;// xA[2*i,1]=image.Y;// yA[2*i,2]=1;// 1A[2*i,3]=0;A[2*i,4]=0;A[2*i,5]=0;// 填充A矩阵 - Y坐标相关行A[2*i+1,0]=0;A[2*i+1,1]=0;A[2*i+1,2]=0;A[2*i+1,3]=image.X;// xA[2*i+1,4]=image.Y;// yA[2*i+1,5]=1;// 1// 填充B矩阵B[2*i,0]=robot.X;B[2*i+1,0]=robot.Y;}// 使用最小二乘法求解try{// A * params = B => params = (A^T * A)^-1 * A^T * BvarAtA=A.Transpose()*A;varAtA_inv=AtA.Inverse();varAtB=A.Transpose()*B;varparamsVector=AtA_inv*AtB;// 转换为2x3变换矩阵transformMatrix=Matrix<double>.Build.Dense(2,3);transformMatrix[0,0]=paramsVector[0,0];// atransformMatrix[0,1]=paramsVector[1,0];// btransformMatrix[0,2]=paramsVector[2,0];// ctransformMatrix[1,0]=paramsVector[3,0];// dtransformMatrix[1,1]=paramsVector[4,0];// etransformMatrix[1,2]=paramsVector[5,0];// freturntrue;}catch(Exceptionex){Console.WriteLine($"标定计算失败:{ex.Message}");returnfalse;}}// 图像坐标转机械手坐标publicPointFImageToRobot(PointFimagePoint){if(transformMatrix==null){thrownewInvalidOperationException("尚未执行标定计算");}// 构建输入向量 [x, y, 1]Vector<double>input=Vector<double>.Build.Dense(new[]{imagePoint.X,imagePoint.Y,1.0});// 计算输出 [X, Y]Vector<double>output=transformMatrix*input;returnnewPointF((float)output[0],(float)output[1]);}// 机械手坐标转图像坐标(逆变换)publicPointFRobotToImage(PointFrobotPoint){if(transformMatrix==null){thrownewInvalidOperationException("尚未执行标定计算");}// 仿射变换的逆变换需要计算矩阵的逆Matrix<double>invTransform=Matrix<double>.Build.Dense(3,3);invTransform[0,0]=transformMatrix[0,0];invTransform[0,1]=transformMatrix[0,1];invTransform[0,2]=transformMatrix[0,2];invTransform[1,0]=transformMatrix[1,0];invTransform[1,1]=transformMatrix[1,1];invTransform[1,2]=transformMatrix[1,2];invTransform[2,0]=0;invTransform[2,1]=0;invTransform[2,2]=1;try{varinv=invTransform.Inverse();Vector<double>input=Vector<double>.Build.Dense(new[]{robotPoint.X,robotPoint.Y,1.0});Vector<double>output=inv*input;returnnewPointF((float)output[0],(float)output[1]);}catch{Console.WriteLine("逆变换计算失败,可能矩阵不可逆");returnnewPointF(0,0);}}}}

二 使用

usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace平移标定的数学公式{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();}privatevoidbutton1_Click(objectsender,EventArgse){varcalibrator=newCoordinateCalibration();// 添加9个标定点(示例数据,实际应用中需要真实测量)// 格式:(图像坐标X, 图像坐标Y), (机械手坐标X, 机械手坐标Y)calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(1588.7726f,596.46368f),newCoordinateCalibration.PointF(140,10));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(2092.5125f,601.88007f),newCoordinateCalibration.PointF(140,-10));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(2599.6616f,608.51514f),newCoordinateCalibration.PointF(140,-30));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(1586.8936f,1092.2368f),newCoordinateCalibration.PointF(160,10));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(2088.5759f,1099.787f),newCoordinateCalibration.PointF(160,-10));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(2588.5093f,1111.1132f),newCoordinateCalibration.PointF(160,-30));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(1573.5547f,1592.8459f),newCoordinateCalibration.PointF(180,10));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(2082.4187f,1601.0065f),newCoordinateCalibration.PointF(180,-10));calibrator.AddCalibrationPoint(newCoordinateCalibration.PointF(2583.4763f,1615.3347f),newCoordinateCalibration.PointF(180,-30));// 执行标定计算if(calibrator.CalculateCalibration()){// 测试转换vartestImagePoint=newCoordinateCalibration.PointF(1200,1500);varrobotPoint=calibrator.ImageToRobot(testImagePoint);MessageBox.Show($"图像坐标({testImagePoint.X},{testImagePoint.Y}) -> 机械手坐标({robotPoint.X},{robotPoint.Y})");// 测试逆转换varbackToImage=calibrator.RobotToImage(robotPoint);MessageBox.Show($"机械手坐标({robotPoint.X},{robotPoint.Y}) -> 图像坐标({backToImage.X},{backToImage.Y})");}}}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 12:04:12

Git合并时忽略文件的6种技巧

有几种方法可以在 git merge 时忽略特定文件的合并&#xff1a;方法一&#xff1a;使用 .gitattributes 文件&#xff08;推荐&#xff09;在项目根目录创建或编辑 .gitattributes 文件&#xff1a;infostation.js mergeours *.js mergeours # 如果需要忽略所有js文件的合并然…

作者头像 李华
网站建设 2026/10/13 12:05:57

超越能源使用:数据中心可持续运营策略

随着越来越多的数据中心建设以适应AI的日益普及和广泛采用&#xff0c;未能优先考虑更可持续运营的运营商将面临挑战。根据一项报告&#xff0c;截至2024年底&#xff0c;美国有1,240个数据中心建成或获批建设。美国数据中心的快速增长引发了关于数据中心能源和自然资源消耗的日…

作者头像 李华
网站建设 2026/10/13 12:52:52

联想和摩托罗拉推出自有设备端AI助手

联想和摩托罗拉正在推出自有的设备端AI助手联想和摩托罗拉正在推出自有的设备端AI助手Qira将在本季度晚些时候到来。如果世界上的数字助手还不够多的话&#xff0c;联想正在向这个堆积如山的助手队伍中再添加一个。周二晚上&#xff0c;该公司宣布推出Qira&#xff0c;这是一个…

作者头像 李华
网站建设 2026/10/13 12:52:52

探讨 C++ 在工程实践中的独特价值、其对底层能力的深刻影响,以及在复杂系统设计中不可替代的作用,揭示技术发展的新趋势与面对的挑战

在互联网行业的早期阶段&#xff0c;技术红利极为明显。只要掌握一门主流语言&#xff0c;熟悉常见框架&#xff0c;就可以迅速参与项目、完成需求、获得不错的职业回报。但随着行业逐渐成熟&#xff0c;一个现实问题开始浮现&#xff1a;为什么技术工作年限相近的工程师&#…

作者头像 李华
网站建设 2026/10/13 12:52:54

AI Coding后端开发实战,非常详细收藏我这一篇就够了

前言&#xff1a;AI时代&#xff0c;我们该如何与AI Coding协作&#xff1f; 随着AI技术在软件开发领域的快速发展&#xff0c;AI Coding作为一款强大的AI辅助开发工具&#xff0c;正在深刻改变着我们的开发模式。然而&#xff0c;在实际应用过程中&#xff0c;许多开发人员在早…

作者头像 李华
网站建设 2026/10/11 10:03:15

AI智能体改变材料研发:7个案例,架构师的创新思路

AI智能体改变材料研发&#xff1a;7个案例&#xff0c;架构师的创新思路——技术博客文章 下面是根据用户输入的文章主题“AI智能体改变材料研发&#xff1a;7个案例&#xff0c;架构师的创新思路”撰写的一篇技术博客文章。文章采用Markdown格式&#xff0c;内容包括标题选项、…

作者头像 李华