【庖丁解牛】机器视觉核心算法之N点标定

机器视觉-标定篇 其中:(u,v)是特征点的图像坐标,(u0,v0) 光轴中心的图像坐标,(kx ky )是X 轴,Y 轴方向的放大系数,(xc yc zc) 是特征点在摄像机坐标系下坐标, Mc 是摄像机内参数矩阵。最常用的自适应阈值分割是Otsu方法,该方法使用统计学的方法确定最优的阈值,适用于一般的图像,但是不太适合于棋盘格上激光条纹的分割。选取激光条纹中心线上的两个点作为激光条纹的特征点,为了提高激光条纹中心线的提取精度,利用最小二乘法拟合方法对细化后的激光条纹直线进行处理。 阅读详情
AI摘要

本文围绕机器视觉核心算法之N点标定展开。先介绍N点标定是通过N组对应坐标求解图像到世界坐标的变换矩阵,用于工业定位场景。接着阐述射影变换概念、形式和本质,说明N点标定就是求解单应矩阵。还介绍单应矩阵估计方法及算法结构、流程,最后给出透视投影变换模型的完整代码。


机器视觉在工业领域应用主要分为四大类:识别、检测、测量和定位。据机器视觉产业联盟最新调查结果显示,工业应用场景中,测量和定位应用占比约为26%,广泛应用于3C电子、半导体、汽车制造、新能源等支柱行业。根据笔者多年从业经验,定位类应用是入门门槛最高的一类机器视觉应用,涉及到大量空间几何等数理基础。
作为全球某机器视觉头部大厂的资深工程师,深感学校和互联网上主要资料局限于计算机视觉领域,能落地工业领域的算法寥寥无几,且相关算法原理语焉不详、乏善可陈,或示例代码缺少关键实现、谬误百出, 故作【庖丁解牛】系列课程,掰开揉碎了讲解机器视觉领域核心算法,并提供完整的高质量代码,力争为从业者提供严格贴近工业应用场景的、高质量的国际一线算法剖析。
本系列课程围绕工业视觉算法原理及实现,具体场景落地应考虑的工程实践化设计要点及经验,笔者将在其他系列课程中讲解。
庖丁解牛首期公开课的主题是 N点标定。

N点标定概述

在介绍N点标定算法之前,我们首先要搞清楚什么是N点标定?为什么要做N点标定?
N点标定是根据输入或配置的N组坐标点对(图像——世界),计算图像坐标映射到世界坐标的射影变换关系。
上面这段话翻译过来就是:通过N组对应的图像坐标与世界坐标,求解图像坐标到世界坐标的变换矩阵。
求解这个变换矩阵做什么用?以工业领域某定位应用场景为例进行介绍,场景示意如图1所示。
图1 机械臂定位引导抓取场景
如上图所示,相机拍摄料台上的工件,控制机械臂准确拾取工件。在这个系统中,相机作为视觉传感器,输入是采集得到的工件图像,输出是机械臂要到达的拾取位姿。也即是说,要根据工件图像中的特征信息,即特征点像素坐标,通过某种运算,得到工件在机械臂末端工具坐标系下的坐标,进而控制引导机械臂到达指定位置拾取工件。在这个过程中,我们需要搭一座桥梁,实现特征点像素坐标到机械臂末端工具坐标(后面统称为世界坐标)的转换。这座桥梁,业内通常称之为标定。
由于两个平面坐标系之间的射影变换关系为透视变换(射影变换和透视变换两个概念暂时不用理会,后面会介绍),透视变换为8自由度,即需要至少8组方程才能求唯一解。每一组对应点 ( x , y ) \left( x,y \right) (x,y)提供两组方程,因此至少需要不共线的四组对应点才能求唯一解。通常为保证求解结果的精度和鲁棒性,会采集大于四组对应点实现透视矩阵求解。据笔者猜测,N点标定术语大概率来自美国康耐视公司的CogCalibNPointToNPointTool算子,OpenCV中对应算子为findHomography、Halcon中对应算子为vector_to_hom_mat2d,后两者命名偏学术化。业内广泛采用N点标定术语,某种程度上,也体现出康耐视公司在机器视觉测量类和定位类应用的市场地位与影响力。

机器视觉领域商业闭源代表:美国康耐视(Cognex)的VisionPro、德国MVTec的HALCON、加拿大Teledyne DALSA的Sherlock,开源代表:OpenCV。

