版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)員工培訓(xùn)與技能提升計劃制度
- 企業(yè)內(nèi)部保密責(zé)任追究制度
- 2026福建省面向西南財經(jīng)選調(diào)生選拔工作備考題庫附答案
- 2026紅河州公安局邊境管理支隊公開招聘邊境管控專職輔警(15人)參考題庫附答案
- 2026貴州博通橡塑制品有限公司招聘6人備考題庫附答案
- 2026遼寧鞍山市鐵東區(qū)事業(yè)單位面向應(yīng)屆畢業(yè)生招聘高層次急需緊缺人才16人參考題庫附答案
- 2026重慶飛駛特人力資源管理有限公司外派至招商局檢測車輛技術(shù)研究院有限公司招聘參考題庫附答案
- 2026陜西西安長安大學(xué)工程設(shè)計研究院有限公司招聘參考題庫附答案
- 226湖南郴州市宜章縣婦幼保健院招募見習(xí)生2人參考題庫附答案
- 四川藏區(qū)高速公路集團有限責(zé)任公司2026年校園招聘考試備考題庫附答案
- GB/T 44819-2024煤層自然發(fā)火標(biāo)志氣體及臨界值確定方法
- GB 29415-2013耐火電纜槽盒
- 中國古代經(jīng)濟試題
- 真空采血管的分類及應(yīng)用及采血順序課件
- 軟件定義汽車:產(chǎn)業(yè)生態(tài)創(chuàng)新白皮書
- 安裝工程實體質(zhì)量情況評價表
- 動力觸探試驗課件
- 城市軌道交通安全管理課件(完整版)
- 八大浪費培訓(xùn)(整理)
- 幼兒園機器人課件.ppt
- 印鐵制罐項目商業(yè)策劃書_范文
評論
0/150
提交評論