现在的位置: 首页 > 综合 > 正文

基于平面映射的视觉测量方法,C语言实现策略

2018年11月06日 ⁄ 综合 ⁄ 共 2215字 ⁄ 字号 评论关闭

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;

测量多个平面就可以复原三维图景,然后就完成了世界坐标系向理想坐标系的映射奋斗

抱歉!评论已关闭.