设为首页 加入收藏

TOP

OpenCV: 摄像机标定原理(一)
2014-11-23 19:06:04 来源: 作者: 【 】 浏览:88
Tags:OpenCV: 摄像机 标定 原理

OpenCV: 摄像机标定原理


#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include
#include

using namespace std;

int main()
{
int cube_length=7;

CvCapture* capture;

capture=cvCreateCameraCapture(0);

if(capture==0){
printf("无法捕获摄像头设备!\n\n");
return 0;
}else{
printf("捕获摄像头设备成功!!\n\n");
}

IplImage* frame;

cvNamedWindow("摄像机帧截取窗口",1); //cvNamedWindow()函数用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。函数的第一个参数指定了该窗口的窗口标题,如果要使用HighGUI库所提供的其他函数与该窗口进行交互时,我们将通过该参数值引用这个窗口。


printf("按“C”键截取当前帧并保存为标定图片...\n按“Q”键退出截取帧过程...\n\n");

int number_image=1;
char *str1;
str1=".jpg";
char filename[20]="";

while(true)
{
frame=cvQueryFrame(capture);// 从摄像头或者文件中抓取并返回一帧
if(!frame)
break;
cvShowImage("摄像机帧截取窗口",frame); //图像显示


if(cvWaitKey(10)=='c'){
sprintf_s (filename,"%d.jpg",number_image); // int sprintf_s( char *buffer, size_t sizeOfBuffer, const char *format [, argument] ... );



这个函数的主要作用是将若干个argument按照format格式存到buffer中




cvSaveImage(filename,frame);//保存
cout<<"成功获取当前帧,并以文件名"< printf("按“C”键截取当前帧并保存为标定图片...\n按“Q”键退出截取帧过程...\n\n");
number_image++;
}else if(cvWaitKey(10)=='q'){
printf("截取图像帧过程完成...\n\n");
cout<<"共成功截取"<<--number_image<<"帧图像!!\n\n";
break;
}
}

cvReleaseImage(&frame); //释放图像

cvDestroyWindow("摄像机帧截取窗口");

IplImage * show;
cvNamedWindow("RePlay",1);

int a=1;
int number_image_copy=number_image;

CvSize board_size=cvSize(7,7); // Cvsizes:OpenCV的基本数据类型之一。表示矩阵框大小,以像素为精度。与CvPoint结构类似,但数据成员是integer类型的width和height。
//cvSize是

int board_width=board_size.width;
int board_height=board_size.height;
int total_per_image=board_width*board_height;
CvPoint2D32f * image_points_buf = new CvPoint2D32f[total_per_image];
CvMat * image_points=cvCreateMat(number_image*total_per_image,2,CV_32FC1);//图像坐标系
CvMat * object_points=cvCreateMat(number_image*total_per_image,3,CV_32FC1);//世界坐标系
CvMat * point_counts=cvCreateMat(number_image,1,CV_32SC1);//
CvMat * intrinsic_matrix=cvCreateMat(3,3,CV_32FC1);//
CvMat * distortion_coeffs=cvCreateMat(5,1,CV_32FC1);

int count;
int found;
int step;
int successes=0;

while(a<=number_image_copy){
sprintf_s (filename,"%d.jpg",a);
show=cvLoadImage(filename,-1);

found=cvFindChessboardCorners(show,board_size,image_points_buf,&count,
CV_CALIB_CB_ADAPTIVE_THRESH|CV_CALIB_CB_FILTER_QUADS);
if(found==0){
cout<<"第"< cvNamedWindow("RePlay",1);
cvShowImage("RePlay",show);
cvWaitKey(0);

}else{
cout<<"第"<
cvNamedWindow("RePlay",1);

IplImage * gray_image= cvCreateImage(cvGetSize(show),8,1); //创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, int channels ); depth 图像元素的位深度

cvCvtColor(show,gray_image,CV_BGR2GRAY); // cvCvtColor(...),是Opencv里的颜色空间转换函数,可以实现rgb颜色向HSV,HSI等颜色空间的转换,也可以转换为灰度图像。

cout<<"获取源图像灰度图过程完成...\n";
cvFindCornerSubPix(gray_image,image_points_buf,count,cvSize(11,11),cvSize(-1,-1),由于非常接近P的像素产生了很小的特征值,所以这个自相关矩阵并不总是可逆的。为了解决这个问题,一般可以简单地剔除离P点非常近的像素。输入参数:ero_zone定义了一个禁区(与win相似,但通

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenCV: 三对点计算仿射变换 下一篇OpenCV: 密集透射变换

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: