OpenCV相機標(biāo)定的全過程記錄_第1頁
OpenCV相機標(biāo)定的全過程記錄_第2頁
OpenCV相機標(biāo)定的全過程記錄_第3頁
OpenCV相機標(biāo)定的全過程記錄_第4頁
OpenCV相機標(biāo)定的全過程記錄_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

第OpenCV相機標(biāo)定的全過程記錄目錄一、OpenCV標(biāo)定的幾個常用函數(shù)findChessboardCorners()棋盤格角點檢測cv::drawChessboardCorners()棋盤格角點的繪制find4QuadCornerSubpix()對粗提取的角點進行精確化cornerSubPix()亞像素檢測calibrateCamera()求解攝像機的內(nèi)在參數(shù)和外在參數(shù)initUndistortRectifyMap()計算畸變參數(shù)二、繪制棋盤格,拍攝照片三、相機標(biāo)定四、對圖片進行校正總結(jié)

一、OpenCV標(biāo)定的幾個常用函數(shù)

findChessboardCorners()棋盤格角點檢測

boolfindChessboardCorners(InputArrayimage,

SizepatternSize,

OutputArraycorners,

intflags=CALIB_CB_ADAPTIVE_THRESH+

CALIB_CB_NORMALIZE_IMAGE);

第一個參數(shù)是輸入的棋盤格圖像(可以是8位單通道或三通道圖像);

第二個參數(shù)是棋盤格內(nèi)部的角點的行列數(shù)(注意:不是棋盤格的行列數(shù),如棋盤格的行列數(shù)分別為4、8,而內(nèi)部角點的行列數(shù)分別是3、7,因此這里應(yīng)該指定為cv::Size(3,7));

第三個參數(shù)是檢測到的棋盤格角點,類型為std::vectorcv::Point2f。

第四個參數(shù)flag,用于指定在檢測棋盤格角點的過程中所應(yīng)用的一種或多種過濾方法,可以使用下面的一種或多種,如果都是用則使用OR:

cv::CALIB_CB_ADAPTIVE_THRESH:使用自適應(yīng)閾值將圖像轉(zhuǎn)化成二值圖像cv::CALIB_CB_NORMALIZE_IMAGE:歸一化圖像灰度系數(shù)(用直方圖均衡化或者自適應(yīng)閾值)cv::CALIB_CB_FILTER_QUADS:在輪廓提取階段,使用附加條件排除錯誤的假設(shè)cv::CALIB_CV_FAST_CHECK:快速檢測

cv::drawChessboardCorners()棋盤格角點的繪制

drawChessboardCorners(InputOutputArrayimage,

SizepatternSize,

InputArraycorners,

boolpatternWasFound);

image為8-bit,三通道圖像patternSize,每一行每一列的角corners,已經(jīng)檢測到的角patternWasFound,findChessboardCorners的返回值

find4QuadCornerSubpix()對粗提取的角點進行精確化

find4QuadCornerSubpix(InputArrayimg,

InputOutputArraycorners,

Sizeregion_size);

image源圖像corners,提供角點的初始坐標(biāo)region_size:搜索窗口的一般尺寸

cornerSubPix()亞像素檢測

voidcornerSubPix(InputArrayimage,

InputOutputArraycorners,

SizewinSize,

SizezeroZone,

TermCriteriacriteria);

image源圖像corners,提供角點的初始坐標(biāo),返回更加精確的點winSize,搜索窗口的一般尺寸,如果winSize=Size(5,5),則searchwindows為11*11winSize,死區(qū)的一般尺寸,用來避免自相關(guān)矩陣的奇點,(-1,-1)表示沒有死區(qū)criteria,控制迭代次數(shù)和精度

calibrateCamera()求解攝像機的內(nèi)在參數(shù)和外在參數(shù)

doublecalibrateCamera(InputArrayOfArraysobjectPoints,

InputArrayOfArraysimagePoints,

SizeimageSize,

InputOutputArraycameraMatrix,

InputOutputArraydistCoeffs,

OutputArrayOfArraysrvecs,OutputArrayOfArraystvecs,

intflags=0,

TermCriteriacriteria=TermCriteria(TermCriteria::COUNT+

TermCriteria::EPS,30,DBL_EPSILON));

objectPoints,世界坐標(biāo),用vectorvector,輸入x,y坐標(biāo),z坐標(biāo)為0

imagePoints,圖像坐標(biāo),vectorvector

imageSize,圖像的大小用于初始化標(biāo)定攝像機的image的size

cameraMatrix,內(nèi)參數(shù)矩陣

distCoeffs,畸變矩陣

rvecs,位移向量

tvecs,旋轉(zhuǎn)向量

flags,可以組合:

CV_CALIB_USE_INTRINSIC_GUESS:使用該參數(shù)時,將包含有效的fx,fy,cx,cy的估計值的內(nèi)參矩陣cameraMatrix,作為初始值輸入,然后函數(shù)對其做進一步優(yōu)化。如果不使用這個參數(shù),用圖像的中心點初始化光軸點坐標(biāo)(cx,cy),使用最小二乘估算出fx,fy(這種求法好像和張正友的論文不一樣,不知道為何要這樣處理)。注意,如果已知內(nèi)部參數(shù)(內(nèi)參矩陣和畸變系數(shù)),就不需要使用這個函數(shù)來估計外參,可以使用solvepnp()函數(shù)計算外參數(shù)矩陣。

CV_CALIB_FIX_PRINCIPAL_POINT:在進行優(yōu)化時會固定光軸點,光軸點將保持為圖像的中心點。當(dāng)CV_CALIB_USE_INTRINSIC_GUESS參數(shù)被設(shè)置,保持為輸入的值。

CV_CALIB_FIX_ASPECT_RATIO:固定fx/fy的比值,只將fy作為可變量,進行優(yōu)化計算。當(dāng)

CV_CALIB_USE_INTRINSIC_GUESS沒有被設(shè)置,fx和fy的實際輸入值將會被忽略,只有fx/fy的比值被計算和使用。

CV_CALIB_ZERO_TANGENT_DIST:切向畸變系數(shù)(P1,P2)被設(shè)置為零并保持為零。

CV_CALIB_FIX_K1,,CV_CALIB_FIX_K6:對應(yīng)的徑向畸變系數(shù)在優(yōu)化中保持不變。如果設(shè)置了CV_CALIB_USE_INTRINSIC_GUESS參數(shù),就從提供的畸變系數(shù)矩陣中得到。否則,設(shè)置為0。

CV_CALIB_RATIONAL_MODEL(理想模型):啟用畸變k4,k5,k6三個畸變參數(shù)。使標(biāo)定函數(shù)使用有理模型,返回8個系數(shù)。如果沒有設(shè)置,則只計算其它5個畸變參數(shù)。

CALIB_THIN_PRISM_MODEL(薄棱鏡畸變模型):啟用畸變系數(shù)S1、S2、S3和S4。使標(biāo)定函數(shù)使用薄棱柱模型并返回12個系數(shù)。如果不設(shè)置標(biāo)志,則函數(shù)計算并返回只有5個失真系數(shù)。

CALIB_FIX_S1_S2_S3_S4:優(yōu)化過程中不改變薄棱鏡畸變系數(shù)S1、S2、S3、S4。如果cv_calib_use_intrinsic_guess設(shè)置,使用提供的畸變系數(shù)矩陣中的值。否則,設(shè)置為0。

CALIB_TILTED_MODEL(傾斜模型):啟用畸變系數(shù)tauXandtauY。標(biāo)定函數(shù)使用傾斜傳感器模型并返回14個系數(shù)。如果不設(shè)置標(biāo)志,則函數(shù)計算并返回只有5個失真系數(shù)。

CALIB_FIX_TAUX_TAUY:在優(yōu)化過程中,傾斜傳感器模型的系數(shù)不被改變。如果cv_calib_use_intrinsic_guess設(shè)置,從提供的畸變系數(shù)矩陣中得到。否則,設(shè)置為0。

initUndistortRectifyMap()計算畸變參數(shù)

voidinitUndistortRectifyMap(InputArraycameraMatrix,

InputArraydistCoeffs,

InputArrayR,

InputArraynewCameraMatrix,

Sizesize,

intm1type,

OutputArraymap1,

OutputArraymap2)

cameraMatrix,攝像機內(nèi)參數(shù)矩陣distCoeffs,攝像機的5個畸變系數(shù),(k1,k2,p1,p2[,k3[,k4,k5,k6]])R,在客觀空間中的轉(zhuǎn)換對象newCameraMatrix,新的3*3的浮點型矩矩陣size,為失真圖像的大小m1type,第一個輸出的map,類型為CV_32FC1或CV_16SC2map1,x映射函數(shù)map2,y映射函數(shù)

二、繪制棋盤格,拍攝照片

這里自己畫一個棋盤格用作標(biāo)定,長度為1280像素,寬490像素,橫向10方格,縱向7方格

std_cb=Vision::makeCheckerboard(1280,490,10,7,0,

(char*)"../blizzard/res/calibration/std_cb.png");

效果如圖

Vision是我個人創(chuàng)建的視覺類,可以用來繪制標(biāo)準(zhǔn)的棋盤格。

頭文件vision.h

//

//Createdbyczhon18-10-16.

#ifndefOPENGL_PRO_VISION_H

#defineOPENGL_PRO_VISION_H

#include"opencv2/opencv.hpp"

#includeopencv2/core/core.hpp

#includeopencv2/highgui/highgui.hpp

#includeopencv2/imgcodecs/imgcodecs.hpp

#include"iostream"

