项目场景:
因为项目上不能使用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();
|