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.7
    count.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)/80
    cv2.contourArea
    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)
    # 在图像上显示苹果数量
    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))  # 删去0
    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)
            # 计算中心点位置
            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

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CrossOver支持M4新品吗?苹果M4芯片对游戏支持的怎么样?

CrossOver是一款可以在不同平台之间无缝切换的软件,它可以让你在MacOS或者Linux操作系统上运行Windows应用程序,无需安装双系统或虚拟机。CrossOver是基于Wine项目开发的,Wine是一个可以在非Windows平台上运行Windows应用程序的兼容层。 那么…

doris实战处理(一)doris表的建表规范、查询

感谢原文:https://mp.weixin.qq.com/s/tGbdkF62WU6qbAH0mqtXuA 第一部分:字符集规范 【强制】数据库字符集指定utf-8,并且只支持utf-8。 命令规范 【建议】库名统一使用小写方式,中间用下划线(_)分割&a…

使用第三方工具percona-xtrabackup进行数据备份与恢复

目录 准备工作 开始安装 innobackupex的使用 完全备份 增量备份 数据恢复 本次需要用到的软件 mysql 5.7.35percona-xtrabackup-24-2.4.8 ps:---MySQL必须是5.7的版本,在8.0之后已经不支持 percona-xtrabackup-24 系统版本CentOS7.9 准备工作 …

基于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…

前端Vue自定义带加减按钮的数字输入框组件的设计与实现

随着前端技术的不断发展,开发的复杂度日益提升。传统的整块应用开发方式在面对小改动或小功能增加时,常常需要修改大量代码,导致整个系统的逻辑受到影响。为了解决这个问题,组件化开发成为了前端开发的必然趋势。 一、组件化开发…

【Python系列】Python 元组(Tuple)详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

springboot结合mybatis使用多数据源的方式

背景 最近有一个需求,有两个库需要做同步数据,一个Doris库,一个mysql库,两边的表结构一致,这里不能使用navicat等工具提供的数据传输之类的功能,只能使用代码做同步,springboot配置多数据…

乐高小人分类项目

数据来源 LEGO Minifigures | Kaggle 建立文件目录 BASE_DIR lego/star-wars-images/ names [YODA, LUKE SKYWALKER, R2-D2, MACE WINDU, GENERAL GRIEVOUS ] tf.random.set_seed(1)# Read information about dataset if not os.path.isdir(BASE_DIR train/):for name in …

GPT-4o:新一代人工智能技术的全方位解析引言

目录 🐋引言 🐋梳理 GPT 各版本之间的内容 🦈GPT-1:开创性的起点 🦈 GPT-2:参数规模的大幅提升 🦈 GPT-3:参数爆炸与多任务学习 🦈GPT-4:进一步提升的智…

嵌入式模块学习小记(未分类)

L298N电机驱动板模块 Output A:接DC 电机 1 或步进电机的 A和 A-; Output B:接DC 电机 2 或步进电机的 B和 B-; 5V Enable:如果使用输入电源大于12V的电源,请将跳线帽移除。输入电源小于12V时短接可以提…

【Python面试50题】

1. **基础概念** 1. Python 是解释型还是编译型语言? 2. 什么是 Python 的 GIL(全局解释器锁)? 3. 如何理解 Python 中的可变与不可变数据类型? 4. 解释一下 Python 中的 pass 语句。 5. Python 中的列…

让低代码平台插上AI的翅膀 - 记开源驰骋AI平台升级

让低代码系统插上AI的翅膀——驰骋低代码开发平台引领新时代 在当今日新月异的科技世界中,人工智能(AI)已经成为各个行业不可或缺的一部分。从制造业的自动化生产到金融行业的智能风控,再到医疗领域的精准诊断,AI技术…

FPGA-ARM架构与分类

ARM架构,曾称进阶精简指令集机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。 主要是根据FPGA zynq-7000的芯片编写的知识思维导图总结,废话不多说自取吧 …

GPT LoRA 大模型微调,生成猫耳娘

往期热门专栏回顾 专栏描述Java项目实战介绍Java组件安装、使用;手写框架等Aws服务器实战Aws Linux服务器上操作nginx、git、JDK、VueJava微服务实战Java 微服务实战,Spring Cloud Netflix套件、Spring Cloud Alibaba套件、Seata、gateway、shadingjdbc…

Windows环境安装redis

1、下载redis https://github.com/tporadowski/redis/releases 2、解压 .zip 3、更改文件名 更改文件名称为:redis 4、将本地解压后的redis,作为本地服务器下的应用服务 从redis文件路径下,执行cmd .\redis-server --service-install re…

使用wireshark分析tcp握手过程

开启抓包 tcpdump -i any host 127.0.0.1 and port 123 -w tcp_capture.pcap 使用telnet模拟tcp连接 telnet 127.0.0.1 123 如果地址无法连接,则会一直重试SYN包,各个平台SYN重试间隔并不一致,如下: 异常站点抓包展示&#xff…

word中设置页眉,首页不设置

在设计文档时,有时候会给文档设置页眉,但是一设置,就是每页都会同时设置,大部分都不需要首页设置,那咋么解决呢,请看以下的解说,Come On!!! 1、首先点击头部…

基于SSM的“基于Apriori算法的网络书城”的设计与实现(源码+数据库+文档)

基于SSM的“基于Apriori算法的网络书城”的设计与实现(源码数据库文档) 开发语言:Java 数据库:MySQL 技术:SSM 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 网站功能展示图 首页 商品分类 热销 新品 我的订单 个…

组装电脑(使用老机箱)

昨天同事拿来一台联想 ThinkCentre M6210t的台式机,说计算机实在是太慢了,在只保留主机箱想升级一下。   她拿来了配件,有电源、主板、CPU、CPU风扇、内存条、机箱风扇、硬盘:   主板:华硕 Prime H610M-K D4&#…

FPGA高端项目:FPGA解码MIPI视频+图像缩放+视频拼接,基于MIPI CSI-2 RX Subsystem架构实现,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我这里已有的 MIPI 编解码方案本方案在Xilinx Artix7-35T上解码MIPI视频的应用本方案在Xilinx Artix7-100T上解码MIPI视频的应用本方案在Xilinx Kintex7上解码MIPI视频的应用本方案在Xilinx Zynq7000上解码MIPI视频的应用本方案在…