2023年亚太杯A题:果园采摘机器人的图像识别,一二题

问题一:基于附件1中提供的可收获苹果的图像数据集,提取图像特征,建立数学模型,计算每幅图像中的苹果的数量,并绘制附件1中所有苹果的分布直方图。

对于自动采摘机器人,首要的能力就是识别出苹果对象,因此如何从画面(图像)中准确的识别出苹果对象对于自动采摘机器人有重要影响。附件1给出了200张有苹果对象的图像,要计算出每个图像中苹果的数量,并分析附件1中苹果的数量分布。考虑从颜色空间(HSV,Hue Saturation Value),通过对不同色调、明度和饱和度的识别,结合轮廓检测对苹果与周围环境做出识别,并进行计数。

import os
import cv2
import numpy as  np
# 图片文件夹路径
folder_path = 'D:/math_model/2023yatai/Attachment/Attachment 1'
image_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
count = []
for file in image_files:# 读取图片image_path = os.path.join(folder_path, file)img = cv2.imread(image_path)# 将图片变为灰度图片gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 进行腐蚀膨胀操作kernel = np.ones((2, 2), np.uint8)erosion = cv2.erode(gray, kernel, iterations=5)  # 腐蚀dilation = cv2.dilate(erosion, kernel, iterations=5)  # 膨胀# 颜色阈值化提取红色区域lower_red = np.array([20, 0, 100])upper_red = np.array([80, 100, 255])mask = cv2.inRange(img, lower_red, upper_red)'''# 定义红色苹果的HSV范围lower_red = np.array([0, 50, 50])upper_red = np.array([10, 255, 255])mask_red = cv2.inRange(img, lower_red, upper_red)# 定义青色苹果的HSV范围lower_green = np.array([35, 50, 50])upper_green = np.array([85, 255, 255])mask_green = cv2.inRange(img, lower_green, upper_green)# 合并红色和青色苹果的掩码mask = cv2.bitwise_or(mask_red, mask_green)'''# 找出红色区域的轮廓contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 建立空数组,放减去最小面积的连通域contours_filtered = []# 设定面积阈值mianji = []for contour in contours:area = cv2.contourArea(contour)mianji.append(area)'''mianji = [x for i, x in enumerate(mianji) if x not in mianji[:i]]  #去重#mianji = list(filter(lambda x: x != 0, mianji))  #删去0#mianji = [x for x in mianji if x >= 30]mianji = sorted(mianji) min_area = np.median(mianji)'''min_area = np.max(mianji)/80# 过滤面积太小的连通域for contour in contours:area = cv2.contourArea(contour)if area > min_area:contours_filtered.append(contour)# 绘制红色区域的轮廓并计数cv2.drawContours(img, contours_filtered, -1, (0, 0, 255), 1)apple_count = len(contours_filtered)if apple_count > 100:apple_count = apple_count*0.7count.append(apple_count)
count_all = np.sum(count)import matplotlib.pyplot as plt
plt.hist(count, bins=30, density=True, alpha=0.5,histtype='stepfilled',  color='steelblue',edgecolor='none')
plt.title('Histogram of apple count distribution')
plt.xlabel('Number of apples')
plt.ylabel('Frequency')
# 显示数值(除了0)
n, bins, patches = plt.hist(count, bins=30, color='skyblue', edgecolor='black', alpha=0.7)
for i in range(len(patches)):if n[i] != 0:plt.text(patches[i].get_x() + patches[i].get_width() / 2, patches[i].get_height(),str(int(n[i])), ha='center', va='bottom')
#plt.savefig('D:/math_model/2023yatai/图/Histogram of apple count distribution.png', dpi = 600) #保存图片
plt.show()

700cdc310067481f801372c8c932f2c3.png

