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