資源簡介
利用opencv圖像算法庫實現對相機內外參的標定,并利用標定結果對畸變圖像進行校正。
代碼片段和文件信息
#include?“stdio.h“
#include?
#include?
#include?
#include?“opencv2/opencv.hpp“
#include?
#include?“opencv2/calib3d/calib3d.hpp“
#include?
using?namespace?std;
using?namespace?cv;
void?getFiles(string?path?vector&?files)
{
//文件句柄
intptr_t?hFile?=?0;
//文件信息
struct?_finddata_t?fileinfo;
string?p;
if?((hFile?=?_findfirst(p.assign(path).append(“\\*“).c_str()?&fileinfo))?!=?-1)
{
do
{
//如果是目錄迭代之
//如果不是加入列表
if?((fileinfo.attrib?&??_A_SUBDIR))
{
if?(strcmp(fileinfo.name?“.“)?!=?0?&&?strcmp(fileinfo.name?“..“)?!=?0)
getFiles(p.assign(path).append(“\\“).append(fileinfo.name)?files);
}
else
{
files.push_back(p.assign(path).append(“\\“).append(fileinfo.name));
}
}?while?(_findnext(hFile?&fileinfo)?==?0);
_findclose(hFile);
}
}
int?main()
{
string?filePath?=?“D:\\uidq0829\\Desktop\\rgb\\2“;
vector?files;
////獲取該路徑下的所有文件
getFiles(filePath?files);
const?int?board_w?=?9;
const?int?board_h?=?9;
const?int?NPoints?=?board_w?*?board_h;//棋盤格內角點總數
const?int?boardSize?=?20;?//mm
Mat?image?grayimage;
Size?ChessBoardSize?=?cv::Size(board_w?board_h);
vector?tempcorners;
vector?object;
for?(int?j?=?0;?j? {
object.push_back(Point3f((j?%?board_w)?*?boardSize?(j?/?board_w)?*?boardSize?0));
}
cv::Matx33d?intrinsics;//z:相機內參
//cv::Vec4d?distortion_coeff;//z:相機畸變系數
cv::Mat?distortion_coeff;?//z:相機畸變系數
vector?>?objectv;
vector?>?imagev;
Size?corrected_size(1280?720);
Mat?mapx?mapy;
Mat?corrected;
ofstream?intrinsicfile(“intrinsics_front1103.txt“);
ofstream?disfile(“dis_coeff_front1103.txt“);
int?num?=?0;
bool?bCalib?=?false;
namedWindow(“corner_image“?0);
resizeWindow(“corner_image“?Size(1280?720));
namedWindow(“corrected“?0);
resizeWindow(“corrected“?Size(1280?720));
while?(num? {
image?=?imread(files[num]);
if?(image.empty())
break;
imshow(“corner_image“?image);
waitKey(10);
cvtColor(image?grayimage?CV_BGR2GRAY);
IplImage?tempgray?=?grayimage;
bool?findchessboard?=?cvCheckChessboard(&tempgray?ChessBoardSize);
if?(findchessboard)
{
bool?find_corners_result?=?findChessboardCorners(grayimage?ChessBoardSize?tempcorners?3);
if?(find_corners_result)
{
cornerSubPix(grayimage?tempcorners?cvSize(5?5)?cvSize(-1?-1)?cvTermCriteria(CV_TERMCRIT_EPS?+?CV_TERMCRIT_ITER?30?0.1));
drawChessboardCorners(image?ChessBoardSize?tempcorners?find_corners_result);
imshow(“corner_image“?image);
cvWaitKey(2000);
objectv.push_back(object);
imagev.push_back(tempcorners);
cout?<“capture?“?< }
}
tempcorners.clear();
num++;
}
//cv::Mat?cameraMatirx?distCoeffs;
std::vector?r
- 上一篇:使用C語言來擴展PHP,寫PHP擴展dll
- 下一篇:NSGA多目標遺傳算法
評論
共有 條評論