#%%  拼接几个图展示
def imge_single(i):ii = str(i)img = cv2.imread(r'D:/math_model/2023yatai/Attachment/Attachment 1/' + ii +'.jpg', 1)  # 读取图片# 将图片变为灰度图片gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 进行腐蚀膨胀操作kernel = np.ones((2, 2), np.uint8)erosion = cv2.erode(gray, kernel, iterations=5)  # 腐蚀dilation = cv2.dilate(erosion, kernel, iterations=5)  # 膨胀lower_red = np.array([20, 0, 100])upper_red = np.array([80, 100, 255])mask = cv2.inRange(img, lower_red, upper_red)contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)contours_filtered = []mianji = []for contour in contours:area = cv2.contourArea(contour)mianji.append(area)min_area = np.max(mianji)/80cv2.contourAreafor contour in contours:area = cv2.contourArea(contour)if area > min_area:contours_filtered.append(contour)# 绘制红色区域的轮廓并计数cv2.drawContours(img, contours_filtered, -1, (0, 0, 255), 1)apple_count = len(contours_filtered)# 在图像上显示苹果数量cv2.putText(img, f"Apple Count: {apple_count}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (225, 25, 25), 2)plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))  # 将BGR图像转换为RGB格式plt.axis('off')  # 不显示坐标轴plt.figure()
plt.tight_layout()
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, \wspace=0.0005, hspace=0.1)
plt.subplot(2,2,1)
imge_single(55)
plt.subplot(2,2,2)
imge_single(2)
plt.subplot(2,2,3)
imge_single(7)
plt.subplot(2,2,4)
imge_single(11)
#plt.savefig('D:/math_model/2023yatai/图/苹果拼图', dpi=500, bbox_inches='tight')  # 保存为JPEG格式,设置dpi和bbox_inches参数
plt.show()

52b8c599913c4f18be91c090dbebcb50.png

问题二:根据附件1中提供的可收获苹果的图像数据集,以图像的左下角为坐标原点,确定每个图像中苹果的位置,并绘制附件1中所有苹果的几何坐标的二维散点图。

对于前方的苹果,人类可以通过感觉精准分摘取,但机器人没有感官,它只能通过数字定位去获取苹果的位置。因此,识别图像中每个苹果的位置,并以图像左下角为原点,精准地给出苹果的坐标就很有必要。考虑在问题一的基础上,针对问题一已经找到的苹果,输出其中心点的位置坐标。苹果位置的分布规律在散点图中并不明显。从图中只可以看出四周的苹果分布会少一些,具体哪一个位置分布最广并不清晰。所以考虑使用热力图呈现图像中的苹果位置分布规律。

import os
import cv2
import numpy as np
import matplotlib.pyplot as plt# 图片文件夹路径
folder_path = 'D:/math_model/2023yatai/Attachment/Attachment 1'
image_files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
all_apple_positions = []for file in image_files:# 读取图片image_path = os.path.join(folder_path, file)img = cv2.imread(image_path)# 将图片变为灰度图片gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 进行腐蚀膨胀操作kernel = np.ones((2, 2), np.uint8)erosion = cv2.erode(gray, kernel, iterations=5)  # 腐蚀dilation = cv2.dilate(erosion, kernel, iterations=5)  # 膨胀# 颜色阈值化提取红色区域lower_red = np.array([20, 0, 100])upper_red = np.array([80, 100, 255])mask = cv2.inRange(img, lower_red, upper_red)# 找出红色区域的轮廓contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 建立空数组,放减去最小面积的连通域contours_filtered = []# 设定面积阈值mianji = []for contour in contours:area = cv2.contourArea(contour)mianji.append(area)'''mianji = [x for i, x in enumerate(mianji) if x not in mianji[:i]]  # 去重mianji = list(filter(lambda x: x != 0, mianji))  # 删去0mianji = sorted(mianji)min_area = np.median(mianji)'''min_area = np.max(mianji)/80# 过滤面积太小的连通域,并绘制红色区域的轮廓for contour in contours:area = cv2.contourArea(contour)if area > min_area:contours_filtered.append(contour)# 计算中心点位置M = cv2.moments(contour)if M["m00"] != 0:center_x = int(M["m10"] / M["m00"])center_y = int(M["m01"] / M["m00"])all_apple_positions.append((center_x, center_y))# 绘制所有苹果位置的二维散点图
x_coords, y_coords = zip(*all_apple_positions)
plt.scatter(x_coords, y_coords)
plt.xlabel('Horizontal position')
plt.ylabel('Vertical position')
plt.title('Apple location scatterplot')
#plt.savefig('D:/math_model/2023yatai/图/散点图(不建模-备用).png', dpi = 600)
plt.show()import seaborn as sns
# 绘制散点图热力图
plt.figure(figsize=(10, 6))
sns.kdeplot(x=x_coords, y=y_coords, cmap="Reds", fill=True, bw_adjust=0.5)
plt.title('Heat map of the geometric coordinates of all apples', fontsize = 16)
plt.xlabel('Horizontal position', fontsize = 14)
plt.ylabel('Vertical position', fontsize = 14)
plt.gca().invert_yaxis()
#plt.savefig('D:/math_model/2023yatai/图/散点热力图.png', dpi = 600)
plt.show()