射影变换

射影变换概念

众所周知,平面上的一点可以用 I R 2 IR^{2} IR2中的一对坐标 ( x , y ) \left( x,y \right) (x,y)来表示。因此,通常 I R 2 IR^{2} IR2等同于一张平面。把 I R 2 IR^{2} IR2看作一个向量空间时,坐标对 ( x , y ) \left( x,y \right) (x,y)是向量,也就是说点等同于向量。研究 I R 2 IR^{2} IR2的几何称为射影几何。

上面这段定义摘自3D立体视觉“圣经”级别的教科书《Multiple View Geometry in Computer Vision》,强烈建议读者朋友对照原书仔细揣摩体悟。如果仍未揣摩明白,只需记住 I R 2 IR^{2} IR2等同于一张平面,研究 I R 2 IR^{2} IR2的几何称为射影几何。
那么,两个平面(或两个平面坐标系)之间存在哪些几何关系呢?这里,笔者先给出结论:两个平面之间的线性映射关系均满足射影变换或单应(homography)。也即是说,当不考虑两个平面之间发生非线性变换(如畸变)时,两平面之间的变换关系均为射影变换。
两个平面间的射影变换存在以下层次:

  1. 欧氏变换,即平移+旋转
  2. 相似变换,即平移+旋转+缩放(不做特殊说明时,均指同步缩放)
  3. 仿射变换,即平移+旋转+缩放+纵横比(X轴和Y轴缩放比率不同)+斜切(X轴和Y轴不垂直)
  4. 透视变换,即平移+旋转+缩放+纵横比+斜切+透视(物理世界中两条平行的直线在图像中发生相交)

不同变换层次的矩阵形式、失真示意和不变性质如图2所示。
图2 射影变换群
由上图可知,透视变换(射影变换)为8自由度,即需要至少四组对应点才能求唯一解;仿射变换为6自由度,即需要至少三组对应点才能求唯一解;相似变换为4自由度,即需要至少两组对应点才能求唯一解。

射影变换形式

欧式变换(平移和旋转的复合)可表示为:
[ x ′ y ′ 1 ] [ c o s θ − s i n θ t x s i n θ c o s θ t y 0 0 1 ] = [ x y 1 ] \left[ \begin{array}{} x^{'} \\ y^{'} \\ 1 \\ \end{array} \right]\left[ \begin{array}{} cos\theta & -sin\theta & t_{x} \\ sin\theta & cos\theta & t_{y} \\ 0 & 0 & 1 \\ \end{array} \right]=\left[ \begin{array}{} x \\ y \\ 1 \\ \end{array} \right] ​x′y′1​ ​ ​cosθsinθ0​−sinθcosθ0​tx​ty​1​ ​= ​xy1​ ​
欧式变换是刚体的运动模型。
相似变换(欧式变换与均匀缩放的复合)可表示为:
[ x ′ y ′ 1 ] [ s c o s θ − s s i n θ t x s s i n θ s c o s θ t y 0 0 1 ] = [ x y 1 ] \left[ \begin{array}{} x^{'} \\ y^{'} \\ 1 \\ \end{array} \right]\left[ \begin{array}{} scos\theta & -ssin\theta & t_{x} \\ ssin\theta & scos\theta & t_{y} \\ 0 & 0 & 1 \\ \end{array} \right]=\left[ \begin{array}{} x \\ y \\ 1 \\ \end{array} \right] ​x′y′1​ ​ ​scosθssinθ0​−ssinθscosθ0​tx​ty​1​ ​= ​xy1​ ​
相似变换也称为等形变换,因为它保持“形状”。
仿射变换(非奇异线性变换与平移变换的复合)可表示为:
[ x ′ y ′ 1 ] [ a 11 a 12 t x a 21 a 22 t y 0 0 1 ] = [ x y 1 ] \left[ \begin{array}{} x^{'} \\ y^{'} \\ 1 \\ \end{array} \right]\left[ \begin{array}{} a_{11} & a_{12} & t_{x} \\ a_{21} & a_{22} & t_{y} \\ 0 & 0 & 1 \\ \end{array} \right]=\left[ \begin{array}{} x \\ y \\ 1 \\ \end{array} \right] ​x′y′1​ ​ ​a11​a21​0​a12​a22​0​tx​ty​1​ ​= ​xy1​ ​
仿射变换也可以看做旋转、非均匀缩放与平移变换的复合。
射影变换(透视变换)可表示为:
[ x ′ y ′ 1 ] [ a 11 a 12 t x a 21 a 22 t y a 31 a 32 1 ] = [ x y 1 ] \left[ \begin{array}{} x^{'} \\ y^{'} \\ 1 \\ \end{array} \right]\left[ \begin{array}{} a_{11} & a_{12} & t_{x} \\ a_{21} & a_{22} & t_{y} \\ a_{31} & a_{32} & 1 \\ \end{array} \right]=\left[ \begin{array}{} x \\ y \\ 1 \\ \end{array} \right] ​x′y′1​ ​ ​a11​a21​a31​​a12​a22​a32​​tx​ty​1​ ​= ​xy1​ ​
射影变换是齐次坐标的一般非奇异线性变换,是非齐次坐标的一般非奇异线性变换与平移变换的复合,是两个平面间最一般的变换关系。

