PnP 单目相机位姿估计(三):二维码角点检测


IDE:visual studio 2013
使用库:Eigen opencv2.4.9
文档版本:1.0


解PnP问题时,用二维码的好处

  1. 二维码由黑白两色组成,容易通过对图像阈值处理而发现
  2. 二维码具有方向性(只要设计的不为中心对称),可以更好的辅助求解位姿
  3. 二维码具有可识别性,即可解析二维码内部黑白块的排列顺序,从而确定该二维码是否为我们所要用的二维码

二维码识别的流程

这里写图片描述

该流程以该二维码为例

  1. 阈值处理,二值化操作
  2. 去掉二维码周围一圈,即保存为5*5的信息
  3. 计算5*5图像内的海明距离,和程序所设定要查找的二维码的海明距离作比较
  4. 若该二维码即为程序所要查找的二维码,则用opencv自带的findContours查找角点

代码

#include "Marker.h"

/************************************************构造函数****************************************************/
Marker::Marker(): id(-1)
{
}

/************************************************析构函数****************************************************/
Marker::~Marker() 
{
}

/*******************************************读取二维码内含信息**********************************************/
int Marker::getMarkerId(cv::Mat &markerImage, int &nRotations)
{
    assert(markerImage.rows == markerImage.cols);
    assert(markerImage.type() == CV_8UC1);

    cv::Mat grey = markerImage;
    //threshold image
    cv::threshold(grey, grey, 125, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);

    //Markers  are divided in 7x7 regions, of which the inner 5x5 belongs to marker info
    //the external border should be entirely black
    //去掉周围的一圈黑色,提取出5x5的网格
    int cellSize = markerImage.rows / 7;

    for (int y = 0; y<7; ++y)
    {
        int inc = 6;
        //for first and last row, check the whole border
        if (
  • 3
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
PNP算法(Perspective-Point)是一种用于计算相机位姿估计的算法,它可以通过已知的3D点和对应的2D图像点来计算相机的旋转和平移矩阵。 在OpenCV中,PNP算法的实现主要依赖于solvePnP函数。该函数可以通过不同的方法来解决PNP问题,包括EPnP、DLS、UPnP等。其中,EPnP是一种基于最小化重投影误差的方法,DLS是一种基于最小二乘法的方法,UPnP是一种基于非线性优化的方法。 使用OpenCV中的PNP算法进行位姿估计的步骤如下: 1. 准备3D点和对应的2D图像点数据。 2. 根据所选的PNP算法,调用solvePnP函数,并传入相应的参数。 3. 根据函数返回的结果,获取相机的旋转和平移矩阵。 以下是一个示例代码,演示了如何使用OpenCV中的PNP算法进行位姿估计: ```cpp #include <opencv2/opencv.hpp> int main() { // 准备3D点和对应的2D图像点数据 std::vector<cv::Point3f> objectPoints; std::vector<cv::Point2f> imagePoints; // 添加3D点和对应的2D图像点数据 // 定义相机内参矩阵 cv::Mat cameraMatrix = cv::Mat::eye(3, 3, CV_64F); // 定义畸变系数 cv::Mat distCoeffs = cv::Mat::zeros(5, 1, CV_64F); // 调用solvePnP函数进行位姿估计 cv::Mat rvec, tvec; cv::solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs, rvec, tvec); // 输出相机的旋转和平移矩阵 std::cout << "Rotation vector: " << rvec << std::endl; std::cout << "Translation vector: " << tvec << std::endl; return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值