关于单目摄像头标定,我采用了网上那个张正有的方法,但是出现了以下错误

Keith_Kobura 2016-04-13 05:49:28

大神们帮看看是啥问题,感激不尽!
源码如下:
#include "cvut.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace cvut;
using namespace std;
void main() {
ifstream fin("calibdata.txt");
ofstream fout("caliberation_result.txt");


cout<<"开始提取角点………………";
int image_count=0;
CvSize image_size;
CvSize board_size = cvSize(5,7);
CvPoint2D32f * image_points_buf = new CvPoint2D32f[board_size.width*board_size.height];
Seq<CvPoint2D32f> image_points_seq;

string filename;
while (std::getline(fin,filename))
{
cout<<"\n 将鼠标焦点移到标定图像所在窗口并输入回车进行下一幅图像的角点提取 \n";
image_count++;
int count;
Image<uchar> view(filename);
if (image_count == 1)
{

image_size.width = view.size().width;
image_size.height = view.size().height;
}

if (0 == cvFindChessboardCorners( view.cvimage, board_size,
image_points_buf, &count, CV_CALIB_CB_ADAPTIVE_THRESH ))

{
cout<<"can not find chessboard corners!\n";
exit(1);
}

else {
Image<uchar> view_gray(view.size(),8,1);

rgb2gray(view,view_gray);


cvFindCornerSubPix( view_gray.cvimage, image_points_buf, count, cvSize(11,11),
cvSize(-1,-1), cvTermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 30, 0.1 ));


image_points_seq.push_back(image_points_buf,count);


cvDrawChessboardCorners( view.cvimage, board_size, image_points_buf, count, 1);
view.show("calib");

cvWaitKey();
view.close();
}

}
delete []image_points_buf;
cout<<"角点提取完成!\n"<<endl;


cout<<"开始定标………………"<<"\n"<<endl;
CvSize square_size = cvSize(10,10);


Matrix<double> object_points(1,board_size.width*board_size.height*image_count,3);

Matrix<double> image_points(1,image_points_seq.cvseq->total,2);

Matrix<int> point_counts(1,image_count,1);
Matrix<double> intrinsic_matrix(3,3,1);
Matrix<double> distortion_coeffs(1,4,1);
Matrix<double> rotation_vectors(1,image_count,3);
Matrix<double> translation_vectors(1,image_count,3);


int i,j,t;
for (t=0;t<image_count;t++) {
for (i=0;i<board_size.height;i++) {
for (j=0;j<board_size.width;j++) {


object_points(0,t*board_size.height*board_size.width + i*board_size.width + j,0) = i*square_size.width;
object_points(0,t*board_size.height*board_size.width + i*board_size.width + j,1) = j*square_size.height;
object_points(0,t*board_size.height*board_size.width + i*board_size.width + j,2) = 0;
}
}
}


char str[10];
itoa(image_points_seq.cvseq->total,str,10);
cout<<str<<"\n"<<endl;

for (i=0;i<image_points_seq.cvseq->total;i++)
{
image_points(0,i,0) = image_points_seq[i].x;
image_points(0,i,1) = image_points_seq[i].y;
}

for (i=0;i<image_count;i++)
point_counts(0,i) = board_size.width*board_size.height;


cvCalibrateCamera2(object_points.cvmat,
image_points.cvmat,
point_counts.cvmat,
image_size,
intrinsic_matrix.cvmat,
distortion_coeffs.cvmat,
rotation_vectors.cvmat,
translation_vectors.cvmat,
0);
cout<<"定标完成!\n";

