亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

聊一聊OpenCV相機標定

2020-01-26 13:49:03
字體:
來源:轉載
供稿:網友

相機標定:簡單的說,就是獲得相機參數的過程。參數如:相機內參數矩陣,投影矩陣,旋轉矩陣和平移矩陣等

什么叫相機參數?

簡單的說,將現實世界中的人、物,拍成一張圖像(二維)。人或物在世界中的三維坐標,和圖像上對應的二維坐標間的關系。表達兩種不同維度坐標間的關系用啥表示?用相機參數。

相機的成像原理

先來看一下,相機的成像原理:

這里寫圖片描述 

如圖所示,這是一個相機模型。將物體簡化看成一個點。來自物體的光,通過鏡頭,擊中圖像平面(圖像傳感器),以此成像。d0是物體到鏡頭的距離,di時鏡頭到圖像平面的距離,f是鏡頭的焦距。三者滿足以下關系。

這里寫圖片描述 

現在,簡化上面的相機模型。

將相機孔徑看成無窮小,只考慮中心位置的射線,這樣就忽視了透鏡的影響。然后由于d0遠遠大于di,將圖像平面放在焦距處,這樣物體在圖像平面上成像為倒立的影像(沒有透鏡的影響,只考慮從中心的孔徑進入的光線)。這個簡化的模型就是針孔攝像機模型。然后,我們在鏡頭前,將圖像平面放在焦距距離的位置,就可以簡單獲得一個筆直的圖像(不倒立)。當然,這只是理論上的,你不可能將圖像傳感器從相機里拿出來,放在鏡頭前面。實際應用中,針孔攝像機應該是將成像后的圖像倒過來,以獲得正立的圖像。
到此,我們獲得了一個簡化的模型,如下圖:

這里寫圖片描述 

h0是物體的高,hi是圖像上物體的高,f是焦距(距離),d0是圖像到鏡頭的距離。四者滿足如下關系:

這里寫圖片描述(1)

物體在圖像中的高度hi,和d0成反比。也就是說,離鏡頭越遠,物體在圖像中越小,離得越近越大(好吧,這句話是廢話)。
但通過這個式子,我們便能夠預測三維中的物體,在圖像(二維)中的位置。那么怎么預測?

相機標定

如下圖所示,根據上面簡化的模型,考慮三維世界中的一個點,和其在圖像(二維)中的坐標關系。

這里寫圖片描述 

(X,Y,Z)為點的三維坐標,(x,y)為其通過相機成像后在圖像(二維)上的坐標。u0和v0是相機的中心點(主點),該點位于圖像平面中心(理論上是這樣。但實際的相機會有幾個像素的偏差)
現在只考慮y方向上,由于需要將三維世界中的坐標,轉換為圖像上的像素(圖像上的坐標,實際上是像素的位置),需要求y方向上焦距等于多少個像素(用像素值表示焦距),Py表示像素的高,焦距f(米或毫米)。垂直像素表示的焦距為

這里寫圖片描述

根據式子(1),只考慮y方向。我們三維世界中得點,在圖像(二維)中y的坐標。

這里寫圖片描述 

同理,得到x的坐標。

這里寫圖片描述 

現在,將上圖中的坐標系的原點O,移動到圖像的左上角。由于(x,y)是關于(u0,v0)的偏移,上面表示圖像(二維)中點的坐標的式子不變。將式子以矩陣的形式重寫,得。

這里寫圖片描述 

其中,等式左邊的第一個矩陣,叫做“相機內參數矩陣”,第二個矩陣叫(投影矩陣)。

更為一般的情況,開始時的參考坐標系不位于主點(中心點),需要額外兩個參數“旋轉向量”和“平移向量”來表示這個式子,這兩個參數在不同視角中是不一樣的。整合后,上述式子重寫為。

這里寫圖片描述

校正畸變

通過相機標定,獲得了相機參數后,可以計算兩個映射函數(x坐標和y坐標),它們分別給出了沒有畸變的圖像坐標。將畸變的圖像重新映射成為沒有畸變的圖像。