classVision{

public:

staticcv::Matread(std::stringfile_path,intflags=cv::IMREAD_ANYCOLOR|cv::IMREAD_ANYDEPTH);

staticcv::Matwrite(std::stringfile_path,intflags=cv::IMREAD_ANYCOLOR|cv::IMREAD_ANYDEPTH);

staticvoiddispConfig(cv::Matimg);

staticcv::MatmakeCheckerboard(intbkgWidth,intbkgHeight,intsqXnum,intsqYnum=0,intborderThickness=0,char*savePath=NULL);

private:

#endif//OPENGL_PRO_VISION_H

源文件vision.cpp

//

//Createdbyczhon18-10-16.

#include"vision.h"

#include"string.h"

usingnamespacestd;

usingnamespacecv;

constchar*findName(constchar*ch){

constchar*name=strrchr(ch,'/');

return++name;

cv::MatVision::read(std::stringfile_path,intflags){

printf("#Visionread\n");

cv::Matimg;

img=cv::imread(file_path,flags);

if(img.data==NULL){

printf("\tError:visionread\n");

}else{

dispConfig(img);

returnimg;

voidVision::dispConfig(cv::Matimg){

printf("\tpixel:%d*%d,channels:%d\n",img.size().width,img.size().height,img.channels());

cv::MatVision::makeCheckerboard(intbkgWidth,intbkgHeight,intsqXnum,intsqYnum,intthickNum,char*savePath){

if(sqYnum==0){

sqYnum=sqXnum;

if(savePath==NULL){

char*defaultPath=(char*)"../res/calibration/maths.png";

savePath=defaultPath;

intcheckboardX=0;//棋盤x坐標(biāo)

intcheckboardY=0;//棋盤y坐標(biāo)

intxLen=bkgWidth/sqXnum;//x方格長度

intyLen=bkgHeight/sqYnum;//y方格長度

cv::Matimg(bkgHeight+thickNum*2,bkgWidth+thickNum*2,CV_8UC4,cv::Scalar(0,255,255,255));

for(inti=0;iimg.rows;i++){

for(intj=0;jimg.cols;j++){

if(ithickNum||i=thickNum+bkgHeight||jthickNum||j=thickNum+bkgWidth){

img.atVecuchar,4(i,j)=cv::Scalar(0,0,0,255);

continue;

checkboardX=j-thickNum;

checkboardY=i-thickNum;

if(checkboardY/yLen%2==0){

if((checkboardX)/xLen%2==0){

img.atVecuchar,4(i,j)=cv::Scalar(255,255,255,255);

}else{

img.atVecuchar,4(i,j)=cv::Scalar(0,0,0,255);

else{

if((checkboardX)/xLen%2!=0){

img.atVecuchar,4(i,j)=cv::Scalar(255,255,255,255);

}else{

img.atVecuchar,4(i,j)=cv::Scalar(0,0,0,255);

imwrite(savePath,img);//保存生成的圖片

printf("#makeCheckerboard%d*%d\n",bkgWidth+thickNum,bkgHeight+thickNum);

returnimg;

用A4紙打印棋盤格,相機拍攝照片。

我偷懶,拿了別人的標(biāo)定照片

三、相機標(biāo)定

下面是相機標(biāo)定代碼

cv::imwrite("../blizzard/res/calibration/cb_source.png",cb_source);

printf("#Startscancorner\n");

cv::Matimg;

std::vectorcv::Point2fimage_points;

std::vectorstd::vectorcv::Point2fimage_points_seq;/*保存檢測到的所有角點*/

if(cv::findChessboardCorners(cb_source,cv::Size(aqXnum,aqYnum),image_points,0)==0){

printf("#Error:Cornersnotfind");

return0;

}else{

cvtColor(cb_source,img,CV_RGBA2GRAY);

cv::imwrite("../blizzard/res/calibration/cb_gray.png",img);

//find4QuadCornerSubpix(img,image_points,cv::Size(5,5));

cv::cornerSubPix(img,image_points,cv::Size(11,11),cv::Size(-1,-1),

cv::TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS,30,0.01));

image_points_seq.push_back(image_points);

cv::Matcb_corner;

cb_corner=cb_source.clone();

drawChessboardCorners(cb_corner,cv::Size(aqXnum,aqYnum),image_points,true);

cv::imwrite("../blizzard/res/calibration/cb_corner.png",cb_corner);

printf("#Startcalibrate\n");

cv::Sizesquare_size=cv::Size(14.2222,12);

std::vectorstd::vectorcv::Point3fobject_points;/*保存標(biāo)定板上角點的三維坐標(biāo)*/

cv::MatcameraMatrix=cv::Mat(3,3,CV_32FC1,cv::Scalar::all(0));/*攝像機內(nèi)參數(shù)矩陣*/

cv::MatdistCoeffs=cv::Mat(1,5,CV_32FC1,cv::Scalar::all(0));/*攝像機的5個畸變系數(shù):k1,k2,p1,p2,k3*/

std::vectorcv::MattvecsMat;/*每幅圖像的旋轉(zhuǎn)向量*/

std::vectorcv::MatrvecsMat;/*每幅圖像的平移向量*/

std::vectorcv::Point3frealPoint;

for(inti=0;iaqYnum;i++){

for(intj=0;jaqXnum;j++){

cv::Point3ftempPoint;

/*假設(shè)標(biāo)定板放在世界坐標(biāo)系中z=0的平面上*/

tempPoint.x=i*square_size.width;

tempPoint.y=j*square_size.height;

tempPoint.z=0;

realPoint.push_back(tempPoint);

object_points.push_back(realPoint);

printf("#objectPoints:%ld\n",sizeof(object_points[0]));

std::coutobject_points[0]std::endl;

printf("#image_points:%ld\n",sizeof(image_points_seq[0]));

std::coutimage_pointsstd::endl;

pri

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論