资源简介

基于opencv平台编写的单目相机标定程序,使用的张正友的方法,只要准备十二张单目相机拍摄的棋盘格的图片就可以标定出单目相机的焦距等参数,建立单目相机坐标系。可以用于机器视觉测量中,也可以用于双面相机标定的前一步,精度很高。

资源截图

代码片段和文件信息

//calib.cpp
//Calling convention:
//calib board_w board_h number_of_views
//
//Hit ‘p‘ to pause/unpause ESC to quit
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int n_boards = 16;//Will be set by input list
const int board_dt = 30;//wait 30 frames per chessboard view
int board_w;
int board_h;
CvSize imageSize = {00};
int main ()
{
board_w = 6;
board_h = 8;
n_boards = 16;
int board_n = board_w * board_h;
CvSize board_sz = cvSize( board_wboard_h );
IplImage *image*gray_image;
char* imageList = “list.txt“;
FILE* f = fopen(imageList “rt“);
//CvCapture* capture = cvCreateCameraCapture(0);
//assert( capture );
cvNamedWindow(“Calibration“);
//ALLOCATE STORAGE
CvMat* image_points = cvCreateMat(n_boards*board_n2CV_32FC1);
CvMat* object_points = cvCreateMat(n_boards*board_n3CV_32FC1);
CvMat* point_counts = cvCreateMat(n_boards1CV_32SC1);
CvMat* intrinsic_matrix = cvCreateMat(33CV_32FC1);
CvMat* distortion_coeffs = cvCreateMat(51CV_32FC1);
CvPoint2D32f* corners = new CvPoint2D32f[ board_n ];
int corner_count;
int successes = 0;
int step frame = 0;

//CAPTURE CORNER VIEWS LOOP UNTIL WE‘VE GOT n_boards
//SUCCESSFUL CAPTURES(ALL CORNERS ON THE BOARD ARE FOUND)
//
while (successes < n_boards){
//Skip every board_dt frames to allow user to move chessboard
if(frame++ % board_dt == 0){
//Find chessboard corners:
char filename[100];
      if( !fgets( filename sizeof(filename)-3 f ))
         break;
      size_t len = strlen(filename);
      while( len > 0 && isspace(filename[len-1]))
         filename[--len] = ‘\0‘;
      if( filename[0] == ‘#‘)
         continue; 
      IplImage* image = cvLoadImage( filename 0);
      if( !image )
         break;
  imageSize = cvGetSize(image);
int found = cvFindChessboardCorners(
image board_sz&corners[0] &corner_count
CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS);
//Get Subpixel accuracy on  those corners
if( found )
      {
cvFindCornerSubPix(image&corners[0]corner_count
cvSize(55)cvSize(-1-1)cvTermCriteria(
CV_TERMCRIT_EPS+CV_TERMCRIT_ITER3000.001));
//Draw it 
cvDrawChessboardCorners(imageboard_sz&corners[0]corner_countfound);
cvShowImage(“Calibration“image);
 }
//If we got a good board add it to our data
if( corner_count == board_n ){
step = successes*board_n;
for( int i = stepj= 0;j CV_MAT_ELEM(*image_pointsfloati0) = corners[j].x;
CV_MAT_ELEM(*image_pointsfloati1) = corners[j].y;
CV_MAT_ELEM(*object_pointsfloati0) = j/board_w;
CV_MAT_ELEM(*object_pointsfloati1) = j%board_w;
CV_MAT_ELEM(*object_pointsfloati2) = 0.0f;
}
CV_MAT_ELEM(*point_counts int successes0) = board_n;
successes++;
}

}//end skip board_dt between chessboard capture

//Handle pause/u

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    ..A..H.     27136  2020-01-30 13:38  danmu\.vs\danmu\v15\.suo

     文件    3284992  2020-01-30 13:38  danmu\.vs\danmu\v15\Browse.VC.db

     文件   21561344  2020-01-30 13:36  danmu\.vs\danmu\v15\ipch\AutoPCH\DANMU-d6674eff\DANMU-3784a836\DANMU.ipch

     文件       6137  2016-08-15 15:14  danmu\danmu\danmu.cpp

     文件       4766  2020-01-30 13:35  danmu\danmu\danmu.vcxproj

     文件        943  2016-03-01 17:41  danmu\danmu\danmu.vcxproj.filters

     文件        221  2020-01-30 13:35  danmu\danmu\danmu.vcxproj.user

     文件        654  2016-08-15 15:14  danmu\danmu\Debug\cl.command.1.tlog

     文件      20236  2016-08-15 15:14  danmu\danmu\Debug\CL.read.1.tlog

     文件        340  2016-08-15 15:14  danmu\danmu\Debug\CL.write.1.tlog

     文件       2424  2016-08-15 15:14  danmu\danmu\Debug\danmu.Build.CppClean.log

     文件        406  2016-08-15 15:14  danmu\danmu\Debug\danmu.exe.embed.manifest

     文件        472  2016-08-15 15:14  danmu\danmu\Debug\danmu.exe.embed.manifest.res

     文件        381  2016-08-15 15:14  danmu\danmu\Debug\danmu.exe.intermediate.manifest

     文件         76  2016-08-19 09:03  danmu\danmu\Debug\danmu.lastbuildstate

     文件        885  2016-08-19 09:03  danmu\danmu\Debug\danmu.log

     文件     114216  2016-08-15 15:14  danmu\danmu\Debug\danmu.obj

     文件        707  2016-08-19 09:03  danmu\danmu\Debug\danmu.vcxprojResolveAssemblyReference.cache

     文件          0  2016-08-15 15:14  danmu\danmu\Debug\danmu.write.1.tlog

     文件        200  2016-08-15 15:14  danmu\danmu\Debug\danmu_manifest.rc

     文件          2  2016-08-15 15:14  danmu\danmu\Debug\link-cvtres.read.1.tlog

     文件          2  2016-08-15 15:14  danmu\danmu\Debug\link-cvtres.write.1.tlog

     文件          2  2016-04-07 11:14  danmu\danmu\Debug\link.18556-cvtres.read.1.tlog

     文件          2  2016-04-07 11:14  danmu\danmu\Debug\link.18556-cvtres.write.1.tlog

     文件          2  2016-04-07 11:14  danmu\danmu\Debug\link.18556.read.1.tlog

     文件          2  2016-04-07 11:14  danmu\danmu\Debug\link.18556.write.1.tlog

     文件          2  2016-08-15 15:14  danmu\danmu\Debug\link.5376-cvtres.read.1.tlog

     文件          2  2016-08-15 15:14  danmu\danmu\Debug\link.5376-cvtres.write.1.tlog

     文件          2  2016-08-15 15:14  danmu\danmu\Debug\link.5376.read.1.tlog

     文件          2  2016-08-15 15:14  danmu\danmu\Debug\link.5376.write.1.tlog

............此处省略54个文件信息

评论

共有 条评论