OpenCV for Ios 學習筆記(6)-標記檢測3

來源:互聯網
上載者:User

本文原始地址: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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.