基于双目图像三维建模算法的测量目标物体体积计算matlab仿真

简介: 基于双目图像三维建模算法的测量目标物体体积计算matlab仿真

1.算法仿真效果
matlab2022a仿真结果如下:
8b4c7c86de749ac3adb21184da54c76c_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
0d4ed5f3a073fa866a56493df65dc86b_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
0304b6a9968a6f6ed0f44137bb60ee69_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png
7164ed968b49215de214df0a99bfa8db_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png

2.算法涉及理论知识概要

     双目立体视觉(Binocular StereoVision)是机器视觉的一种重要形式,它是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的深度感,建立特征间的对应关系,将同一空间物理点在不同图像中的映像点对应起来,这个差别,我们称作视差(Disparity)。双目图像就是通过左右两个摄像头拍摄的图片,存在一定视差。深度就是指实际物体到摄像头的距离。

image.png

  立体视觉意味着人工智能可以通过一对相机来感知图像的深度以及物体的距离。大多数三维相机模型都是基于立体视觉理论和技术的。两台摄像机之间设置一定的距离,这样它们就可以从不同的角度“看”物体。评估两个图像之间的对应关系,人工智能确定到目标的距离,分析,并建立目标的3D结构。

  为了度量体积,需要进行下面的步骤:

1、对一组连续的帧进行累积,这将增加错误恢复的弹性,用于对3D场景进行平均或细化。

2、只在场景中选择产品定义的点。这是通过使用颜色分割、模板匹配或神经网络语义分割来实现的。最快的方法是颜色分割。该方法的缺点是将设置绑定到特定的产品上,如果背景颜色和对象不是很清楚,可能会产生不好的结果。如果GPU优化是可能的,那么使用U形卷积神经网络如U-net和高级U-net,或全卷积神经网络会有较高的性能和分割精度。

3、对一个由产品定义的3D点组成的场景进行聚类。每个簇是一个对象。

4、为每个簇形成一个凸多边形,消除3d场景对象的边缘缺陷

5、使用线性插值恢复缺失的3D点

6、通过基于场景的几何聚类区域积分来计算单个对象的体积。

7、最后,计算所有物体的总体积。

3.MATLAB核心程序

figure;
showExtrinsics(stereoParams);
 
for ij = 1:10
..............................................................
 
figure;
subplot(3,2,1)
imshow(stereoAnaglyph(frameLeftRect, frameRightRect));
title('Rectified Frames');
frameLeftGray  = rgb2gray(frameLeftRect);
frameRightGray = rgb2gray(frameRightRect);
%% 三维重建
points3D = reconstructScene(disparityMap, stereoParams);
.......................................................................
subplot(3,2,6)
mesh(X, Y, Z);
 
