许可优化
许可优化
产品
产品
解决方案
解决方案
服务支持
服务支持
关于
关于
软件库
当前位置:服务支持 >  软件文章 >  【植物检测】基于对称性的作物田三维点云植物检测研究(Matlab代码实现)

【植物检测】基于对称性的作物田三维点云植物检测研究(Matlab代码实现)

阅读数 8
点赞 0
article_banner

💥1 概述

精准农业中使用的 机器人  系统的关键要求之一是能够检测单个植物的确切位置。 我们提出了一种基于从种植园获得的3D点云的新方法,该方法确定确切的植物位置,可用于基于地标的SLAM(同时定位) 和映射)在移动机器人上或用于引导工厂处理系统。 我们方法背后的关键思想是利用同一物种的单个植物之间的几何相似性以及它们播种的规则模式。 因此,我们的方法对于作物以规则模式排列的单一栽培种植园最有用。 在我们的实验研究中,我们表明所提出的方法优于对不同生长阶段记录的真实世界数据进行的传统平均偏移分析。

📚2 运行结果

部分代码:

%% plot examples from all days

   for day = 1:nDays

       h = figure(day+798);
datasets = days(day).datasets;

       data = load(strcat(basepathData, datasets{2}));

       pNorm = geometry.normalizePointCloud(data.mapFull);

       plot.pc(pNorm(:,1:2), data.mapColorFull, 'markersize', 20);

       ax = gca;

       ax.FontSize = 5;

       ax.XLim = [-3 3];

       ax.YLim = [-0.3 0.3];

       set(gcf, 'Position', [200.6040  713.8713  691.0099  120.7129])

       print(h, '-dpng', [basepathImages 'example_day' num2str(day) '.png'], '-r300')

   end

