目錄
- 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()
主要用於矯正因鏡頭產生的失真,使得影像中的物件恢復原來的形狀。相機鏡頭會產生兩種主要的失真:
- 徑向畸變(Radial Distortion):這種失真會導致影像中的直線出現彎曲,特別是在影像的邊緣。
- 切向畸變(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. 使用場景
- 相機標定和校正:在使用相機拍攝之前或之後,你可能會希望校正影像中的幾何失真。
- 精確幾何分析:當你需要進行邊緣檢測、形狀檢測、特徵匹配等任務時,失真影像可能會影響精度,校正影像能提高分析的準確性。
- 擴增實境:在擴增實境(AR)應用中,將虛擬物件疊加在現實世界的場景上時,需要對影像進行畸變校正,以避免虛擬物件的位置失準。
5. 注意事項
- 相機矩陣和失真係數通常是透過相機標定獲得的,這需要多張影像和標定物件(如棋盤格)。
- 如果輸入影像已經被校正,那麼不再需要使用
cv::undistort()
,重複校正會導致影像失真。