日常bug记录(opencv VS eigen)

本文介绍了在项目中因禁止使用opencv,使用Eigen重写角点检测算法的过程。作者发现Eigen在求解特征值时不进行排序,与opencv不同。为匹配opencv的效果,代码需要额外判断并选取最大特征值对应的特征向量。通过调整后,成功实现了棋盘格靶标角点检测,应用于产线标定。
摘要由CSDN通过智能技术生成

项目场景:

因为项目上不能使用opencv开源库,所以自己用eigen重新写了一套角点检测的算法,实现对棋盘格靶标角点的检测,完成最终的产线标定。


问题描述

自己实现的角点检测算法和opencv版本的有所差异
亚像素处理的部分代码:

Eigen::EigenSolver<Eigen::Matrix2f> eigen_solver1 ( A1 );
Eigen::EigenSolver<Eigen::Matrix2f> eigen_solver2 ( A2 );
Eigen::Vector2f v1 = eigen_solver1.eigenvalues().real();
Eigen::Vector2f v2 = eigen_solver2.eigenvalues().real();
Eigen::Matrix2f foo1 = eigen_solver1.eigenvectors().real();
Eigen::Matrix2f foo2 = eigen_solver2.eigenvectors().real();

原因分析:

其实opencv和eigen在求解特征值方面,存在一些差异,opencv中会对特征值和特征向量按照从大到小的顺序进行排序,而eigen是随机的,所以在取对应的特征向量之前,在代码中需要对eigen得到的特征值进行大小判断,进而取得正确的特征向量。


解决方案:

Eigen::EigenSolver<Eigen::Matrix2f> eigen_solver1 ( A1 );
Eigen::EigenSolver<Eigen::Matrix2f> eigen_solver2 ( A2 );
Eigen::Vector2f v1 = eigen_solver1.eigenvalues().real();
Eigen::Vector2f v2 = eigen_solver2.eigenvalues().real();
Eigen::Matrix2f foo1 = eigen_solver1.eigenvectors().real();
Eigen::Matrix2f foo2 = eigen_solver2.eigenvectors().real();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值