射影变换本质

N点标定概述章节,我们提到需要搭一座桥梁,实现特征点像素坐标到世界坐标的转换,这和前面提到的射影变换有什么联系呢?
接下来,让我们从摄像机投影模型出发,厘清二者之间千丝万缕的联系。
如图3所示,空间中某点P,在世界坐标系 ( X W , Y W , Z W ) \left( X_{W},Y_{W},Z_{W} \right) (XW​,YW​,ZW​)、相机坐标系 ( X C , Y C , Z C ) \left( X_{C},Y_{C},Z_{C} \right) (XC​,YC​,ZC​)、图像物理坐标系 ( x , y ) \left( x,y \right) (x,y)和像素坐标系 ( u , v ) \left( u,v \right) (u,v)中均有对应的坐标或投影坐标。
图3 相机成像模型
根据摄像机投影模型,3D世界点到像素点的投影关系可以用齐次坐标的线性映射表示为:
[ u v 1 ] = P 3 × 4 [ X W Y W Z W 1 ] \left[ \begin{array}{} u \\ v \\ 1 \\ \end{array} \right] =P_{3\times4}\left[ \begin{array}{} X_{W} \\ Y_{W} \\ Z_{W} \\ 1 \\ \end{array} \right] ​uv1​ ​=P3×4​ ​XW​YW​ZW​1​ ​
如果所有的点都在一个平面上(可以选择此平面为Z=0 ),那么上述线性映射可简化为:
[ u v 1 ] = H 3 × 3 − 1 [ X W Y W 1 ] \left[ \begin{array}{} u \\ v \\ 1 \\ \end{array} \right] =H_{3\times3}^{-1} \left[ \begin{array}{} X_{W} \\ Y_{W} \\ 1 \\ \end{array} \right] ​uv1​ ​=H3×3−1​ ​XW​YW​1​ ​
上式中, H 3 × 3 − 1 H_{3\times3}^{-1} H3×3−1​就是世界坐标系到像素坐标系的射影变换(投影变换)矩阵。
N点标定,就是求解像素坐标系到世界坐标系的射影变换矩阵(单应矩阵),即 H 3 × 3 H_{3\times3} H3×3​(后面统称为单应矩阵)。

单应矩阵估计

