标签:blog http color os io 文件 for 2014
资源下载见:http://download.csdn.net/detail/zhouyelihua/7726907
在Vs2012中只要直接按f5就可以直接对资源中采集的图像进行标定。
而我们将最后的结果以.xml的形式存储下来。这个在工程文件下可以直接找到的
其中外参数,中旋转矩阵存在rotation.xml
位移向量存在translation.xml
内参数:内部矩阵存在Intrinsics.xml
畸变系数存在Distortion.xml
具体程序如下:(改自于<learning opencv>)
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <stdlib.h>
int n_boards = 0; //Will be set by input list
const int board_dt = 10;
int board_w;
int board_h;
void help(){
printf("Calibration from disk. Call convention:\n\n"
" ch11_ex11_1_fromdisk board_w board_h image_list\n\n"
"Where: board_{w,h} are the # of internal corners in the checkerboard\n"
" width (board_w) and height (board_h)\n"
" image_list is space separated list of path/filename of checkerboard\n"
" images\n\n"
"Hit 'p' to pause/unpause, ESC to quit. After calibration, press any other key to step through the images\n\n");
}
int main() {
CvCapture* capture;
board_w =12;
board_h = 12;
int board_n = board_w * board_h;
CvSize board_sz = cvSize( board_w, board_h );
FILE *fptr = fopen("..\\ConsoleApplication26\\sb.txt","r");
char names[2048];
//COUNT THE NUMBER OF IMAGES:
while(fscanf(fptr,"%s ",names)==1){
n_boards++;
}
rewind(fptr);
cvNamedWindow( "Calibration" );
//ALLOCATE STORAGE
CvMat* image_points = cvCreateMat(n_boards*board_n,2,CV_32FC1);
CvMat* object_points = cvCreateMat(n_boards*board_n,3,CV_32FC1);
CvMat* point_counts = cvCreateMat(n_boards,1,CV_32SC1);
CvMat* rotation = cvCreateMat(3,1,CV_32FC1);
CvMat* translation_vector = cvCreateMat(3,1,CV_32FC1);
CvMat* rotation_mat_final = cvCreateMat(3,3,CV_32FC1);
CvMat* intrinsic_matrix = cvCreateMat(3,3,CV_32FC1);
CvMat* distortion_coeffs = cvCreateMat(4,1,CV_32FC1);
IplImage* image = 0;// = cvQueryFrame( capture );
IplImage* gray_image = 0; //for subpixel
CvPoint2D32f* corners = new CvPoint2D32f[ board_n ];
int corner_count;
int successes = 0;
int step;
for( int frame=0; frame<n_boards; frame++ ) {
fscanf(fptr,"%s ",names);
if(image){
cvReleaseImage(&image);
image = 0;
}
image = cvLoadImage( names);
if(gray_image == 0 && image) //We'll need this for subpixel accurate stuff
gray_image = cvCreateImage(cvGetSize(image),8,1);
if(!image)
printf("null image\n");
int found = cvFindChessboardCorners(
image,
board_sz,
corners,
&corner_count,
CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS
);
//Get Subpixel accuracy on those corners
cvCvtColor(image, gray_image, CV_BGR2GRAY);
cvFindCornerSubPix(gray_image, corners, corner_count,
cvSize(11,11),cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));
//Draw it
cvDrawChessboardCorners(image, board_sz, corners, corner_count, found);
cvShowImage( "Calibration", image );
// If we got a good board, add it to our data
//
if( corner_count == board_n ) {
step = successes*board_n;
// printf("Found = %d for %s\n",found,names);
for( int i=step, j=0; j<board_n; ++i,++j ) {
/// CV_MAT_ELEM(*image_points, CvPoint2D32f,0,i) = cvPoint2D32f(corners[j].x,corners[j].y);
/// CV_MAT_ELEM(*object_points,CvPoint3D32f,0,i) = cvPoint3D32f(j/board_w, j%board_w, 0.0f);
CV_MAT_ELEM(*image_points, float,i,0) = corners[j].x;
CV_MAT_ELEM(*image_points, float,i,1) = corners[j].y;
CV_MAT_ELEM(*object_points,float,i,0) = j/board_w;
CV_MAT_ELEM(*object_points,float,i,1) = j%board_w;
CV_MAT_ELEM(*object_points,float,i,2) = 0.0f;
}
// CV_MAT_ELEM(*point_counts, int,0,successes) = board_n;
CV_MAT_ELEM(*point_counts, int,successes,0) = board_n;
successes++;
}
// if( successes == n_boards ) break;
int c = cvWaitKey(15);
if(c == 'p') {
c = 0;
while(c != 'p' && c != 27){
c = cvWaitKey(250);
}
}
if(c == 27)
return 0;
}
printf("successes = %d, n_boards=%d\n",successes,n_boards);
//ALLOCATE MATRICES ACCORDING TO HOW MANY IMAGES WE FOUND CHESSBOARDS ON
/// CvMat* image_points2 = cvCreateMat(1,successes*board_n,CV_32FC2);
/// CvMat* object_points2 = cvCreateMat(1,successes*board_n,CV_32FC3);
/// CvMat* point_counts2 = cvCreateMat(1,successes,CV_32SC1);
CvMat* object_points2 = cvCreateMat(successes*board_n,3,CV_32FC1);
CvMat* image_points2 = cvCreateMat(successes*board_n,2,CV_32FC1);
CvMat* point_counts2 = cvCreateMat(successes,1,CV_32SC1);
//TRANSFER THE POINTS INTO THE CORRECT SIZE MATRICES
for(int i = 0; i<successes*board_n; ++i){
/// CV_MAT_ELEM(*image_points2, CvPoint2D32f,0,i) = CV_MAT_ELEM(*image_points, CvPoint2D32f,0,i);
/// CV_MAT_ELEM(*object_points2,CvPoint3D32f,0,i) = CV_MAT_ELEM(*object_points,CvPoint3D32f,0,i);
CV_MAT_ELEM(*image_points2, float,i,0) = CV_MAT_ELEM(*image_points, float,i,0);
CV_MAT_ELEM(*image_points2, float,i,1) = CV_MAT_ELEM(*image_points, float,i,1);
CV_MAT_ELEM(*object_points2,float,i,0) = CV_MAT_ELEM(*object_points,float,i,0) ;
CV_MAT_ELEM(*object_points2,float,i,1) = CV_MAT_ELEM(*object_points,float,i,1) ;
CV_MAT_ELEM(*object_points2,float,i,2) = CV_MAT_ELEM(*object_points,float,i,2) ;
}
for(int i=0; i<successes; ++i){
/// CV_MAT_ELEM(*point_counts2,int,0, i) = CV_MAT_ELEM(*point_counts, int,0,i);
CV_MAT_ELEM(*point_counts2,int,i, 0) = CV_MAT_ELEM(*point_counts, int,i,0);
}
cvReleaseMat(&object_points);
cvReleaseMat(&image_points);
cvReleaseMat(&point_counts);
// cvWaitKey();//Now we have to reallocate the matrices
// return 0;
// At this point we have all of the chessboard corners we need.
//
// Initialize the intrinsic matrix such that the two focal
// lengths have a ratio of 1.0
//
CV_MAT_ELEM( *intrinsic_matrix, float, 0, 0 ) = 1.0f;
CV_MAT_ELEM( *intrinsic_matrix, float, 1, 1 ) = 1.0f;
printf("cvCalibrateCamera2\n");
cvCalibrateCamera2(
object_points2,
image_points2,
point_counts2,
cvGetSize( image ),
intrinsic_matrix,
distortion_coeffs,
NULL,
NULL,
0//CV_CALIB_FIX_ASPECT_RATIO
);
cvFindExtrinsicCameraParams2(
object_points2, image_points2,
intrinsic_matrix,distortion_coeffs,
rotation,translation_vector
);
// Save our work
cvRodrigues2(rotation,rotation_mat_final);
cvSave("rotation.xml",rotation_mat_final);
cvSave("translation.xml",translation_vector);
cvSave("Intrinsics.xml",intrinsic_matrix);
cvSave("Distortion.xml",distortion_coeffs);
// Load test
CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml");
CvMat *distortion = (CvMat*)cvLoad("Distortion.xml");
// Build the undistort map which we will use for all
// subsequent frames.
//
IplImage* mapx = cvCreateImage( cvGetSize(image), IPL_DEPTH_32F, 1 );
IplImage* mapy = cvCreateImage( cvGetSize(image), IPL_DEPTH_32F, 1 );
printf("cvInitUndistortMap\n");
cvInitUndistortMap(
intrinsic,
distortion,
mapx,
mapy
);
// Just run the camera to the screen, now only showing the undistorted
// image.
//
rewind(fptr);
cvNamedWindow( "Undistort" );
printf("\n\nPress any key to step through the images, ESC to quit\n\n");
while(fscanf(fptr,"%s ",names)==1){
if(image){
cvReleaseImage(&image);
image = 0;
}
image = cvLoadImage( names);
IplImage *t = cvCloneImage(image);
cvShowImage( "Calibration", image );
cvRemap( t, image, mapx, mapy );
cvReleaseImage(&t);
// cvUndistort2(
cvShowImage("Undistort", image);
if((cvWaitKey()&0x7F) == 27) break;
}
return 0;
} 标签:blog http color os io 文件 for 2014
原文地址:http://blog.csdn.net/zhouyelihua/article/details/38421377