cout<<"标定结果显示\n";
cout<<"*************************************************\n";
cout<<"相机内参intrinsic_matrix\n";
for(int h=0;h<3;h++)
{
cout<<"X:"<<intrinsic_matrix(h,0,0)<<"\tY:"<<intrinsic_matrix(h,1,0)<<"\tZ:"<<intrinsic_matrix(h,2,0)<<"\n";
}
cout<<"\n畸变系数:distortion_coeffs\n";
for(int ndis=0;ndis<4;ndis++)
{
cout<<distortion_coeffs(0,ndis,0)<<"\\";
}
cout<<"\n";
cout<<"\nrotation_vectors\n";
for(int rot=0;rot<7;rot++)
{
cout<<"X:"<<rotation_vectors(0,rot,0)<<"\tY:"<<rotation_vectors(0,rot,1)<<"\tZ:"<<rotation_vectors(0,rot,2)<<"\n";
}
cout<<"\ntranslation_vectors\n";
for(i=0;i<7;i++)
{
cout<<"第"<<i+1<<"张图"<<"\tX:"<<translation_vectors(0,i,0)<<"\tY:"<<translation_vectors(0,i,1)<<"\tZ:"<<translation_vectors(0,i,2)<<"\n";
}
cout<<"***************************************************\n";

cout<<"开始评价定标结果………………\n";
double total_err = 0.0;
double err = 0.0;
Matrix<double> image_points2(1,point_counts(0,0,0),2);
int temp_num = point_counts(0,0,0);
cout<<"\t每幅图像的定标误差:\n";

fout<<"每幅图像的定标误差:\n";
for (i=0;i<image_count;i++)
{

cvProjectPoints2(object_points.get_cols(i * point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1).cvmat,
rotation_vectors.get_col(i).cvmat,
translation_vectors.get_col(i).cvmat,
intrinsic_matrix.cvmat,
distortion_coeffs.cvmat,
image_points2.cvmat,
0,0,0,0);


err = cvNorm(image_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1).cvmat,
image_points2.cvmat,
CV_L1);
total_err += err/=point_counts(0,0,0);
cout<<"******************************************************************\n";
cout<<"\t\t第"<<i+1<<"幅图像的平均误差:"<<err<<"像素"<<'\n';
fout<<"\t第"<<i+1<<"幅图像的平均误差:"<<err<<"像素"<<'\n';

cout<<"显示image_point2\n";
for(int ih=0;ih<7;ih++)
{
cout<<"X:"<<image_points2(0,ih,0)<<"\tY:"<<image_points2(0,ih,1)<<"\n";
}
cout<<"显示object_Points\n";
for(int iw=0;iw<7;iw++)
{
cout<<"X:"<<image_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1)(0,iw,0)
<<"\tY:"<<image_points.get_cols(i*point_counts(0,0,0),(i+1)*point_counts(0,0,0)-1)(0,iw,1)<<"\n";
}
}


cout<<"\t总体平均误差:"<<total_err/image_count<<"像素"<<'\n';
fout<<"总体平均误差:"<<total_err/image_count<<"像素"<<'\n'<<'\n';
cout<<"评价完成!\n";

cout<<"开始保存定标结果………………";
Matrix<double> rotation_vector(3,1);
Matrix<double> rotation_matrix(3,3);

fout<<"相机内参数矩阵:\n";
fout<<intrinsic_matrix<<'\n';
fout<<"畸变系数:\n";
fout<<distortion_coeffs<<'\n';
for (i=0;i<image_count;i++) {
fout<<"第"<<i+1<<"幅图像的旋转向量:\n";
fout<<rotation_vectors.get_col(i);

for (j=0;j<3;j++) {
rotation_vector(j,0,0) = rotation_vectors(0,i,j);
}

cvRodrigues2(rotation_vector.cvmat,rotation_matrix.cvmat);

fout<<"第"<<i+1<<"幅图像的旋转矩阵:\n";
fout<<rotation_matrix;
fout<<"第"<<i+1<<"幅图像的平移向量:\n";
fout<<translation_vectors.get_col(i)<<'\n';
}
cout<<"完成保存\n";
}
...全文
1101 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tomway彡 2018-09-24
  • 打赏
  • 举报
回复
那几个size()里面的参数有问题,具体看你标定板来改,有的size里面填写内角点个数,有的size里面填写你的标定块单位快的真实尺寸
qq_28092597 2017-04-15
  • 打赏
  • 举报
回复
楼主你好,我想问一下你是怎么打开图片的。谢谢回答
pr0gram 2016-06-15
  • 打赏
  • 举报
回复
我猜可能有识别错误的点。
  • 打赏
  • 举报
回复
你要先调试下,,是哪行代码出错的啊

4,447

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