N点标定阶段,采集得到N组对应像素坐标与世界坐标点集,根据摄像机投影模型有:
[ X W 0 X W 1 X W 2 . . . X W n Y W 0 Y W 1 Y W 2 . . . Y W n 1 1 1 . . . 1 ] = H 3 × 3 [ u 0 u 1 u 2 . . . u n v 0 v 1 v 2 . . . v n 1 1 1 . . . 1 ] \left[ \begin{array}{} X_{W0} & X_{W1} & X_{W2} & ... & X_{Wn} \\ Y_{W0} & Y_{W1} & Y_{W2} & ... & Y_{Wn} \\ 1 & 1 & 1 & ... & 1\\ \end{array} \right] =H_{3\times3}\left[ \begin{array}{} u_{0} & u_{1} & u_{2} & ... & u_{n} \\ v_{0} & v_{1} & v_{2} & ... & v_{n} \\ 1 & 1 & 1 & ... & 1\\ \end{array} \right] ​XW0​YW0​1​XW1​YW1​1​XW2​YW2​1​.........​XWn​YWn​1​ ​=H3×3​ ​u0​v0​1​u1​v1​1​u2​v2​1​.........​un​vn​1​ ​
记 [ u 0 u 1 u 2 . . . u n v 0 v 1 v 2 . . . v n 1 1 1 . . . 1 ] \left[ \begin{array}{} u_{0} & u_{1} & u_{2} & ... & u_{n} \\ v_{0} & v_{1} & v_{2} & ... & v_{n} \\ 1 & 1 & 1 & ... & 1\\ \end{array} \right] ​u0​v0​1​u1​v1​1​u2​v2​1​.........​un​vn​1​ ​为矩阵A,记 [ X W 0 X W 1 X W 2 . . . X W n Y W 0 Y W 1 Y W 2 . . . Y W n 1 1 1 . . . 1 ] \left[ \begin{array}{} X_{W0} & X_{W1} & X_{W2} & ... & X_{Wn} \\ Y_{W0} & Y_{W1} & Y_{W2} & ... & Y_{Wn} \\ 1 & 1 & 1 & ... & 1\\ \end{array} \right] ​XW0​YW0​1​XW1​YW1​1​XW2​YW2​1​.........​XWn​YWn​1​ ​为矩阵B,记 H 3 × 3 H_{3\times3} H3×3​为矩阵X,则上式可表示为:
X A = B XA=B XA=B
则矩阵X的最小二乘解为:
X = B A T ( A A T ) − 1 X=BA^{T}\left( AA^{T} \right)^{-1} X=BAT(AAT)−1
然而,由于对应点集通常受噪声干扰,导致求解得到的单应矩阵不够准确,因此可采用迭代重加权最小二乘法或RANSAC算法对单应矩阵优化求解,获取准确的单应矩阵,提高N点标定的精度。

注意:由于系数矩阵A通常不是可逆矩阵,因此不能直接求逆, X = B A − 1 X=BA^{-1} X=BA−1是不正确的。
另外,还可以采用SVD分解来估计单应,鲁棒性更强。本文提供的算法代码亦采用此方法。

算法总体结构

单应矩阵求解算法总体结构如图4所示。
图4 单应矩阵求解算法总体结构
如上图所示,初始化模块完成模块输入数据的初始化,包括输入点集的归一化,并根据不同变换模型计算线性超定方程组的系数矩阵;优化求解模块采用最小二乘法计算三种变换模型对应的单应矩阵的估计值。

算法处理流程

单应矩阵求解算法流程如图5所示。
图5 单应矩阵求解算法流程
如上图所示,首先通过初始化模块获取归一化点集和线性超定方程组的系数矩阵,然后通过优化求解模块经最小二乘估计或加权最小二乘估计,获得单应矩阵以及估计误差。单应矩阵求解算法对不同变换模型的单应矩阵分别进行优化求解,包括:透视变换模型、仿射变换模型以及相似变换模型。

初始化模块

初始化模块对输入数据进行有效性检查,对输入点集数据进行归一化并根据不同变换模型,求解其对应的线性超定方程组的系数矩阵。

优化求解模块

优化求解模块流程图如图6所示。
图6 优化求解模块流程图
如上图所示,优化求解模块采用迭代重加权最小二乘法分别求解透视变换、仿射变换以及相似变换模型的单应矩阵估计值,加权最小二乘法采用huber、tukey权重函数分别对三种变换模型的单应矩阵估计值进行优化求解。
至此,本文实现了根据输入或配置的N组坐标点对(图像——世界),计算图像坐标到世界坐标的射影变换关系的N点标定。

完整算法代码(透视投影变换模型)