代碼:

做相機標定時,一般用標定板(棋盤)拍攝一組圖像,利用這些圖像提取角點,通過角點在圖像中得坐標和三維世界中的坐標(通常自定義3維坐標),計算相機參數。

std::vector<cv::Point2f>imageConers;//提取標定圖像角點,保存角點坐標(二維) cv::findChessboardCorners(image, boardSize, //角點數目如(6,4)六行,四列 imageConers);

函數calibrateCamera完成相機標定工作。

cv::calibrateCamera(objectPoints,//三維坐標 imagePoints, //二維坐標 imageSize,//圖像大小 camerMatirx,//相機內參數矩陣 disCoeffs,//投影矩陣 rvecs, //旋轉 tvecs,//平移flag //標記opencv提供幾種參數,可以參看在線的opencv document);

計算畸變參數,去畸變

//計算畸變參數cv::initUndistortRectifyMap(camerMatirx, disCoeffs,  cv::Mat(), cv::Mat(), image.size(), CV_32FC1,   map1, //x映射函數  map2 //y映射函數  );//應用映射函數cv::remap(image, //畸變圖像undistorted, //去畸變圖像map1, map2, cv::INTER_LINEAR);

現在整合代碼。

示例:

標頭.h

#include<opencv2/core/core.hpp>#include<opencv2/highgui/highgui.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/calib3d/calib3d.hpp>#include <opencv2/features2d/features2d.hpp>#include<string>#include<vector>class CameraCalibrator{private:  //世界坐標  std::vector < std::vector<cv::Point3f >> objectPoints;  //圖像坐標  std::vector <std::vector<cv::Point2f>> imagePoints;  //輸出矩陣  cv::Mat camerMatirx;  cv::Mat disCoeffs;  //標記  int flag;  //去畸變參數  cv::Mat map1, map2;  //是否去畸變  bool mustInitUndistort;  ///保存點數據  void addPoints(const std::vector<cv::Point2f>&imageConers, const std::vector<cv::Point3f>&objectConers)  {    imagePoints.push_back(imageConers);    objectPoints.push_back(objectConers);  }public:  CameraCalibrator() :flag(0), mustInitUndistort(true){}  //打開棋盤圖片,提取角點  int addChessboardPoints(const std::vector<std::string>&filelist,cv::Size &boardSize)  {    std::vector<cv::Point2f>imageConers;    std::vector<cv::Point3f>objectConers;    //輸入角點的世界坐標    for (int i = 0; i < boardSize.height; i++)    {      for (int j = 0; j < boardSize.width; j++)      {        objectConers.push_back(cv::Point3f(i, j, 0.0f));      }    }    //計算角點在圖像中的坐標    cv::Mat image;    int success = 0;    for (int i = 0; i < filelist.size(); i++)    {      image = cv::imread(filelist[i],0);      //找到角點坐標      bool found = cv::findChessboardCorners(image, boardSize, imageConers);      cv::cornerSubPix(image,         imageConers,        cv::Size(5, 5),        cv::Size(-1, -1),        cv::TermCriteria(cv::TermCriteria::MAX_ITER + cv::TermCriteria::EPS,        30, 0.1));      if (imageConers.size() == boardSize.area())      {        addPoints(imageConers, objectConers);        success++;      }      //畫出角點      cv::drawChessboardCorners(image, boardSize, imageConers, found);      cv::imshow("Corners on Chessboard", image);      cv::waitKey(100);    }    return success;  }  //相機標定  double calibrate(cv::Size&imageSize)  {    mustInitUndistort = true;    std::vector<cv::Mat>rvecs, tvecs;    //相機標定    return cv::calibrateCamera(objectPoints, imagePoints, imageSize,      camerMatirx, disCoeffs, rvecs, tvecs, flag);  }  ///去畸變  cv::Mat remap(const cv::Mat &image)  {    cv::Mat undistorted;    if (mustInitUndistort)    {      //計算畸變參數      cv::initUndistortRectifyMap(camerMatirx, disCoeffs,        cv::Mat(), cv::Mat(), image.size(), CV_32FC1, map1, map2);      mustInitUndistort = false;    }    //應用映射函數    cv::remap(image, undistorted, map1, map2, cv::INTER_LINEAR);    return undistorted;  }  //常成員函數,獲得相機內參數矩陣、投影矩陣數據  cv::Mat getCameraMatrix() const { return camerMatirx; }  cv::Mat getDistCoeffs()  const { return disCoeffs; }};

源.cpp

#include"標頭.h"#include<iomanip>#include<iostream>int main(){  CameraCalibrator Cc;  cv::Mat image;  std::vector<std::string> filelist;  cv::namedWindow("Image");  for (int i = 1; i <= 22; i++)  {    ///讀取圖片    std::stringstream s;    s << "D:/images/chessboards/chessboard" << std::setw(2) << std::setfill('0') << i << ".jpg";    std::cout << s.str() << std::endl;    filelist.push_back(s.str());    image = cv::imread(s.str(),0);    cv::imshow("Image", image);    cv::waitKey(100);  }  //相機標定  cv::Size boardSize(6, 4);  Cc.addChessboardPoints(filelist, boardSize);  Cc.calibrate(image.size());  //去畸變  image = cv::imread(filelist[1]);  cv::Mat uImage=Cc.remap(image);  cv::imshow("原圖像", image);  cv::imshow("去畸變", uImage);  //顯示相機內參數矩陣  cv::Mat cameraMatrix = Cc.getCameraMatrix();  std::cout << " Camera intrinsic: " << cameraMatrix.rows << "x" << cameraMatrix.cols << std::endl;  std::cout << cameraMatrix.at<double>(0, 0) << " " << cameraMatrix.at<double>(0, 1) << " " << cameraMatrix.at<double>(0, 2) << std::endl;  std::cout << cameraMatrix.at<double>(1, 0) << " " << cameraMatrix.at<double>(1, 1) << " " << cameraMatrix.at<double>(1, 2) << std::endl;  std::cout << cameraMatrix.at<double>(2, 0) << " " << cameraMatrix.at<double>(2, 1) << " " << cameraMatrix.at<double>(2, 2) << std::endl;  cv::waitKey(0);}

實驗結果:

這里寫圖片描述
這里寫圖片描述 

看以看到,相機內參數矩陣為

172.654 、0、157.829
0、184.195、118.635
0 、0 、1

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本欧美国产在线| 91av在线免费观看视频| 欧美午夜影院在线视频| 国内精品视频一区| 日韩性生活视频| 亚洲午夜久久久影院| 91色精品视频在线| 欧美乱大交xxxxx另类电影| 日韩hd视频在线观看| 夜夜狂射影院欧美极品| 国产成人亚洲综合91| 欧美日韩中文字幕在线| 久久手机精品视频| 日韩精品视频在线观看免费| 一区二区欧美在线| 色噜噜亚洲精品中文字幕| 国产精选久久久久久| 亚洲欧美日韩国产中文| 欧美国产亚洲精品久久久8v| 97在线视频免费| 国产大片精品免费永久看nba| 精品久久久香蕉免费精品视频| 亚洲欧洲激情在线| 欧美日韩国产中文字幕| 精品久久香蕉国产线看观看亚洲| 日韩美女免费视频| 亚洲国产精品电影| 亚洲最新av在线| 欧美xxxx14xxxxx性爽| 久久久亚洲国产天美传媒修理工| 欧美日韩精品在线播放| 欧美高清视频免费观看| 日韩一级黄色av| 亚洲综合最新在线| 色青青草原桃花久久综合| 亚洲自拍高清视频网站| 51精品国产黑色丝袜高跟鞋| 91久久国产综合久久91精品网站| 久久亚洲精品国产亚洲老地址| 久久视频中文字幕| 国产va免费精品高清在线| 亚洲日本成人女熟在线观看| 精品五月天久久| 午夜精品福利视频| 国产精品丝袜一区二区三区| 日韩欧美a级成人黄色| 国产成人精品在线播放| 国语自产精品视频在线看一大j8| 国产精品久久久久久久久久久久久| 国产不卡在线观看| 亚洲欧美日韩中文在线| 日韩av在线天堂网| 日本精品视频在线播放| 日韩欧美a级成人黄色| 欧美日韩一区二区免费视频| 欧美另类暴力丝袜| 色偷偷av一区二区三区| 亚洲成人精品在线| 久久69精品久久久久久国产越南| 亚洲欧美国产va在线影院| 裸体女人亚洲精品一区| 26uuu另类亚洲欧美日本老年| 91精品国产综合久久香蕉最新版| 国产a级全部精品| 7777kkkk成人观看| 久久成年人视频| 亚洲黄色av女优在线观看| 在线一区二区日韩| 国产欧美久久久久久| 国产日韩欧美日韩大片| 少妇高潮久久久久久潘金莲| 亚洲欧美三级在线| 亚洲影视九九影院在线观看| 欧美精品做受xxx性少妇| 国产精品无av码在线观看| 国产欧美精品日韩| 精品自拍视频在线观看| 亚洲一区二区三区视频播放| 亚洲午夜精品久久久久久性色| 欧美激情一级精品国产| 亚洲精品美女在线| 国产精品99久久久久久白浆小说| 亚洲欧美日本精品| 91国在线精品国内播放| 欧美性一区二区三区| 日韩精品中文字幕视频在线| 日韩欧中文字幕| 亚洲第一页自拍| 91在线中文字幕| 久久久免费观看| 精品国产视频在线| 97在线视频免费播放| 日韩欧美国产一区二区| 国产亚洲精品久久久久久牛牛| 欧美一区二区三区免费观看| 亚洲毛片在线免费观看| 成人免费观看49www在线观看| 91免费在线视频| 欧美国产日韩免费| 国产成人拍精品视频午夜网站| 在线视频免费一区二区| 亚洲已满18点击进入在线看片| 精品久久久久久久中文字幕| 欧美激情久久久久| 久久影视电视剧免费网站清宫辞电视| 中文在线资源观看视频网站免费不卡| 中文在线资源观看视频网站免费不卡| 国a精品视频大全| 国产成人欧美在线观看| 欧美性精品220| 欧美日韩一区二区三区在线免费观看| 欧美福利视频在线观看| 欧美极品第一页| 91美女片黄在线观看游戏| 日韩中文字幕久久| 97精品伊人久久久大香线蕉| 欧美亚洲视频一区二区| 奇米影视亚洲狠狠色| 国产99久久精品一区二区永久免费| 欧美激情一区二区三区久久久| 欧美丰满片xxx777| 日本精品久久久久影院| 久久综合免费视频| 日本欧美爱爱爱| 亚洲国产精品va在看黑人| 日韩精品在线视频| 亚洲女人初尝黑人巨大| 91精品在线播放| 91九色在线视频| 国产精品永久免费观看| 国产亚洲精品激情久久| 中文字幕一精品亚洲无线一区| 57pao成人永久免费视频| 久久香蕉国产线看观看av| 夜色77av精品影院| 久久精品国产综合| 26uuu亚洲伊人春色| 中文字幕日本欧美| 亚洲第一页中文字幕| xxxx欧美18另类的高清| 亚洲激情视频网| 日韩国产精品一区| 欧美成人在线影院| 久久精品99久久香蕉国产色戒| 久久色精品视频| 日韩精品视频中文在线观看| 中文字幕久久亚洲| 国产成人精品一区| 美乳少妇欧美精品| 亚洲欧美综合v| 欧美激情欧美激情| 国产精品久久久久久久久借妻| 亚洲自拍另类欧美丝袜| 国产欧美日韩专区发布| 91av在线免费观看视频| 亚洲www永久成人夜色| 久久国内精品一国内精品| 4438全国成人免费| 国产精品69久久| 成人97在线观看视频| 日韩高清有码在线| 国产视频精品xxxx| 亚洲精品久久视频| 欧美极品少妇xxxxⅹ免费视频|