松崗建網(wǎng)站十八大禁用黃app入口
- 操作系統(tǒng):ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 編程語言:C++11
算法描述
轉(zhuǎn)換圖像以補(bǔ)償鏡頭畸變。
該函數(shù)通過變換圖像來補(bǔ)償徑向和切向鏡頭畸變。
此函數(shù)僅僅是 initUndistortRectifyMap(使用單位矩陣 R)和 remap(使用雙線性插值)的組合。有關(guān)執(zhí)行的具體變換詳情,請(qǐng)參閱前者函數(shù)。
對(duì)于在源圖像中沒有對(duì)應(yīng)像素的目的圖像中的像素,將用零(黑色)填充。
可以通過 newCameraMatrix 來調(diào)節(jié)源圖像中哪些特定子集將在校正后的圖像中可見。你可以使用 getOptimalNewCameraMatrix 來根據(jù)你的需求計(jì)算適當(dāng)?shù)?newCameraMatrix。
相機(jī)矩陣和畸變參數(shù)可以使用 calibrateCamera 確定。如果圖像的分辨率與標(biāo)定階段使用的分辨率不同,則需要相應(yīng)地縮放 fx, fy, cx 和 cy,而畸變系數(shù)保持不變。
cv::undistort 是 OpenCV 庫中的一個(gè)函數(shù),用于校正圖像的畸變。它根據(jù)提供的相機(jī)內(nèi)參矩陣 (cameraMatrix) 和畸變系數(shù) (distCoeffs) 來移除圖像中的徑向和切向畸變。如果提供了新的相機(jī)矩陣 (newCameraMatrix),則還可以對(duì)圖像進(jìn)行重新映射以適應(yīng)不同的視角或裁剪區(qū)域。
函數(shù)原型
void cv::undistort
(InputArray src,OutputArray dst,InputArray cameraMatrix,InputArray distCoeffs,InputArray newCameraMatrix = noArray()
)
參數(shù)
src:輸入(畸變)圖像。
dst:輸出(校正)圖像,該圖像具有與 src 相同的尺寸和類型。
cameraMatrix:輸入相機(jī)矩陣 A = [ f x 0 c x 0 f y c y 0 0 1 ] A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} A= ?fx?00?0fy?0?cx?cy?1? ?
distCoeffs:輸入的畸變系數(shù)向量,包含 4、5、8、12 或 14 個(gè)元素,具體為 (k1, k2, p1, p2 [,k3 [,k4, k5, k6 [,s1, s2, s3, s4 [,τx, τy]]]])。如果該向量為 NULL 或空,則假定畸變系數(shù)為零。
newCameraMatrix:畸變圖像的相機(jī)矩陣。默認(rèn)情況下,它與 cameraMatrix 相同,但你可以通過使用不同的矩陣來額外縮放和平移結(jié)果。
代碼示例
#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{// 讀取輸入圖像Mat src = imread( "/media/dingxin/data/study/OpenCV/sources/images/distorted_image.jpg" );if ( src.empty() ){cout << "Could not open or find the image!" << endl;return -1;}// 假設(shè)我們已經(jīng)得到了相機(jī)的內(nèi)參矩陣 cameraMatrix 和畸變系數(shù) distCoeffs// 這些值通常是通過相機(jī)標(biāo)定獲得的。// 下面的例子中,我們將使用一些假設(shè)的值。Mat cameraMatrix = ( Mat_< double >( 3, 3 ) << 520.9, 0, 328.1, 0, 521.0, 247.6, 0, 0, 1 );Mat distCoeffs = ( Mat_< double >( 5, 1 ) << 0.2624, -0.9531, -0.0054, 0.0026, 1.1633 );// 定義輸出圖像Mat dst;// 畸變校正undistort( src, dst, cameraMatrix, distCoeffs );// 或者使用新的相機(jī)矩陣進(jìn)行畸變校正,以優(yōu)化結(jié)果// 首先計(jì)算最佳的新相機(jī)矩陣Mat newCameraMatrix;Rect validPixROI;newCameraMatrix = getOptimalNewCameraMatrix( cameraMatrix, distCoeffs, src.size(), 1, src.size(), &validPixROI );// 使用新相機(jī)矩陣進(jìn)行畸變校正undistort( src, dst, cameraMatrix, distCoeffs, newCameraMatrix );// 顯示原圖和校正后的圖像imshow( "Distorted Image", src );imshow( "Undistorted Image", dst );waitKey( 0 ); // 等待按鍵關(guān)閉窗口// 保存校正后的圖像imwrite( "undistorted_image.png", dst );return 0;
}