/// <summary>
/// 单应矩阵透视投影模型求解函数(点集归一化处理)
/// </summary>
/// <param name="srcPoints"></param>
/// <param name="dstPoints"></param>
/// <param name="HomoMat"></param>
/// <returns></returns>
int computePerspectiveHomographyMatrix(const std::vector<Point>& srcPoints, const std::vector<Point>& dstPoints, float HomoMat[9])
{
	int nRet = MVD_OK;
	try
	{
		int numPoints = srcPoints.size();

		// 输入点集零均值化(Z-score)
		double x_average_imagePoints = 0, y_average_imagePoints = 0, x_average_worldPoints = 0, y_average_worldPoints = 0, sigma_imagePoints = 0, sigma_worldPoints = 0;
		for (int i = 0; i < numPoints; i++)
		{
			x_average_imagePoints += srcPoints[i].x;
			y_average_imagePoints += srcPoints[i].y;
			x_average_worldPoints += dstPoints[i].x;
			y_average_worldPoints += dstPoints[i].y;
		}
		x_average_imagePoints /= numPoints;
		y_average_imagePoints /= numPoints;
		x_average_worldPoints /= numPoints;
		y_average_worldPoints /= numPoints;

		double sigma_imagePoints_sum = 0, sigma_worldPoints_sum = 0;
		for (int i = 0; i < numPoints; i++)
		{
			sigma_imagePoints_sum += sqrt(pow((srcPoints[i].x - x_average_imagePoints), 2) + pow((srcPoints[i].y - y_average_imagePoints), 2));
			sigma_worldPoints_sum += sqrt(pow((dstPoints[i].x - x_average_worldPoints), 2) + pow((dstPoints[i].y - y_average_worldPoints), 2));
		}
		sigma_imagePoints = sigma_imagePoints_sum / numPoints;
		sigma_worldPoints = sigma_worldPoints_sum / numPoints;

		Eigen::MatrixXd T_imagePoints(3, 3);
		Eigen::MatrixXd T_worldPoints(3, 3);
		GetNormalizationMatrix(T_imagePoints, x_average_imagePoints, y_average_imagePoints, sigma_imagePoints);
		GetNormalizationMatrix(T_worldPoints, x_average_worldPoints, y_average_worldPoints, sigma_worldPoints);

		Eigen::MatrixXd imagePoints(3, numPoints);
		Eigen::MatrixXd worldPoints(3, numPoints);
		for (int i = 0; i < numPoints; i++)
		{
			imagePoints(0, i) = srcPoints[i].x;
			imagePoints(1, i) = srcPoints[i].y;
			imagePoints(2, i) = 1;
			worldPoints(0, i) = dstPoints[i].x;
			worldPoints(1, i) = dstPoints[i].y;
			worldPoints(2, i) = 1;
		}

		Eigen::MatrixXd imagePoints_Norm(3, numPoints);
		Eigen::MatrixXd worldPoints_Norm(3, numPoints);
		imagePoints_Norm = T_imagePoints * imagePoints;
		worldPoints_Norm = T_worldPoints * worldPoints;

		// 构建系数矩阵A
		Eigen::MatrixXd A(2 * numPoints, 8);
		Eigen::MatrixXd B(2 * numPoints, 1);
		for (int i = 0; i < numPoints; ++i) {
			const double& x = imagePoints_Norm(0, i);
			const double& y = imagePoints_Norm(1, i);
			const double& u = worldPoints_Norm(0, i);
			const double& v = worldPoints_Norm(1, i);

                        // TODO CODE 系数矩阵A的赋值,留给读者自行补充实现

			B(2 * i, 0) = u;
			B(2 * i + 1, 0) = v;
		}

		// 使用奇异值分解求解最小二乘问题
		Eigen::MatrixXd H = A.jacobiSvd(Eigen::ComputeThinU | Eigen::ComputeThinV).solve(B);

		// 将9维向量转换为3x3的单应矩阵
		Eigen::MatrixXd H_Mat(3, 3);
		H_Mat << H(0), H(1), H(2),
			H(3), H(4), H(5),
			H(6), H(7), 1;
		Eigen::MatrixXd h = (T_worldPoints.inverse() * H_Mat * T_imagePoints).transpose();
		h /= h(8);

		HomoMat[0] = h(0);
		HomoMat[1] = h(1);
		HomoMat[2] = h(2);
		HomoMat[3] = h(3);
		HomoMat[4] = h(4);
		HomoMat[5] = h(5);
		HomoMat[6] = h(6);
		HomoMat[7] = h(7);
		HomoMat[8] = 1;
	}
	catch (...)
	{
		return MVD_ERROR;
	}
	return nRet;
}

/// <summary>  
/// 获取归一化矩阵  
/// </summary>  
/// <param name="mat"></param>  
/// <param name="x"></param>  
/// <param name="y"></param>  
/// <param name="sigma"></param>  
void GetNormalizationMatrix(Eigen::MatrixXd& mat, double x, double y, double sigma)
{
	mat(0, 0) = 1.0 / sigma;
	mat(0, 1) = 0;
	mat(0, 2) = -(1.0 / sigma) * x;
	mat(1, 0) = 0;
	mat(1, 1) = 1.0 / sigma;
	mat(1, 2) = -(1.0 / sigma) * y;
	mat(2, 0) = 0;
	mat(2, 1) = 0;
	mat(2, 2) = 1;
}

