相机标记[置顶] OpenCV for Ios 学习笔记(6)-标记检测3

时光紧张,先记一笔,后续优化与完善。

    

    本文原始址地:OpenCV for Ios 学习条记(6)-标记测检3

    

    标记位置的精细化

//根据相机的旋转,整调标记的姿态
//marker:捕获到的标记
            std::rotate(marker.points.begin(), marker.points.begin() + 4 - nRotations, marker.points.end());

    
在捕获到标记后并且根据标记编码筛选后,我们该应重新定义它们的角。这步有助于面下估计标记的3d态形。

std::vector<cv::Point2f> preciseCorners(4 * goodMarkers.size());
        //找到全部标记的角点
        for (size_t i=0; i<goodMarkers.size(); i++)
        {
            const Marker& marker = goodMarkers[i];
            
            for (int c = 0; c <4; c++)
            {
                preciseCorners[i*4 + c] = marker.points[c];
            }
        }
        //类型
        /* 
         CV_TERMCRIT_ITER 用大最迭代次数作为止终条件
         CV_TERMCRIT_EPS 用精度作为迭代条件
         CV_TERMCRIT_ITER+CV_TERMCRIT_EPS 用大最迭代次数或者精度作为迭代条件,决定于哪个条件先满意
         */
        //迭代的大最次数
        //特定的阀值
        cv::TermCriteria termCriteria = cv::TermCriteria(cv::TermCriteria::MAX_ITER | cv::TermCriteria::EPS, 30, 0.01);
        
        //输入图像
        //输入的角点,也作为输出更确精的角点
        //亲近的小大(Neighborhood size)
        //Aperture parameter for the Sobel() operator
        //像素迭代(扩大)的方法
        cv::cornerSubPix(grayscale, preciseCorners, cvSize(5,5), cvSize(-1,-1), termCriteria);
        
        // 保存最新的点顶
        for (size_t i=0; i<goodMarkers.size(); i++)
        {
            Marker& marker = goodMarkers[i];
            
            for (int c=0;c<4;c++)
            {
                marker.points[c] = preciseCorners[i*4 + c];
            }
        }

    我们到得的图像该应像这样:

    

    

    但是须要意注一点,我们在标记测检的初期的阶段没有用应cornerSubPix数函是因为它的复杂性-调用这个数函处置大批点顶时会消耗大批的处置时光,因此我们只在处置有效标记时用应。

    

    描写标记的3维态形

    

    总所周知,增强实现技巧是将实现界世与虚拟物体完善融合。为了将物体呈现到3维间空中,我们必须晓得它于对相我们正在行进帧捕获的相机的姿态。因此,我们将会在笛卡尔坐标系中用应欧几里得转换来示表这个姿态。

    标记在3维间空的位置和它本身的投影矩阵有以下关联:

    P = A * [R|T] * M;

    其中:

    每日一道理
共和国迎来了她五十诞辰。五十年像一条长河,有急流也有缓流;五十年像一幅长卷,有冷色也有暖色;五十年像一首乐曲,有低音也有高音;五十年像一部史诗,有痛苦也有欢乐。长河永远奔流,画卷刚刚展开,乐曲渐趋高潮,史诗还在续写。我们的共和国正迈着坚定的步伐,跨入新时代。

    M示表一个3维的点

    [R|T] 示表一个[3|4]的欧几里得矩阵

     A示表一个相机矩阵或者固有的矩阵数参

    P示表M在屏幕间空中的投影

    

    

    

    在我们实现标记标记测检,并且到得它在2维间空的4个角点(屏幕间空投影),下一步我们就要取获A矩阵和M向量数参并算计欧几里得矩阵变换。

    Camera Calibration and 3D Reconstruction

    

    相机准校

    每一个相机都有具特独的数参,如焦距、主点,和镜头畸变模型。

    找出相机内涵数参的程过就是相机准校。因为相机准校描述了透视变换和在输出图像上的镜头畸变,因此对增强实现用应至关重要。为了得取最好的用户体验,增强实现中的物体也该应用应同相的透视投影。

    为了准校相机,我们须要一个特别的图案(棋盘或者白色景背上的色黑圆圈)。面下是实现相机准校的一个较好的法算:

    用应棋盘格来行进摄像机标定

    

    

    为了示展相机准校,我们建创CameraCalibration类:

    

/**
 * 一个相机准校类,存储相机的内涵数参和畸变向量
 */

class CameraCalibration
{
public:
  CameraCalibration();
  CameraCalibration(float fx, float fy, float cx, float cy);
  CameraCalibration(float fx, float fy, float cx, float cy, float distorsionCoeff[4]);
  
  void getMatrix34(float cparam[3][4]) const;

  const Matrix33& getIntrinsic() const;
  const Vector4&  getDistorsion() const;
  
private:
  Matrix33 m_intrinsic;
  Vector4  m_distorsion;
};

    体具实现:

    待传

    

    

    接链:

    http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

    注:该学习条记重要翻译自Mastering OpenCV with Practical Computer Visi

    

文章结束给大家分享下程序员的一些笑话语录: 程序员打油诗   
  写字楼里写字间,写字间里程序员;
  程序人员写程序,又拿程序换酒钱。
  酒醒只在网上坐,酒醉还来网下眠;
  酒醉酒醒日复日,网上网下年复年。
  但愿老死电脑间,不愿鞠躬老板前;
  奔驰宝马贵者趣,公交自行程序员。
  别人笑我忒疯癫,我笑自己命太贱;
  不见满街漂亮妹,哪个归得程序员。

原文地址:https://www.cnblogs.com/xinyuyuanm/p/3045568.html