%% do the evaluation for each error_threshold

   for threshold_error = [0.01 0.02 0.04]

   %%

       for day = 1:nDays

           %% evaluate each day individually

           datasets = days(day).datasets;


           % combine individual datasets for each day

           dayCombined.landmarksMeanshift = [];

           dayCombined.landmarksMeanshiftScores = [];

           dayCombined.landmarksApproach = [];

           dayCombined.landmarkScores = [];

           dayCombined.landmarksManual = [];

           dayCombined.map = [];

           dayCombined.mapColor = [];

       for j = 1:numel(datasets)

               datasetPath = [basepathData datasets{j}];

               data = load(datasetPath);

               %% plant soil segmentation

               if ~isfield(data, 'map')

                   [segmentation, extractorPolygon1, extractorPolygon2] = tools.greenextract(data.mapFull, data.mapColorFull);

                   data.map = data.mapFull(segmentation,:);

                   data.mapColor = data.mapColorFull(segmentation,:);

                   save(datasetPath, '-struct', 'data', 'map', 'mapColor','-append')

               end

               %% manual landmarks

               if ~isfield(data, 'landmarksManual')

                   h = figure(733);

                   plot.pc(data.map, data.mapColor, 'markerSize', 20)

                   datacursormode on

                   dcm_obj = datacursormode(gcf);

                   waitfor(msgbox('Click ok when finished labeling plants!'));

                   cursor_info = getCursorInfo(dcm_obj);

                   data.landmarksManual = vertcat(cursor_info.Position);

                   if size (data.landmarksManual,2) == 3

                       data.landmarksManual = data.landmarksManual(:,1:2);

                   end

                   save(datasetPath, '-struct', 'data', 'landmarksManual','-append')

               end

               if updateLandmarksManual

                   figure(733);

                   h = plot.pc(data.map(:,1:2), data.mapColor, 'markerSize', 20);

                   datacursormode on

                   dcm_obj = datacursormode(gcf);

                   hTarget = handle(h);

                   xdata = get  (hTarget,'XData');

                   ydata = get(hTarget,'YData');

                   idx = knnsearch([xdata' ydata'], data.landmarksManual);

               for tipIdx = 1:size(data.landmarksManual, 1)

                       hDatatip = dcm_obj.createDatatip(hTarget);

                       propPointDataCursor = get(hDatatip,'Cursor');

                       % Move the datatip

                       propPointDataCursor.DataIndex = idx(tipIdx);

                       pos = [xdata(idx(tipIdx)) ydata(idx(tipIdx))];

                       propPointDataCursor.Position = pos;

                       set(hDatatip,'Position',pos)

                   end

                   waitfor(msgbox('Click ok when finished labeling plants!'));

                   cursor_info = getCursorInfo(dcm_obj);

                   data.landmarksManual = vertcat(cursor_info.Position);

                   if size(data.landmarksManual,2) == 3

                       data.landmarksManual = data.landmarksManual(:,1:2);

                   end

                   save(datasetPath, '-struct', 'data', 'landmarksManual','-append')

               end

               %% tf density approach on whole map

               if recalculateApproach && isfield(data, 'landmarksApproach')

                   data = rmfield(data, 'landmarksApproach');

               end

               if ~isfield(data, 'landmarksApproach')

                   [data.landmarksApproach, data.landmarkScores] = optimization.detectPlants(data.map, days(day).args{:});

                   save(datasetPath, '-struct', 'data', 'landmarksApproach', 'landmarkScores', '-append')

               end

               %% mean shift baseline

               if recalculateMeanshift && isfield(data, 'landmarksMeanshift')

                   data = rmfield(data, 'landmarksMeanshift');

               end

               if ~isfield(data, 'landmarksMeanshift')

                   [data.landmarksMeanshift,~,clusterSizes] = clustering.meanshift(data.map', days(day).args{12});

                   data.landmarksMeanshiftScores = vector.normalize(cellfun('length',clusterSizes));

                   save(datasetPath, '-struct', 'data', 'landmarksMeanshift', 'landmarksMeanshiftScores', '-append')

               end

           %% combine

               dayCombined.landmarksMeanshift = [dayCombined.landmarksMeanshift; data.landmarksMeanshift];

               dayCombined.landmarksMeanshiftScores = [dayCombined.landmarksMeanshiftScores; data.landmarksMeanshiftScores];

               dayCombined.landmarksApproach = [dayCombined.landmarksApproach; data.landmarksApproach];

               dayCombined.landmarkScores = [dayCombined.landmarkScores; data.landmarkScores];

               dayCombined.landmarksManual = [dayCombined.landmarksManual; data.landmarksManual];

               dayCombined.map = [dayCombined.map; data.map];

               dayCombined.mapColor = [dayCombined.mapColor; data.mapColor];

           end

           landmarksMeanshift = dayCombined.landmarksMeanshift;

           landmarksMeanshiftScores = dayCombined.landmarksMeanshiftScores;

           landmarksApproach = dayCombined.landmarksApproach;

           landmarkScores = dayCombined.landmarkScores;

           landmarksManual = dayCombined.landmarksManual;

           fprintf('day %d: %d labels\n', day,size(landmarksManual,1))

       %% calculate errors

           [errorMeanshiftVecidx, errorMeanshift] = knnsearch(landmarksManual, landmarksMeanshift(:,1:2));

           [errorApproachVecidx, errorApproach] = knnsearch(landmarksManual, landmarksApproach(:,1:2));

           errorMeanshiftVec = landmarksManual(errorMeanshiftVecidx,:) - landmarksMeanshift(:,1:2);

           errorApproachVec = landmarksManual(errorApproachVecidx,:) - landmarksApproach(:,1:2);

       %% eval approach

           figure(day); view(2)

           thresholds = [];

           rms = [];

           sizes =  [];

           for step = 1:100

               landmarksApproachSel = landmarksApproach(landmarkScores > ((step-1)/100),:);

               [errorApproachVecidx, errorApproach] = knnsearch(landmarksManual, landmarksApproachSel(:,1:2));

               sizes(step) = size(landmarksApproachSel,1);

               thresholds(step) =  step/100;

               rms(step) = sqrt(mean(errorApproach.^2));

               if thresholds(step) == 0.9

                  fprintf('day %d, score threshold 0.9, rms %f, detection ratio %f\n', day, rms(step), sizes(step)/size(landmarksManual,1))

               end

           end

           yyaxis left

           plot(thresholds,1000*rms, '--b')

           xlabel('score threshold')

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

[1]Janosch Dobler, Alexander Schaefer, Wolfram Burgard (2018) Symmetry-Based Plant Detection in 3D Point Clouds from Crop Fields

🌈4 Matlab代码实现

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

相关文章
技术文档
QR Code
微信扫一扫,欢迎咨询~
customer

online

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 board-phone 155-2731-8020
close1
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

姓名不为空

姓名不为空
手机不正确

手机不正确

手机不正确
公司不为空

公司不为空

公司不为空