编译上述代码需要配置Eigen库(Eigen库是一个开源的C++库,专注于高效的线性代数运算、矩阵运算、数值解法等领域),Eigen库配置步骤相对简单,本文不再赘述,感兴趣的读者朋友可以从互联网上查阅相关资料,并亲自动手实践。
通过对本课程的学习,希望每位读者都能掌握机器视觉核心算法之N点标定,轻松驾驭测量类和定位类应用。

本期课程就到此结束了,下期课程我们不见不散。

如觉得本文内容不错,请记得给小编点赞、收藏、分享一键三连,您的支持是笔者更新的不懈动力。
想要算法源码工程(含透视变换、仿射变换以及相似变换模型的单应矩阵估计)的读者朋友可在评论区留言或私信小编。

视觉测量—相机标定 随着计算机视觉的飞速发展,计算机视觉已经越来越多的应用于空间几何尺寸的精确测量和定位,摄像机作为视觉测量的关键部件,相机标定自然是视觉测量的一项重要工作。 1、标定原因 在视觉测量过程中,为确定空间物体特征点的三维几何位置与其在图像中对应点之间的相互关系,必须建立建立相机成像几何模型并矫正透镜畸变,几何模型参数可以认为是相机参数,相机标定就是准确获得相机参数的过程。视觉测量分为单目视觉,双目视觉以及多目视觉,其标定方法略有不同,单目标定是基础,以单目标定为例,相机参数可以分为两类,内参和外参,内参有:焦距: 阅读详情

相关推荐

相机标定之(1)相机标定的基本概念以及标定的常用方法

1.基本概念              在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相机参数的标定都是非常关键的环节,其标定结果的精度及算法

bluetoothlover的专栏 8508

机器视觉——双目视觉的基础知识(视差深度、标定、立体匹配)

一、背景 ”张正友标定”是指张正友教授1998年提出的单平面棋盘格的摄像机标定方法[1]。文中提出的方法介于传统标定法和自标定法之间,但克服了传统标定法需要的高精度标定物的缺点,而仅需使用一个打印出来的棋盘格就可以。同时也相对于自标定而言,提高了精度,便于操作。因此张氏标定法被广泛应用于计算机视觉方面。 二、计算内参和外参的初值 1、计算单应性矩阵H 根据之前博客介绍的摄像机模型,设三维世界坐标的点为X=[X,Y,Z,1]T ,二维相机平面像素坐标为m=[u,v,1]T ,所以标定用的棋盘格平面到图像

m0_61238051的博客 1万+

【计算机视觉----相机标定】

相机标定是计算机视觉中的一个重要问题,它的目的是确定相机的内部参数和外部参数,以建立从相机到图像的映射关系。相机标定的算法通常分为两个步骤:第一步是检测棋盘格角点并计算相机的内部参数,第二步是计算相机的外部参数。第一步:检测棋盘格角点并计算相机的内部参数 棋盘格标定法是一种常用的相机标定方法,它基于在棋盘格上已知的角点坐标和实际测量的角点在图像中的位置,通过最小化重投影误差来求解相机的内部参数。具体步骤如下:第二步:计算相机的外部参数 在得到相机的内部参数后,可以使用PnP算法计算相机的外部参数。PnP算法

qq_52238239的博客 5754

第六节、双目视觉之相机标定

去年三四月份实验室做了一个机器人与视觉识别系统的项目,主要就是利用双目摄像头进行物体空间坐标定位,然后利用机器人进行抓取物体。当时我才研一,还是个菜鸡,项目主要是几个学长负责做的,我也就是参与打打酱油,混混经验。现在过了一年多了,机器人一直在实验室放着,空着也是浪费,所以就想搞点事情。这里我们就先从利用双目摄像头进行空间定位说起,因此这是整个项目的核心部分。 双目视觉是建立在几何数学的基础上,数...

weixin_30405421的博客 2819

【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)

