1.采集测量平面
2.平面定标
在Matlab中使用配准工具进行定标
A=imread('dingbiaoT.bmp'); B=imread('00.jpg'); %A=rgb2gray(A); B=rgb2gray(B); %figure;subplot(1,2,1);imshow(A);subplot(1,2,2);imshow(B); cpselect(A,B);
配准定标参数
Bp=[0 600;600 600;600 0;0 0]; %Bp=[0 600;600 600;600 0;0 0]; Ap(:,1)=Ap(:,1); %Ap(:,1)=Ap(:,1)-327; Ap(:,2)=640-Ap(:,2); %Ap(:,2)=680-(Ap(:,2)-(1024-91-680)); Ap(:,3)=Ap(:,1).*Ap(:,2); Ap(:,4)=[1;1;1;1]; App=inv(Ap); format long; X=App*Bp
将获取的参数输入VS2010的C语言程序中
#define A 0.016738758639437*100 #define B -0.000136077250928*100 #define C 0.000000098724741*100 #define D -1.580407887235702*100 #define E -0.001485699489405*100 #define F 0.010844771045906*100 #define G 0.000004850925603*100 #define H -0.544410044327290*100 #define X_Source 640 #define Y_Source 512 //开窗位置及尺寸 #define X_SIZE 512 #define Y_SIZE 640 #define X_Size 600 #define Y_Size 600 #include<stdio.h> #include"fimage.h" void main() { int i,j; int x,y; unsigned char bitHead[54]; unsigned char color[1024]; unsigned char image_in[X_SIZE][Y_SIZE]={0}; unsigned char imagein[Y_SIZE][X_SIZE]={0}; unsigned char imageout[Y_Size][X_Size]={0}; image_read(bitHead,color,(unsigned char *)image_in,"dingbiaoZ.bmp"); imwindow(image_in,imagein); SaveBmp("dingbiaoT.bmp",(unsigned char *)imagein,X_SIZE,Y_SIZE); for(i=0;i<Y_SIZE;i++) for(j=0;j<X_SIZE;j++) { x=(int)(A*j+B*i+C*i*j+D); y=(int)(E*j+F*i+G*i*j+H); if((x>-1)&&(y>-1)&&(x<X_Size)&&(y<Y_Size)) imageout[y][x]=imagein[i][j]; } SaveBmp("dingbiaoY.bmp",(unsigned char *)imageout,X_Size,Y_Size); }
然后获取到配准定标图
根据配追定标图数像素点,获取拟合方程,或者直接建立映射表单
比如上图数像素点之后,为计算各点到实际轴线的距离,使用如下操作
if( (info[j][i]>=0) && (info[j][i]<53) ) a=0.8844; else if( (info[j][i]>=53) && (info[j][i]<110) ) a=0.8833; else if( (info[j][i]>=110) && (info[j][i]<164) ) a=0.9157; else if( (info[j][i]>=164) && (info[j][i]<217) ) a=0.9365; else if( (info[j][i]>=218) && (info[j][i]<268) ) a=0.9803; else if( (info[j][i]>=268) && (info[j][i]<319) ) a=1; else if( (info[j][i]>=319) && (info[j][i]<368) ) a=1.0412; else if( (info[j][i]>=368) && (info[j][i]<415) ) a=1.0851; else if( (info[j][i]>=415) && (info[j][i]<462) ) a=1.1003; else if( (info[j][i]>=462) && (info[j][i]<508) ) a=1.1198; else if( (info[j][i]>=508) && (info[j][i]<555) ) a=1.1222; else if( (info[j][i]>=555) && (info[j][i]<600) ) a=1.1398; temp=(info[j][i]-AXISE) * (info[j+1][i]-AXISE)* Angle /2; if((info[j][i]-AXISE)<0) area=area+a*temp; else area=area-a*temp;
测量多个平面就可以复原三维图景,然后就完成了世界坐标系向理想坐标系的映射