matlab-小型物体三维轮廓测量技术(数据处理)

实验:

使用双目相机对棋盘靶标进行拍摄,左右相机同步进行拍照。

数据处理

使用matlab处理图像:

  1. 打开应用程序
    在这里插入图片描述
    在这里插入图片描述

  2. 导入图像
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 图像处理在这里插入图片描述

  • 跑出来图像误差太大,有个别柱状图相比其它柱状图高度差距过大。
    在这里插入图片描述
  • 点击误差最大最大的柱状图,看上方图像,发现好多红色十字并未在蓝色圆圈里
    在这里插入图片描述
  • 删除误差较大的图像:
    点击柱状图,会自动跳到对应图像组,右键会出现remove选项 点击进行删除,重复删除误差较大(最高/最低)图像组。此过程比较耗时,请耐心等待。
    在删除过程中,会遇见所有柱状图或者大部分柱状图高度发生变化,请继续寻找差距最大的进行删除。

在这里插入图片描述
当柱状图变成到这种时,高度差变化不大,开始删除左右目也就是蓝色和黄色柱状图差距较大的图像组进行删除。此过程中,遇见高度高的或者低的,也需要进行删除。
在这里插入图片描述
此过程会出现很多问题,建议多次尝试,上面仅是个人经验。
最后成型图像为下:
在这里插入图片描述
在这里插入图片描述

  1. 获取数据:
    在这里插入图片描述
  • 双击打开
    在这里插入图片描述
  • a1,a2,R,T 四个数值为下图前四行(这四个值为程序中需要输入的四个变量)在这里插入图片描述在这里插入图片描述
  • 双击上图的变量所对应的行,处理a1,a2,以a1举例:
    标红为左相机内参数矩阵

在这里插入图片描述

  • 点进去之后,全选3*3矩阵,右键选择转置变量
  • R/T点进去也需要直接转置变量。
  1. 将刚才四组转置矩阵,输入到main程序中。

a1=[1646.80777266415,0,0
    0,1642.33223144883,0
    618.323694951300,509.886178480187,1]%左相机的内参数矩阵
a2=[[1707.40220639450,0,0
    0,1687.93360721008,0
    695.377400100982,558.384660026736,1]]%右相机的内参数矩阵
r=[0.759156062074799,-0.0295606920271779,-0.650237063617538
    0.00566446146072197,0.999230431462540,-0.0388131255575377
    0.650884004482706,0.0257819767678805,0.758739284855145]%右相机相对于左相机的旋转变换矩阵
t=[-356.762009162622%右相机相对于左相机的平移变换矩阵
    4.18110688845511
    129.126359347079]

程序处理:

使用画图板打开用双目相机拍摄的有物体的图像,选取六个或六个以上特征点,需要注意的是,特征点需要在左右相机的图片中都存在,并且在选取时,点之间的线不能交叉,最好按照一定顺序取点。
注意:程序里面的n为特征点个数,否则会出现维度错误

%将所选的x,y分别填入下方,下面矩阵函数,逗号左边1代表x,2代表y
%逗号右边代表特征点的编号,请按照取点顺序输入
%pointuv1为左目特征点矩阵pointuv2为右目特征点矩阵。
pointUV1(1,1)=703;
pointUV1(2,1)=258;
pointUV1(1,2)=723;
pointUV1(2,2)=626;

pointUV2(1,1)=182;
pointUV2(2,1)=477;
pointUV2(1,2)=185;
pointUV2(2,2)=725;

最后运行结果

在这里插入图片描述

整体代码:

