• 基于双目相机拍摄图像的深度信息提取和目标测距matlab仿真


    目录

    1.算法描述

    2.仿真效果预览

    3.MATLAB核心程序

    4.完整MATLAB程序


    1.算法描述

           双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目,但我们见到的主流双目都是做成左右的。在左右双目的相机中,我们可以把两个相机都看作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于x轴上。它们的距离称为双目相机的基线(Baseline,记作b),是双目的重要参数。双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目,但我们见到的主流双目都是做成左右的。在左右双目的相机中,我们可以把两个相机都看作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于x轴上。它们的距离称为双目相机的基线(Baseline,记作b),是双目的重要参数。

          考虑一个空间点P,它在左眼和右眼各成一像,记作PL,PR。由于相机基线的存在,这两个成像位置是不同的。理想情况下,由于左右相机只有在x轴上有位移,因此 P的像也只在x轴(对应图像的u轴)上有差异。我们记它在左侧的坐标为uL,右侧坐标为uR。那么,它们的几何关系如图1右侧所示。根据三角形P−PL−PR和P−OL−OR 的相似关系,有:       

    整理得:

           这里d为左右图的横坐标之差,称为视差(Disparity)。根据视差,我们可以估计一个像素离相机的距离。视差与距离成反比:视差越大,距离越近。同时,由于视差最小为一个像素,于是双目的深度存在一个理论上的最大值,由fb确定。我们看到,当基线越长时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。
    基线:两个光心的连线称为基线;

    极平面:物点(空间点M)与两个光心的连线构成的平面称为极平面;

    极线:极平面与成像平面的交线

    极点:极线的一端,基线与像平面的交点

    像点:极线的一端,光心与物点连线与像平面的交点;

    相机成像系统中,共包含四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。

    2.仿真效果预览

    matlab2022a仿真结果如下:

     

    3.MATLAB核心程序

    1. %计算物体的深度距离
    2. PL=imread('IMAGES\p1.jpg');
    3. subplot(241),imshow(PL),title('左侧拍摄图像');
    4. PL=rgb2gray(PL);
    5. PL=255-PL;
    6. PL1=im2bw(PL,0.8);
    7. subplot(242),imshow(PL1),title('阈值分割图像');
    8. se1=strel('rectangle',[5 5]);
    9. PL2=imclose(PL1,se1); %闭运算
    10. se2=strel('rectangle',[5 5]);
    11. PL3=imopen(PL2,se2); %开运算
    12. subplot(243),imshow(PL2),title('形态学处理');
    13. imwrite(PL3,'PL3.bmp','bmp')
    14. k=1;sum1=0;
    15. for j=1:518 %计算目标一的像素突变点
    16. for i=1:388
    17. sum1=sum1+PL3(i,j);
    18. end
    19. k=k+1;
    20. P(k)=sum1/318;
    21. sum1=0;
    22. end
    23. x=1:518;
    24. y=P(x);
    25. subplot(244),plot(x,y),title('灰度变化图');
    26. plot(x,y);
    27. for i=2:518 %计算目标二的像素突变点
    28. if ((P(i-1)<0.01)&(P(i)>0.01)&(P(i)<0.16))
    29. Z(1)=i;
    30. continue
    31. end
    32. if ((P(i-1)<0.1)&(P(i)>0.16))
    33. Z(2)=i;
    34. continue
    35. end
    36. end
    37. %===============================
    38. %计算右边图像的目标位置
    39. %===============================
    40. PR=imread('IMAGES\p2.jpg');
    41. subplot(245),imshow(PR);title('右侧拍摄图像');
    42. PR=rgb2gray(PR);
    43. PR=255-PR;
    44. PR1=im2bw(PR,0.8);
    45. subplot(246),imshow(PR1);title('阈值分割图像');
    46. se1=strel('rectangle',[5 5]);
    47. PR2=imclose(PR1,se1);
    48. se2=strel('rectangle',[5 5]);
    49. PR3=imopen(PR2,se2);
    50. subplot(247),imshow(PR3),title('形态学处理');
    51. k=1;sum2=0;
    52. for j=1:518
    53. for i=1:388
    54. sum2=sum2+PR3(i,j);
    55. end
    56. k=k+1;
    57. Q(k)=sum2/318;
    58. sum2=0;
    59. end
    60. A59

    4.完整MATLAB程序

    matlab源码说明_我爱C编程的博客-CSDN博客

    V

  • 相关阅读:
    行业快讯 | 2022国际嵌入式展展示了哪些新技术?
    学术论文中的Introduction与Background
    SpringBoot
    HTTP状态码301和302的区别
    MongoDB实验——MongoDB配置用户的访问控制
    猴子也能学会的jQuery第十二期——jQuery遍历(中)
    Flink入门系列05-时间语义
    深度学习对 MRI 进行分类
    面试系列Spring:循环依赖Spring是如何解决的
    微服务调用没有返回值,无法组成对象,但是会有feign的信息
  • 原文地址:https://blog.csdn.net/hlayumi1234567/article/details/128053281