OpenCv(cv::undistort())

做梦当财神發表於2024-08-30

目錄
  • 1. 函式原型
  • 2. 作用
  • 3. 示例
  • 4. 使用場景
  • 5. 注意事項



cv::undistort() 是 OpenCV 中用於校正失真的影像的函式。這個函式通常用於消除相機鏡頭引起的影像畸變(如徑向和切向失真),使得影像中的直線保持直線。這在相機標定過程中非常重要,尤其是當你在影像處理中需要精確幾何形狀的檢測或分析時。



1. 函式原型

void cv::undistort(
    InputArray src, 
    OutputArray dst, 
    InputArray cameraMatrix, 
    InputArray distCoeffs, 
    InputArray newCameraMatrix = noArray()
);

引數:

  • src:輸入影像,通常是失真的影像。

  • dst:輸出影像,它是透過校正畸變後的結果影像。

  • cameraMatrix:相機矩陣(3x3 內參矩陣),包含相機的焦距和光心位置。它的形式為:

    \[\begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \]

    其中 \(f_x\)\(f_y\) 是焦距,\(c_x\)\(c_y\) 是光心座標。

  • distCoeffs:失真係數的向量,通常包含 4 到 8 個引數,用於描述徑向和切向畸變。例如,標準的 5 個引數是:

    \[[k_1, k_2, p_1, p_2, k_3] \]

    其中,\(k_1\)\(k_2\)\(k_3\) 是徑向畸變係數,\(p_1\)\(p_2\) 是切向畸變係數。

  • newCameraMatrix(可選):用於輸出影像的新相機矩陣。如果未提供該矩陣,預設將使用與 cameraMatrix 相同的矩陣。在某些情況下,可以使用該引數調整影像的視角或縮放比。



2. 作用

cv::undistort() 主要用於矯正因鏡頭產生的失真,使得影像中的物件恢復原來的形狀。相機鏡頭會產生兩種主要的失真:

  1. 徑向畸變(Radial Distortion):這種失真會導致影像中的直線出現彎曲,特別是在影像的邊緣。
  2. 切向畸變(Tangential Distortion):由於鏡頭和影像感測器的不對齊,導致影像出現非對稱的變形。


3. 示例

假設已經對相機進行了標定,獲得了相機內參矩陣和失真係數,接下來可以使用 cv::undistort() 校正畸變影像:

#include <opencv2/opencv.hpp>

int main() {
    // 讀取失真影像
    cv::Mat distorted = cv::imread("distorted_image.jpg");

    // 相機內參矩陣
    cv::Mat cameraMatrix = (cv::Mat_<double>(3, 3) << 
                            800, 0, 320,
                            0, 800, 240,
                            0, 0, 1);

    // 失真係數
    cv::Mat distCoeffs = (cv::Mat_<double>(1, 5) << 
                          -0.2, 0.1, 0, 0, 0);

    // 用於儲存校正後的影像
    cv::Mat undistorted;

    // 校正影像
    cv::undistort(distorted, undistorted, cameraMatrix, distCoeffs);

    // 顯示結果
    cv::imshow("Distorted Image", distorted);
    cv::imshow("Undistorted Image", undistorted);
    cv::waitKey(0);

    return 0;
}


4. 使用場景

  1. 相機標定和校正:在使用相機拍攝之前或之後,你可能會希望校正影像中的幾何失真。
  2. 精確幾何分析:當你需要進行邊緣檢測、形狀檢測、特徵匹配等任務時,失真影像可能會影響精度,校正影像能提高分析的準確性。
  3. 擴增實境:在擴增實境(AR)應用中,將虛擬物件疊加在現實世界的場景上時,需要對影像進行畸變校正,以避免虛擬物件的位置失準。


5. 注意事項

  • 相機矩陣和失真係數通常是透過相機標定獲得的,這需要多張影像和標定物件(如棋盤格)。
  • 如果輸入影像已經被校正,那麼不再需要使用 cv::undistort(),重複校正會導致影像失真。


相關文章