%% 体积计算
Heights = sum(sum(abs(Z)));
S = abs((y0(2) - y0(1)) * (x0(2) - x0(1)));
V(ij) = Heights * S ;    % 体积
 
 
clear frameLeft frameRight
clear frameLeftRect frameRightRect
clear frameLeftGray frameRightGray disparityMap points3D ptCloud
clear ptCloudA Temp i j ptCloudB ptCloudC
clear model inlierIndices outlierIndices ptCloudPlane ptCloudD ptCloudE
clear  x y z x0 y0 X Y  Z Heights S
ij
end
 
 
 
 
figure;
plot(V,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.0,0.9,0.0]);
hold on
plot(Vreal,'-bo',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
xlabel('物体编号');
ylabel('体积mm3');
legend('算法计算值','真实值');
 
......................................................
modelNormal = model.Normal;
X_normal = [1 0 0];
Y_normal = [0 1 0];
% Z_normal = [0 0 1];
alpha = acos(dot(modelNormal, X_normal) / (norm(modelNormal) * norm(X_normal)));
beta = acos(dot(modelNormal, Y_normal) / (norm(modelNormal) * norm(Y_normal)));
theta = 0;
 
alpha = -(alpha - pi / 2);
beta = (beta - pi / 2);
 
% 旋转矩阵
R = [cos(beta) * cos(theta)                                         cos(beta) * sin(theta)                                          -sin(beta);
    -cos(alpha) * sin(theta) + sin(alpha) * sin(beta) * cos(theta)  cos(alpha) * cos(theta) + sin(alpha) * sin(beta) * sin(theta)   sin(alpha) * cos(beta);
    sin(alpha) * sin(theta) + cos(alpha) * sin(beta) * cos(theta)   -sin(alpha) * cos(theta) + cos(alpha) * sin(beta) * sin(theta)  cos(alpha) * cos(beta)];
 
Temp(:, 1) = pcIn.Location(:, 1);
Temp(:, 2) = pcIn.Location(:, 2);
Temp(:, 3) = pcIn.Location(:, 3);
 
% 旋转
Temp = Temp * R;
% Temp(:, 3) = Temp(:, 3) - min(Temp(:, 3));
 
% 平移
a = model.Parameters(1);
b = model.Parameters(2);
c = model.Parameters(3);
d = model.Parameters(4);
 
X = -150 : 0.1 : 150;
Y = -150 : 0.1 : 150;
panelZ = -(a * X + b * Y + d) / c;
 
Temp(:, 3) = Temp(:, 3) - median(panelZ);
 
pcOut = pointCloud(Temp);
相关文章
|
1天前
|
资源调度 算法 数据可视化
基于IEKF迭代扩展卡尔曼滤波算法的数据跟踪matlab仿真,对比EKF和UKF
本项目基于MATLAB2022A实现IEKF迭代扩展卡尔曼滤波算法的数据跟踪仿真,对比EKF和UKF的性能。通过仿真输出误差收敛曲线和误差协方差收敛曲线,展示三种滤波器的精度差异。核心程序包括数据处理、误差计算及可视化展示。IEKF通过多次迭代线性化过程,增强非线性处理能力;UKF避免线性化,使用sigma点直接处理非线性问题;EKF则通过一次线性化简化处理。
|
20小时前
|
算法 数据安全/隐私保护
泵浦光与斯托克斯光相遇耦合效应的matlab模拟与仿真
本程序使用MATLAB2022A模拟泵浦光与斯托克斯光在非线性光学材料中的耦合效应,基于拉曼散射原理。通过非线性薛定谔方程描述两者相互作用,实现能量转换与放大。核心代码展示了时间与距离上的光强变化,最终生成动态图像展示耦合过程。完整程序无水印,运行结果如附图所示。该仿真有助于理解非线性光学现象及其应用。
|
22小时前
|
算法 数据安全/隐私保护 计算机视觉
基于sift变换的农田杂草匹配定位算法matlab仿真
本项目基于SIFT算法实现农田杂草精准识别与定位,运行环境为Matlab2022a。完整程序无水印,提供详细中文注释及操作视频。核心步骤包括尺度空间极值检测、关键点定位、方向分配和特征描述符生成。该算法通过特征匹配实现杂草定位,适用于现代农业中的自动化防控。
|
7月前
|
安全
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
本文介绍了2023年高教社杯数学建模竞赛D题的圈养湖羊空间利用率问题,包括问题分析、数学模型建立和MATLAB代码实现,旨在优化养殖场的生产计划和空间利用效率。
285 6
【2023高教社杯】D题 圈养湖羊的空间利用率 问题分析、数学模型及MATLAB代码
|
7月前
|
存储 算法 搜索推荐
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
本文提供了2022年华为杯数学建模竞赛B题的详细方案和MATLAB代码实现,包括方形件组批优化问题和排样优化问题,以及相关数学模型的建立和求解方法。
169 3
【2022年华为杯数学建模】B题 方形件组批优化问题 方案及MATLAB代码实现
|
7月前
|
数据采集 存储 移动开发
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
本文介绍了2023年五一杯数学建模竞赛B题的解题方法,详细阐述了如何通过数学建模和MATLAB编程来分析快递需求、预测运输数量、优化运输成本,并估计固定和非固定需求,提供了完整的建模方案和代码实现。
148 0
【2023五一杯数学建模】 B题 快递需求分析问题 建模方案及MATLAB实现代码
|
10月前
|
数据安全/隐私保护
耐震时程曲线,matlab代码,自定义反应谱与地震波,优化源代码,地震波耐震时程曲线
地震波格式转换、时程转换、峰值调整、规范反应谱、计算反应谱、计算持时、生成人工波、时频域转换、数据滤波、基线校正、Arias截波、傅里叶变换、耐震时程曲线、脉冲波合成与提取、三联反应谱、地震动参数、延性反应谱、地震波缩尺、功率谱密度
基于混合整数规划的微网储能电池容量规划(matlab代码)
基于混合整数规划的微网储能电池容量规划(matlab代码)
|
10月前
|
算法 调度
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
含多微网租赁共享储能的配电网博弈优化调度(含matlab代码)
|
10月前
|
Serverless
基于Logistic函数的负荷需求响应(matlab代码)
基于Logistic函数的负荷需求响应(matlab代码)

热门文章

最新文章