关于halcon内参转OpenCV内参

这样转靠谱吗?

废话不多,先上代码


void CCeresProblem::halconToCvParam(HTuple camParam, cv::Mat &cvParam, cv::Mat &D)
{	
	D = (cv::Mat_<double>(1, 5) << 0, 0, 0, 0, 0);

	cvParam = (cv::Mat_<double>(3, 3) << 0, 0, 0, 0, 0, 0, 0, 0, 0);

	HTuple focus;
	HTuple k1, k2, k3, p1, p2, sx, sy, cx, cy;

	locate.get_cam_par_data(camParam, "focus", &focus);
	locate.get_cam_par_data(camParam, "k1", &k1);
	locate.get_cam_par_data(camParam, "k2", &k2);
	locate.get_cam_par_data(camParam, "k3", &k3);
	locate.get_cam_par_data(camParam, "p1", &p1);
	locate.get_cam_par_data(camParam, "p2", &p2);
	locate.get_cam_par_data(camParam, "sx", &sx);
	locate.get_cam_par_data(camParam, "sy", &sy);
	locate.get_cam_par_data(camParam, "cx", &cx);
	locate.get_cam_par_data(camParam, "cy", &cy);

	//一英寸:12.7*9.6
	/*
	[f/dx    0	    u0
	  0	    f/dy    v0
	  0      0      1]
	*/

	D.at<double>(0, 0) = k1 * focus*focus;
	D.at<double>(0, 1) = k2 * focus*focus*focus*focus;
	D.at<double>(0, 4) = k3 * focus*focus*focus*focus*focus*focus; // K3为OpenCV畸变中的最后一个

	D.at<double>(0, 2) = p2 * focus;
	D.at<double>(0, 3) = p1 * focus;
	// CameraMatrix 
	cvParam.at<double>(0, 0) = (focus / sx);
	cvParam.at<double>(0, 1) = 0.0;
	cvParam.at<double>(0, 2) = cx;
	cvParam.at<double>(1, 0) = 0.0;
	cvParam.at<double>(1, 1) = (focus / sy);
	cvParam.at<double>(1, 2) = cy;
	cvParam.at<double>(2, 0) = 0.0;
	cvParam.at<double>(2, 1) = 0.0;
	cvParam.at<double>(2, 2) = 1.0;
}

没错上代码纯属脑残,完全是错的,(当然你能接受这个误差当我没说),我不知到内参算错了还是畸变系数是不是像这样算的,halcon官方毕竟是商业软件,人家也没打算把计算方式完全给你,所以我向广大网友一样内网外网全查了一遍才找到诸如上面的错误代码,请大家引以为戒,不要按照上面的方法继续犯错了,下面是我验证的方法。


在这里插入图片描述

这张四组数据分别是模板匹配的得到的四个点、通过halcon内参重投影、把OpenCV内参转halcon然后重投影,最后直接通过opencv内参投影得到的点;可以看到以模板匹配得到的点为准,第三组数据误差非常大,所以OpenCV内参(畸变)转halcon内参(畸变)方法纯属错误!!!


解决方案


可以看到,最后一组数据相对于模板匹配的很接近了;
那为什么我要转?估计很多人和我一样,需要用到其他开源库,一个halcon库似乎满足不了本项目,需要提取RT;并且OpenCV圆点标定板找圆鲁棒性让我当场泪目
在这里插入图片描述
我项目中还是不对称圆mark点的新型halcon标定板;我决定先找点然后提取cpd文件带入opencv标定函数得到结果,然后得到上上图对比的座标点对,怎么提取文件和标定就不说了,调一下opencv api很简单;对了,提取描述文件时候z设置为0,OpenCV规定的!!主要是根据下面的公式,我先将mark的xyz点坐标转到工具坐标下,然后又转到图像坐标是投影得到的数据;


在这里插入图片描述

感谢OpenCV官方,yyds
https://docs.opencv.org/3.4.15/d9/d0c/group__calib3d.html#ga549c2075fac14829ff4a58bc931c033d
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值