机器视觉内参标定+标定应用场景分类(现场实用版)

机器视觉内参标定详解

B站  :道传科技上位机   观看教程

一、为什么要进行内参标定

相机进行内参标定的核心原因是为消除镜头畸变、准确建立三维空间点与二维图像点的对应关系,从而确保测量精度和图像校正效果。 [1相机内参是描述相机光学系统内部特性的关键参数,包括焦距、畸变系数、光轴位置等,这些参数直接影响成像质量。

二、各种标定的使用场景

内参标定:图像存在畸变

九点标定:需要将图像坐标转换为机械坐标(如定位)

旋转标定:需要进行角度纠偏

仅需内参标定‌:若相机仅用于图像处理(如测量物体尺寸、检测缺陷等),无需机械手引导,只需完成内参标定即可。

三、标定过程

准备阶段:

1 首先要获取相机的初始内参(焦距,畸变系数,单个像素的宽,单个像素高,图像 坐标的中心值横坐标,图像坐标中心值的纵坐标,图像宽度,图像高度)

 2 根据标定板的大小利用 gen_caltab 算子,生成描述文件。(保存到指定位置)

 3 拍摄 14—20 组标定板图像(eye_in_hand),并准确记录每组图像在拍摄时 TOOL_IN_BASE 位姿(此位姿从机器人中读取)。 备注:在获取标定图像时,标定板不动,机器人末端的摆动要尽可能的全面,绕各 个轴的旋转角要尽量的大。标定板要出现在相机视野的各个角落。理论上图像越多, 角度越全面,标定精度越高。

gen_caltab( : : XNum, YNum, MarkDist, DiameterRatio, CalPlateDescr, CalPlatePSFile : )

CalPlateDescr:标定板描述文件的文件路径

CalPlatePSFile :标定板图像文件路径,可以用ps打开

gen_caltab( 7, 7, 0.1, 0.5, ‘caltab.descr’, ‘caltab.ps’)

大家可以自己思考一下每个参数的含义   行数:7   列数:7    黑色圆点半径:0.05m    圆点中心间距:0.1m

四、保存标定参数

一、通过halcon标定助手,将标定文件保存到本地

 将内参标定参数和外参标定参数保存到本地

五、关键算子

一、流程

 //摄像机内参

 HOperatorSet.ReadCamPar(Camera.CameraInnerParameterFile, out hv_CamParam);

 //摄像机外参(摄像机位姿)

   HOperatorSet.ReadPose(Camera.CameraOuterParameterFile, out hv_PoseCalib);

//将图像坐标点转换为世界坐标系(通常为Z=0平面)的算子

   HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_PoseCalib, pixelx, pixely, "mm", out worldx, out worldy);

在C++中实现机器视觉自动标定和旋转中心计算通常涉及以下几个步骤: ### 1. 图像采集 首先,需要使用摄像头或图像采集设备获取图像。可以使用OpenCV库来简化这一过程。 ```cpp #include <opencv2/opencv.hpp> #include <iostream> int main() { cv::VideoCapture cap(0); // 打开默认摄像头 if (!cap.isOpened()) { std::cerr << "无法打开摄像头" << std::endl; return -1; } cv::Mat frame; while (true) { cap >> frame; // 捕获一帧 if (frame.empty()) break; cv::imshow("Frame", frame); if (cv::waitKey(30) >= 0) break; } return 0; } ``` ### 2. 图像预处理 在进行标定之前,通常需要对图像进行预处理,如灰度化、去噪、边缘检测等。 ```cpp cv::Mat gray; cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); cv::GaussianBlur(gray, gray, cv::Size(5, 5), 0); cv::Mat edges; cv::Canny(gray, edges, 50, 150); ``` ### 3. 标定 使用标定板(如棋盘格)进行相机标定,计算相机的内参和外参。 ```cpp std::vector<std::vector<cv::Point2f>> imagePoints; std::vector<std::vector<cv::Point3f>> objectPoints; // 假设已经检测到棋盘格的角点 cv::Mat cameraMatrix, distCoeffs; std::vector<cv::Mat> rvecs, tvecs; cv::calibrateCamera(objectPoints, imagePoints, cv::Size(gray.cols, gray.rows), cameraMatrix, distCoeffs, rvecs, tvecs); ``` ### 4. 旋转中心计算 通过计算相机的旋转矩阵和位移向量,可以进一步计算出旋转中心。 ```cpp cv::Mat rotationMatrix; cv::Rodrigues(rvecs[0], rotationMatrix); cv::Mat rotationCenter = -rotationMatrix.t() * tvecs[0]; ``` ### 5. 结果展示 将标定结果和旋转中心在图像上展示出来。 ```cpp cv::Mat result = frame.clone(); cv::drawChessboardCorners(result, cv::Size(9, 6), cv::Mat(imagePoints[0]), true); cv::putText(result, "Rotation Center: " + cv::format("%.2f, %.2f, %.2f", rotationCenter.at<double>(0), rotationCenter.at<double>(1), rotationCenter.at<double>(2)), cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 0.6, cv::Scalar(0, 0, 255), 2); cv::imshow("Result", result); ``` ### 总结 通过上述步骤,可以在C++中使用OpenCV库实现机器视觉自动标定和旋转中心计算。这种方法在机器人视觉、自动化检测等领域有广泛应用。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值