a39cc1ff8d8d465e93e4ab8dec490807.png8eec7e4a78214fcbb94bde947124a136.png

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/20069.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字信号处理实验四:IIR数字滤波器设计及软件实现

一、实验目的 1. 掌握MATLAB中进行IIR模拟滤波器的设计的相关函数的应用; 2. 掌握MATLAB的工具箱中提供的常用IIR数字滤波器的设计函数的应用; 3.掌握MATLAB的工具箱中提供的模拟滤波器转数字滤波器的相关的设计函数的应用。 二、实验内容 本实验为…

秋招突击——算法打卡——5/30——复习{最大上升子序列的和、面试算法缺陷补充}——新做:{回文数+补充 自定义Stoi实现、正则表达式匹配}

文章目录 复习导弹拦截——最大上升子序列和推理过程实现代码补充昨日面试 新作回文数实现代码 字符串转整数正则表达式匹配个人实现思路分析实现代码如下 参考做法思路分析实现代码 总结 复习 导弹拦截——最大上升子序列和 同样类型题目链接:导弹拦截重做这道题…

力扣刷题--485. 最大连续 1 的个数【简单】

题目描述 给定一个二进制数组 nums , 计算其中最大连续 1 的个数。 示例 1: 输入:nums [1,1,0,1,1,1] 输出:3 解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3. 示例 2: 输入&…

WindowManager相关容器类

窗口中容器类介绍&#xff1a; 本节内容较多&#xff0c;建议结合前面的内容一起阅读&#xff1a; 1、addWindow的宏观概念 2、WindowManager#addView_1 3、WindowManager#addView_2 1&#xff09;、WindowContainer&#xff1a; class WindowContainer<E extends WindowC…

算法(一)递归

文章目录 递归的概念递归三要素递归demo打印100次“hello word”斐波那契数列 递归的概念 递归算法是一种直接或者间接调用自身函数或者方法的算法。 递归三要素 递归条件结束 因为递归是循环调用自身&#xff0c;因此就必须要有结束条件&#xff0c;或者就会OOM。 函数的功…

低代码开发系统是什么?它有那些部分组成?

低代码开发系统是什么&#xff1f;它有那些部分组成&#xff1f; 一、引言 在当今快速变化的商业环境中&#xff0c;企业对于快速响应市场需求、降低开发成本和提高开发效率的需求日益增强。低代码开发系统&#xff08;Low-Code Development Platform&#xff09;应运而生&am…

安卓启动 性能提升 20-30% ,基准配置 入门教程

1.先从官方下载demohttps://github.com/android/codelab-android-performance/archive/refs/heads/main.zip 2.先用Android studio打开里面的baseline-profiles项目 3.运行一遍app&#xff0c;这里建议用模拟器&#xff0c;&#xff08;Pixel 6 API 34&#xff09;设备运行&a…

思科防火墙 网线连接的端口还是down 已配置 端口还是down

环境&#xff1a; 思科防火墙fpr-2100 isco Firepower 2100 系列防火墙是思科系统&#xff08;Cisco Systems&#xff09;推出的一款中端网络安全和防火墙设备。这一系列的产品主要针对中到大型企业的需求&#xff0c;提供高性能的威胁防护和网络流量管理功能。 问题描述&am…

