Opencv2.0 单目相机标定,畸变矫正
来源:互联网 发布:淘宝上架时间技巧 编辑:程序博客网 时间:2024/05/03 04:24
步骤:
(1)制作棋盘格,打印Opencv自带的9*7的棋盘格到A4纸上。棋盘格方格大小为27*27mm。
(2)对准相机晃动棋盘格。得到多张图像。注意棋盘格角度不要过大,出图像边界。距离相机近点。
(3)使用得到的图像,比如10张,一般大于5张。使用Opencv2.0的程序进行相机标定。获取内参和畸变系数矩阵。(程序见下方)
(4)使用内参和畸变系数矩阵进行图像矫正。
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//#define CALIB //打开此宏则为标定,否则为矫正
int main(int argc,char *argv[])
{
#ifdef CALIB
int numBoards = 10; // 图像个数
int board_w = 8; // 棋盘格X方向格子个数-1
int board_h = 6; // 棋盘格Y方向格子个数-1
Size board_sz = Size(board_w, board_h);
int board_n = board_w*board_h;
vector > objectPoints;
vector > imagePoints;
vector corners;
Mat img, gray;
int success = 0;
int k = 0;
bool found = false;
Size sz;
vector obj;
for (int j=0; j
{
obj.push_back(Point3f(j/board_w*27, (j%board_w)*27, 0.0f));
}
//读入一个文件夹下图像
char *path = "Imgs\\";
int count = 0;
char numidx[10] = {0};
char filename[20] = {0};
for (count=0; count
{
memset(numidx,0,10);
itoa(count+1,numidx,10);
memset(filename,0,20);
strcat(filename,path);
strcat(filename,numidx);
strcat(filename,".jpg");
img = imread(filename);
sz = Size(img.cols,img.rows);
if (img.empty())
{
continue;
}
cvtColor(img, gray, CV_BGR2GRAY);
found = findChessboardCorners(gray, board_sz, corners,
CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
// returns bool if found or not
if (found)
{
imagePoints.push_back(corners);
objectPoints.push_back(obj);
printf ("Corners stored\n");
success++;
(1)制作棋盘格,打印Opencv自带的9*7的棋盘格到A4纸上。棋盘格方格大小为27*27mm。
(2)对准相机晃动棋盘格。得到多张图像。注意棋盘格角度不要过大,出图像边界。距离相机近点。
(3)使用得到的图像,比如10张,一般大于5张。使用Opencv2.0的程序进行相机标定。获取内参和畸变系数矩阵。(程序见下方)
(4)使用内参和畸变系数矩阵进行图像矫正。
#include "stdafx.h"
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
//#define CALIB //打开此宏则为标定,否则为矫正
int main(int argc,char *argv[])
{
#ifdef CALIB