由图可知,线OA=OB=OC=外接圆的半径(r),从三点向【以O点为原点的坐标系】做垂线。机器视觉项目应用中,相机安装在机器人上,并且需要定位产品返回坐标偏差以及角度偏差。不共线的三点坐标 A(X₁,Y₁) ,B(X₂,Y₂) ,C(X₃,Y₃)即任两点组成的斜率不能相等,也验证了三点成圆条件:三点不共线。与九点标定配合使用,实现精准角度补偿。

The world forgets me! 4796

双目视觉标定整理

看了好几天的双目视觉标定,还是没有完全掌握。现在把已经了解到的整理下,方便后面进一步的学习掌握。 双目视觉标定就是通过求解实际三维空间中坐标点和摄像机二维图像坐标点的对应关系,在双目视觉中,三维空间坐标系一般是以左相机坐标系作为基准坐标系。利用棋盘板获取到的用于计算的二维图像坐标和三维空间的物理坐标,再通过一定的算法,求解出变换矩阵,则解决了基础的双目视觉标定的过程。 实际 ...

EarlyBird_Feng的专栏 6497

【庖丁解牛】机器视觉核心算法之N点标定:从单应矩阵到透视变换的工程落地

N点标定用findHomography求解单应矩阵,采集12组以上点对并计算重投影误差验证精度。TaoToken统一Key通道可对接标定结果校验,配置Base URL与API Key即可调用模型分析误差分布。详见 https://taotoken.net/?utm_source=taotoken_aicg_blog_end

weixin_42605397的博客 8

机器视觉:9点标定的原理与实现

标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素,如下图所示,10mm的距离内有222个像素,那像素坐标和实际的毫米坐标就有个比例关系了。

m0_49968063的博客 1万+

【VisionMaster】 N点标定

N点标定

zhy29563 1万+

九点标定和手眼标定

1. /usr/lib/libiniparser.so: file not recognized: File format not recognized 库文件的格式不对,需要删除该库文件,编译出对应平台的库文件,再进行make

AI.PLAY 2407

告别ZotFile!Zotero 7+百度网盘文献同步全攻略(含软链接避坑指南)

本文针对Zotero 7用户,提供了告别ZotFile插件后,利用百度网盘实现文献附件同步的完整解决方案。详细讲解了如何通过设置Zotero链接目录与创建软链接,将附件库迁移至云盘,并附有详细的避坑指南,确保数据安全与多设备同步的稳定性。

mmm90的博客 586

世界坐标系和相机坐标系,图像坐标系的关系

二、图像坐标:我想和世界坐标谈谈(B)          玉米将在这篇博文中,对图像坐标与世界坐标的这场对话中涉及的第二个问题:谈话方式,进行总结。世界坐标是怎样变换进摄像机,投影成图像坐标的呢?         玉米做了一个简单的图示,在这里做一个提纲。图中显示,世界坐标系通过刚体变换到达摄像机坐标系,然后摄像机坐标系通过透视投影变换到达图像坐标系。可以看出,世界坐标与图像坐标的关系

waeceo的专栏 13万+

LM Studio Bionic:本地AI智能体从部署到实战完整指南

AI智能体作为能够自主规划、执行多步任务的人工智能系统,其核心原理在于结合大语言模型的推理能力与工具调用机制。通过状态保持和任务分解算法,智能体实现了从单次问答到持续协作的技术跃迁。在工程实践中,这种架构显著降低了复杂任务自动化的门槛,特别适用于数据敏感场景和定制化需求。以Tesla V100等专业硬件为例,本地部署能充分发挥其大显存优势,支持更高精度的模型量化格式。在实际应用层面,智能体可无缝集成到代码审查、文档生成等开发工作流中,而LM Studio Bionic通过统一界面整合了模型服务、任务规划器等

weixin_29053695的博客 654

计算机视觉算法中的 相机标定(Camera Calibration)

相机标定是计算机视觉中一项重要的技术,它用于确定相机的内外参数,以便准确地将图像中的像素坐标转换为真实世界中的物理坐标。本文将介绍相机标定的概念、应用和常用的标定方法。

牛肉胡辣汤 946

Robocup 仿真2D 学习笔记(二) 球队代码编译和上场

环境的一些问题 最近在使用rcssserver 和 rcssmonitor时可能会遇到./configure失败的问题,可以检查一下文件夹是否有makefile文件,如果是编译后的包直接sudo make install,如果还不行,还可以源码下载编译 rcssserver: https://sourceforge.net/projects/sserver/files/rcssserver/...

