工业图像处理实战--九点标定法

本文详细介绍九点标定法的应用,包括如何通过九个特征点求解图像的分辨率及仿射变换矩阵,适用于图像处理和坐标转换场景。文中提供了具体的算法实现步骤和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天同事突然问我九点标定的几个函数名称,然后我才想起来还有这个重要的技能没有说,因此本篇会详细介绍一下九点标定法。(九点:指有序排列的九个特征点,一般为圆点或者十字)

九点标定的作用:

1.求解x和y方向的分辨率

2.求解图像坐标到xx坐标的仿射变换矩阵

(PS:关于仿射变换和透视变换的一般理解,仿射变换:一个矩形到另一个矩形的变换过程,透视变换:一个矩形到另一个不规则矩形的变换过程(不规则可以理解为有些边或者其他地方不是直线))

准备工作:九点标定板(3x3,已知行距,列距)。在相机视野范围内,让九点中某个点和XX坐标系的某个点重合,也就是九点在xx坐标系的坐标,是已知的

一、分辨率求解

经过图像处理,我们可以得到九个点的图像上的坐标,然后按照从左到右,从上到下的规律拍好,利用这些点去计算分辨率,大概的程序思路如下

//pt:点集;hj:行距;lj:列距
bool CvGetClibrateData(CvPoint *pt, double hj, double lj, double &dx, double &dy)
{
	//pt的排列原则从左到右,从上到下,可以使用sort函数排序
	//具体的sort就不写了,感兴趣的同学自己研究一下,在这里我默认他排好序了
	//pt的排序结果
	// 0 1 2
	// 3 4 5
	// 6 7 8
    //因此接下来的求解方法全是数学问题
	//x方向分辨率
	dx = (pt[1].x - pt[0].x) + (pt[2].x - pt[1].x);
	dx += (pt[4].x - pt[3].x) + (pt[5].x - pt[4].x);
	dx += (pt[7].x - pt[6].x) + (pt[8].x - pt[7].x);
	dx = dx / (6 * lj);

	//y方向分辨率
	dy = (pt[3].y - pt[0].y) + (pt[6].y - pt[3].y);
	dy += (pt[4].y - pt[1].y) + (pt[7].y - pt[4].y);
	dy += (pt[5].y - pt[2].y) + (pt[8].y - pt[5].y);
	dy = dy / (6 * hj);
    return ture;
}

二、仿射矩阵

从一个坐标系到另一个坐标系的变换,通常使用仿射矩阵。,我使用的是已经二次封装好的,但是没有源码,因此只能用OpenCv中的某些函数说明。

首先

CvMat*  cvGetAffineTransform( const CvPoint2D32f* src,const CvPoint2D32f*  dst, CvMat*  map_matrix );
src:输入图像的三角形顶点坐标。
dst:输出图像的相应的三角形顶点坐标。
map_matrix:指向2×3输出矩阵的指针。

这个函数就是已知图像上三点坐标,和XX坐标系中对应的三点坐标,然后求解一个变化的矩阵。

得到这个矩阵之后,可以根据已知的图像点推算对应XX坐标系上的对应的的坐标(相关变换函数暂时没找到,用的是已经封装好的看不到源码,以后再加)

给出大致的思路,用cvGetAffineTransform或者cv2DRotationMatrix求解出矩阵(2x3的)

然后它的排列大概是下面这样

然后,对应坐标求解,大概是下面这样 

2019/4/28更新内容,添加一个变化的代码

void GetTransPt(Point src, Mat trans, Point &dst)
{
	if (trans.empty())
	{
		return;
	}
	int n=trans.channels();

	Point2f p = Point2f(0, 0);
	dst.x = trans.ptr<double>(0)[0] * src.x + trans.ptr<double>(0)[1] * src.y + trans.ptr<double>(0)[2];
	dst.y = trans.ptr<double>(1)[0] * src.x + trans.ptr<double>(1)[1] * src.y + trans.ptr<double>(1)[2];
}

 

### 使用 VisionPro 进行九点标定以实现引导抓取 在工业自动化领域,VisionPro 是一种广泛应用于机器视觉系统的软件工具。它提供了强大的图像处理和模式匹配功能,适合用于复杂的视觉任务,例如引导机械臂进行精确抓取。 #### 1. **九点标定的概念** 九点标定是一种常用的相机标定方法,旨在校正镜头畸变并建立世界坐系与像素坐的映射关系。通过定义一个已知尺寸的准板上的多个点(通常为9个),可以计算出相机的内外参数以及畸变系数[^2]。 #### 2. **准备工作** 为了完成九点标定,需准备以下材料: - 准棋盘格图案或圆点阵列模板。 - 高分辨率摄像头及其固定装置。 - 工业机器人或其他执行机构。 确保准板放置于视野中心区域,并调整光源以减少反射干扰。 #### 3. **配置 VisionPro 软件** 打开 VisionPro 后加载新工程文件,在设置界面指定输入设备型号及分辨率参数。接着进入“Calibration”模块选择合适的算法模型——对于大多数应用场景推荐采用张氏标定法(Pattern-based Calibration)[^1]。 #### 4. **采集数据样本** 移动目物体至不同方位拍摄多组图片作为训练集;每幅图都应清晰可见全部记点且角度有所变化以便覆盖整个工作空间范围。注意保持每次变换后的距离比例一致以免引入额外误差源[^4]。 #### 5. **运行标定过程** 利用内置函数自动识别各帧内的角点位置信息后提交给系统进行优化运算得出最终结果包括但不限于焦距focal length、主点principal point偏移量等等重要数值表示形式如下所示: ```matlab % MATLAB伪代码展示部分核心逻辑流程 clear;clc; criteria = (epi, max_iter=30, epsilon=0.001); [objPoints,imgPoints]=detectCheckerboardPoints(imageSet); % 获取对象点与图像点集合 ret,cameraMatrix,distCoeffs,rvecs,tvecs = calibrateCamera(objPoints,imgPoints,imageSize,criteria); disp(cameraMatrix); disp(distCoeffs); ``` 上述代码片段仅作示意用途并不完全适配具体环境部署情况,请参照官方文档进一步完善细节处理步骤[^3]。 #### 6. **验证精度** 完成后可通过绘制重投影误差分布直方图来评估整体性能表现是否满足预期指要求如果发现某些局部存在较大偏差则可能需要重新规划采样策略或者改进照明条件再次尝试直至达到满意效果为止。 --- ### 结论 综上所述,借助 VisionPro 完成九点标定进而达成精准引导抓取是一项涉及软硬件协同工作的综合性课题。遵循以上指南可以帮助开发者快速入门并有效解决实际问题。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值