Java微服务智慧工地可视化SaaS云解决方案源码

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…

排序算法之直接选择排序【图文详解】

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;LiUEEEEE                        …

基于tensorflow和NasNet的皮肤癌分类项目

数据来源 https://challenge.isic-archive.com/data/#2019 数据划分 写了个脚本划分 for line in open(ISIC/labels.csv).readlines()[1:]:split_line line.split(,)img_file split_line[0]benign_malign split_line[1]# 0.8 for train, 0.1 for test, 0.1 for validati…

快蜗牛OZON数据分析,OZON快蜗牛数据

在当今电商行业蓬勃发展的背景下&#xff0c;OZON作为俄罗斯及东欧市场的重要电商平台&#xff0c;其数据背后蕴藏着巨大的商业价值。快蜗牛&#xff0c;作为专注于OZON平台的数据分析工具&#xff0c;为卖家提供了深入的市场洞察和策略指导。接下来看看快蜗牛OZON数据分析&…

线上 | OpenSergo - [规范]

INDEX 1 参考资料2 OpenSergo 与 Sentinel 关系3 规范体系3.1 服务元数据ReportMetadataRequest 信息![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ffba569841ae4668b4cff74e4d41d21f.png)##### ReportMetadataReply 信息![在这里插入图片描述](https://img-blog…

BurpSuite2024.5

1 工具介绍 本版本更新介绍 此版本引入了Burp Scanner对WebSockets的支持、对记录登录编辑器的改进、WebSocket 匹配和替换规则以及许多性能改进。 Burp Scanner 支持 WebSockets 我们已更新内部代理的配置以允许 WebSocket 流量。这使 Burp Scanner 现在可以抓取依赖 WebSo…

基于大模型的智慧零售教育科研平台——技术方案

一、概述 1.1背景 随着数字经济的快速发展和全社会数字化水平的升级&#xff0c;人工智能的积极作用越来越凸显&#xff0c;人工智能与各个行业的深度融合已成为促进传统产业转型升级的重要方式之一。ChatGPT的出现掀起了又一波人工智能发展热潮&#xff0c;人工智能行业发展势…

Linux sudo用户权限管理小实验001

Linux sudo用户权限管理和审计-初步 1、设置历史指令的保存数量 默认history指令可以查看当前用户执行的1000条历史命令的条目 2、使用export指令设置HISTSIZE环境变量的数量为999999条。 3、基于date指令&#xff0c;输出日期和时间 4、设置linux系统history相关变量&…

预编码算法(个人总结)

引言 预编码算法是现代无线通信系统中的关键技术&#xff0c;特别是在多输入多输出&#xff08;MIMO&#xff09;系统中。它们通过在发送端对信号进行处理&#xff0c;减少干扰并提高信道容量。这种技术广泛应用于5G、Wi-Fi和卫星通信系统中。本教程将详细介绍预编码算法的背景…

FV悬浮球,安卓真正小而美的神器,满足你的一切需求。

如果你问安卓最强软件有哪些&#xff0c;不同的人可能会有不同的答案&#xff0c;但如果是问我&#xff0c;那我的答案中一定会有他。 FV悬浮球 他是ES文件浏览器&#xff0c;原作者的新作品&#xff0c;经过几年的开发&#xff0c;拥有了超过400项功能&#xff0c;但大小只有…

如何在 llama.cpp 服务器中实现用户登录功能的优化方案?(语言-c++)

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

HCIP-Datacom-ARST自选题库__BGP/MPLS IP VPN判断【10道题】

1.部署BGP/MPLSIP VPN时,当两个VPN有共同的站点,则该共同站点一定不能与两个VPN其他站点使用重叠的地址空间。 2.如图所示&#xff0c;运营商BGP/MPLSIP VPN骨干网通过LDP构建LSP&#xff0c;若想实现用户X两个站点之间通过BGP/MPLSIP VPN网络互通&#xff0c;则PE1和PE2之间必…