main函数
clear;
pointUV1(1,1)=703;
pointUV1(2,1)=258;
pointUV1(1,2)=723;
pointUV1(2,2)=626;
pointUV1(1,3)=922;
pointUV1(2,3)=615;
pointUV1(1,4)=911;
pointUV1(2,4)=362;
pointUV1(1,5)=567;
pointUV1(2,5)=387;
pointUV1(1,6)=569;
pointUV1(2,6)=621;
pointUV2(1,1)=182;
pointUV2(2,1)=477;
pointUV2(1,2)=185;
pointUV2(2,2)=725;
pointUV2(1,3)=437;
pointUV2(2,3)=721;
pointUV2(1,4)=426;
pointUV2(2,4)=462;
pointUV2(1,5)=489;
pointUV2(2,5)=489;
pointUV2(1,6)=489;
pointUV2(2,6)=715;
a1=[1646.80777266415,0,0
    0,1642.33223144883,0
    618.323694951300,509.886178480187,1]%左相机的内参数矩阵
a2=[[1707.40220639450,0,0
    0,1687.93360721008,0
    695.377400100982,558.384660026736,1]]%右相机的内参数矩阵
r=[0.759156062074799,-0.0295606920271779,-0.650237063617538
    0.00566446146072197,0.999230431462540,-0.0388131255575377
    0.650884004482706,0.0257819767678805,0.758739284855145]%右相机相对于左相机的旋转变换矩阵
t=[-356.762009162622%右相机相对于左相机的平移变换矩阵
    4.18110688845511
    129.126359347079]
n=6 %选取了几个特征点,这里n就取几
[x,y,z]=get3DPoint(a1,a2,r,t,pointUV1,pointUV2,n);
figure,plot3(x,y,z);


get3DPoint 函数
% get3DPoint.m 用最小二乘法获得三维点(Xw,Yw,Zw)——以左相机为世界坐标系
%A1 左相机的内参数矩阵
%A2 右相机的内参数矩阵
%R2 右相机相对于左相机的旋转变换矩阵
%T2 右相机相对于左相机的平移变换矩阵


function [Xw, Yw, Zw] = get3DPoint(A1,A2,R2,T2,pointUV1,pointUV2,n)

R1 = eye(3);
T1 = [0; 0; 0];

point1 = zeros(3,1);
point2 = zeros(3,1);
Xw = zeros(n,1);
Yw = zeros(n,1);
Zw = zeros(n,1);

for i=1:n
      % 像素坐标系
       point1(1,1) = pointUV1(1,i);
       point1(2,1) = pointUV1(2,i);
       point1(3,1) = 1;

       % 像素坐标系
       point2(1,1) = pointUV2(1,i);
       point2(2,1) = pointUV2(2,i);
       point2(3,1) = 1;

       M1 = zeros(3,4);
       M2 = zeros(3,4);
       M1 = A1*[R1 T1];
       M2 = A2*[R2 T2];

       D1 = M1(1,4) - point1(1,1)*M1(3,4);
       D2 = M1(2,4) - point1(2,1)*M1(3,4);
       D3 = M2(1,4) - point2(1,1)*M2(3,4);
       D4 = M2(2,4) - point2(2,1)*M2(3,4);
       D = [D1; D2; D3; D4];

       C11 = point1(1,1)*M1(3,1) - M1(1,1);
       C12 = point1(1,1)*M1(3,2) - M1(1,2);
       C13 = point1(1,1)*M1(3,3) - M1(1,3);
       C21 = point1(2,1)*M1(3,1) - M1(2,1);
       C22 = point1(2,1)*M1(3,2) - M1(2,2);
       C23 = point1(2,1)*M1(3,3) - M1(2,3);
       C31 = point2(1,1)*M2(3,1) - M2(1,1);
       C32 = point2(1,1)*M2(3,2) - M2(1,2);
       C33 = point2(1,1)*M2(3,3) - M2(1,3);
       C41 = point2(2,1)*M2(3,1) - M2(2,1);
       C42 = point2(2,1)*M2(3,2) - M2(2,2);
       C43 = point2(2,1)*M2(3,3) - M2(2,3);
       C = [C11 C12 C13; C21 C22 C23; C31 C32 C33; C41 C42 C43];

       XYZ = pinv(C)*D;
       Xw(i,1) = XYZ(1,1);
       Yw(i,1) = XYZ(2,1);
       Zw(i,1) = XYZ(3,1);
end


发布了354 篇原创文章 · 获赞 280 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/Fly_Fly_Zhang/article/details/103216647