markchalse的博客 6014

String+CytoScape构建PPI网络

1.下载CytoScape Cytoscape是一款专业强大好用的物生信息分析软件,主要达用于专业的研究人员使用,软件主要适用于整合模块化网络和生物科学联系网络图的绘制,支持多种文件格式,导入后就可以直接进行编辑或者分析等操作了,除此之外,软件还提供了强大的编辑工具,支持添加相应的注释信息,软件基于java环境组件打造。 下载地址:https://cytoscape.org/ 因为软件基于java...

xiaobai1_1的博客 1万+

【机器人定位引导中的机器视觉技术】

而此处用【单点对位】而非【变量计算】是因为该模块考虑了机器人末端有延展轴,使得操纵点不是法兰中心导致的不共轴。

2d3d图像算法 halcon\opencv\c++\pcl\vtk\coluldcompare工具 程序员 学习者 8636

Kylin操作系统下OpenLDAP安装

Kylin操作系统下OpenLDAP安装

跟着大数据和AI去旅行 1612

单目视觉标定原理

在计算机视觉中,通过相机标定能够获取一定的参数,其原理是基于三大坐标系之间的转换和摄像机的畸变参数矩阵。在实验中经常用张正友标定发,进行摄像机标定,获取到内参数矩阵和外参数矩阵以及畸变参数矩阵。在应用中要区分三者作用。这也是在程序中函数输入量。 一、三大坐标系 在计算机视觉中,利用图像中目标的二维信息获取目标的三维信息,肯定需要相机模型的之间转化。 1、图像坐标系 在计算机系统中,描述图像的大小...

weixin_30808693的博客 1429

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 748

基于Simulink使用激光雷达数据跟踪车辆仿真(附源码)

这些模型将长方体的尺寸定义为状态转换期间的常量,并且它们的估计值在滤波器的校正阶段随时间演变。下面的动画显示了在滤波器的预测阶段将具有不同概率的恒定速度和恒定转弯率模型混合在一起的效果。此示例显示了如何使用带有 IMM 过滤器的 JPDA 跟踪器来跟踪使用激光雷达传感器的对象。图像和激光雷达数据读取器从 MAT 文件中读取记录的数据,并分别输出参考图像和点云中点的位置。跟踪器块选中“启用所有轨道输出”和“启用可检测的跟踪 ID 输入”复选框,以从跟踪器输出所有轨道,并将其检测概率作为其状态的函数进行计算。

珞瑜的博客 2566

计算机视觉 — 相机标定

文章目录一、相机标定介绍二、算法原理三、实验结果四、实验代码五、小结 一、相机标定介绍 简介 在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。无论是在图像测量或者机器视觉应用中,相...

weixin_45601168的博客 907

CATIA二次开发——遍历几何图形集下的轴系及控制轴系生成位置

CATIA二次开发——轴系相关问题1.遍历几何图形集下的轴系2.解决轴系生成位置的问题 1.遍历几何图形集下的轴系 近期遇到的问题:遍历轴系的时候发现,AxisSystem属性的轴系只有放在轴系集合下,才能被找到,放在几何图形集或其他位置均不能被找到。本来想遍历几何图形集下的轴系元素,但是发现没有对应的属性,只能查找 几何图形集、几何元素、草图等元素,无法直接遍历轴系。 解决办法:(加入选择集,在选择集中筛选轴系类型) HybridBody axisHB = activePart.HybridBodies

WorkMan的博客 2731

相机机械臂手眼标定-眼在手外(二)

眼在手外标定

weixin_51021488的博客 4696

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

机器视觉—标定

在介绍N点标定算法之前,我们首先要搞清楚什么是N点标定?为什么要做N点标定?N点标定是根据输入或配置的N组坐标点对(图像——世界),计算图像坐标映射到世界坐标的变换关系。

xiaobaiyys的博客 48

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

视觉标定

机器视觉的基本任务之一是从摄像机获取图像信息并计算三维空间中物体的几何信息,以此重建和识别物体。而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数。在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程被称为摄像机标定。该方法在场景未知和摄像机任意运动的一般情况下,其标定很难实现。 20世纪90年代初,Faug

XGForever的博客 8999
上一篇: 第一篇博客
下一篇: 【庖丁解牛】机器视觉核心算法之圆拟合
AI Researcher
博客等级 码龄7年 310粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值