当前位置: 首页 > news >正文

综合实验1 利用OpenCV统计物体数量

一、实验简介

传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开并计数。本实验巩固对OpenCV的基础操作的使用,适当的增加OpenCV在图像处理方向的进阶操作,例如利用canny算子等算法进行图像分割

二、实验目的

通过本实验能够综合利用OpenCV在图像处理的方向的应用了解并使用

OpenCV的基本操作,了解大概运行逻辑和原理。

三、实验步骤与结果

1、实验实现功能说明

    通过本实验能够综合利用opencv在图像处理的方向的应用,能够识别图片中硬币数量。

2、实验整体设计思路

1、选取图片:可以选取硬币摆放简单的图片,边缘清晰也无交叉叠加;可以选取硬币叠加的图片,增加分割难度;可以选取一张包含不同物体的图片且物体之间边缘并不十分清晰,将指定物品的数量显示出来

2、图片读取与展示

3、转成灰度图并进行二值化

4、去掉背景

5、利用距离变换通过阈值让图像粘连分开或者采用腐蚀膨胀方法来,或者图像分割(包括canny边缘检测等算法)将物体分割。

6、若采用距离变换方法或者腐蚀膨胀方法,需统计物体的轮廓,若直接采用图像分割方法则省略这一步。

7、获得零件数量。

8、绘制轮廓。(可以用不同的颜色为物体做一个区分)

3、实验程序

#导入库

import cv2
import enum
import ipywidgets.widgets as widgets
import numpy as np
import matplotlib.pyplot as plt
import random
from IPython.core.display_functions import display
from cv2 import putText

#显示文件图像
# 1 文件的读取 2 封装格式解析 3 数据解码 4 数据加载
img = cv2.imread('coins.jpg', 1)
# cv2.imshow('image', img)  #这段需要在树莓派图形化界面命令行执行,会显示一个图像的窗口
cv2.imwrite('coins.jpg', img) # 1 name 2 data


# 展示图像的函数
def show(img, title=None):
    if title:
        plt.title(title)
    try:
        plt.imshow(img[:, :, ::-1])
    except Exception as e:
        plt.imshow(img, cmap="gray")
    finally:
        plt.show()


#高斯滤波,减小噪点和硬币上的图案对轮廓识别的影响
blurred = cv2.GaussianBlur(img, (15, 15), 0)
show(blurred, '231_lwx&wpb_After Gaussian filtering')


#转化为灰度图
img_gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
show(img_gray, '231_lwx&wpb_Gray Image')



img_gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY)
# 统计各个灰度级的个数
gray_histogram = cv2.calcHist([img_gray], [0], None, [256], [0, 256])
# 绘制灰度直方图
plt.plot(gray_histogram, color='red')
plt.title("231_lwx&wpb_Grayscale Histogram")
plt.xlabel("Gray Level")
plt.ylabel("Count")
plt.xlim([0, 256])
plt.show()



# 算法自动找出合适阈值ret2,将灰度图转换为黑白图,thresh为返回的黑白图
ret2, thresh = cv2.threshold(img_gray, 0, 255, cv2.THRESH_OTSU+cv2.THRESH_BINARY)
show(thresh,'231_lwx&wpb_gray')


#另一种腐蚀膨胀
img_bgr2rgb1 = thresh
plt.imshow(img_bgr2rgb1)
plt.show()


# 开运算:先腐蚀,再膨胀,消除图片背景的噪声
kernel = np.ones((3,3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=3)
show(opening,'231_lwx&wpb_Open Operation')



result=opening
#画出轮廓
contours,hirearchy=cv2.findContours(result,cv2.RETR_EXTERNAL,

cv2.CHAIN_APPROX_SIMPLE)# 找出连通域
img1=img.copy()
img1 = cv2.drawContours(img, contours, -1, (0, 0, 255), 2)
show(img1, '231_lwx&wpb_Box the result')

ObjCount = len(contours)

# 在每个轮廓的中心标注轮廓的标号
for i in range(0, ObjCount):
    # minAreaRect返回轮廓的最小外接矩形的信息
    rect = cv2.minAreaRect(contours[i])
    img1 = cv2.drawContours(img, contours, i, (0, 0, 255), 2)
    # 在绘制轮廓前生成随机颜色
    random_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
    img1 = cv2.drawContours(img, contours, i, random_color, 2)

    img2 = putText(img, str(i + 1), (int(rect[0][0]), int(rect[0][1])), cv2.FONT_HERSHEY_COMPLEX, 1, random_color, 2)
    # 在图片上标注硬币的个数
img3 = putText(img, 'ObjCount=' + str(ObjCount), (20, 30), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 0, 0), 2)
# 署名
cv2.putText(img, "lvwenxiang", (0, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
cv2.putText(img, "wangpengbo", (0, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)

# 所有操作结束后进行释放
show(img1)
 


print(f"The Count of Corn is {ObjCount}")

4、实验结果

1.高斯模糊处理&二值化,灰度图

 

2.灰度直方图&灰度图转黑白图

3.两种腐蚀膨胀方法,类似

4.描绘边界,统计数量

5.终端显示

四、实验分析

1、实验总结与收获

实验未达到理想结果,理想的结果是任意给出一张图片,能识别出图中硬币数量。分析原因:一,与统计数量原理有关,当图片背景和硬币的颜色,饱和度等视觉感应相似时,python处理的机械化往往会造成误差。二,在转灰度图时无法分割硬币,即使在腐蚀膨胀后也无法分割硬币,与硬币反光也有一定关系。

实验结果可以实现,让我们了解了图片物体统计的基本原理,本次综合实验基于前面对OpenCV基础编程的了解,打下坚实基础后,才可熟练完成本次任务。实验中需要选择和调试不同的参数,如阈值、腐蚀和膨胀的迭代次数等,这些参数的选择对最终的图像处理效果有很大的影响。我们学会了通过不断尝试和调整参数来找到最佳的处理结果,这也突显了参数选择的挑战性和重要性。在进行图像处理实验时,记录和追踪每个处理步骤和参数设置是非常重要的,添加必要的备注有助于增强代码可读性,这可以确保实验结果的可重复性,也方便了解和修复潜在的问题。

2、实验收获

本次实验的进行使我们对计算机视觉领域有了初步的认识,让我们能够对OpenCV这方面的知识有一个比较基础的了解,对我们学习Python方面有非常棒的提高,使我对图像处理和其他种种技术有了较为坚实的基础。

同时这次实验也提高了寻找问题和解决问题能力,锻炼了我的思考能力,强化了我的思维方式,这对我今后的学习和生活都有很大的帮助。

3、其他(实验建议或意见)

提供腐蚀膨胀的代码以及,给出更多的解决策略供新手学习参考,可给出网址,让我们对识别统计的原理有更深的了解,发现更多解决问题方法。

相关文章:

综合实验1 利用OpenCV统计物体数量

一、实验简介 传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开并计数。本实验巩固对OpenCV的基础操作的使用,适当的增加OpenCV在图像处…...

[Redis][主从复制][上]详细讲解

目录 0.前言1.配置1.建立复制2.断开复制3.安全性4.只读5.传输延迟 2.拓扑1.一主一从结构2.一主多从结构2.树形主从结构 0.前言 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可主从复制? 分布式系统中…...

【算法】leetcode热题100 146.LRU缓存. container/list用法

https://leetcode.cn/problems/lru-cache/description/?envTypestudy-plan-v2&envIdtop-100-liked 实现语言:go lang LRU 最近最少未使用,是一种淘汰策略,当缓存空间不够使用的时候,淘汰一个最久没有访问的存储单元。目前…...

[论文总结] 深度学习在农业领域应用论文笔记13

文章目录 1. Downscaling crop production data to fine scale estimates with geostatistics and remote sensing: a case study in mapping cotton fibre quality (Precision Agriculture ,2024, IF5.585)背景方法结果结论个人总…...

《Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images》论文阅读

学习资料 论文题目:Detection of Tea Leaf Blight in Low-Resolution UAV Remote Sensing Images(低分辨率UAV遥感图像中茶叶枯萎病的检测)论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber10345618 Abstr…...

低代码BPA(业务流程自动化)技术探讨

一、BPA流程设计平台的特点 可视化设计工具 大多数BPA流程设计平台提供直观的拖拽式界面,用户可以通过图形化方式设计、修改及优化业务流程。这种可视化的方式不仅降低了门槛,还便于非技术人员理解和参与流程设计。集成能力 现代BPA平台通常具备与其他系…...

开闭原则(OCP)

开闭原则(OCP):Open Closed Princide:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有代码,实现一个热插拔的效果。 简言之,是为了使程序的扩展性更好,…...

Unity之 TextMeshPro 介绍

TextMeshPro 是 Unity 中用于处理文本显示的高级插件,旨在替代 Unity 内置的 UI.Text 和 TextMesh 组件。与默认的文本组件相比,TextMeshPro 提供了更高的文本渲染质量和更多的文本样式选项,同时具备强大的优化能力。 TextMeshPro 的主要特点…...

Linux套接字Socket

Linux套接字Socket 前提知识补充 为不同机器上的两个进程之间提供通信机制 主机字节序小端存储,网络字节序大端存储 特点TCPUDP连接类型面向连接无连接可靠性高低有序性保证数据包按顺序到达不保证数据包顺序流量控制有滑动窗口机制无拥塞控制有拥塞控制机制无复杂性较高较低…...

基于 Web 的工业设备监测系统:非功能性需求与标准化数据访问机制的架构设计

目录 案例 【说明】 【问题 1】(6 分) 【问题 2】(14 分) 【问题 3】(5 分) 【答案】 【问题 1】解析 【问题 2】解析 【问题 3】解析 相关推荐 案例 阅读以下关于 Web 系统架构设计的叙述,回答问题 1 至问题 3 。 【说明】 某公司拟开发一款基于 Web 的…...

【MySQL】基础入门篇

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:理解什么是MySQL,如何安装MySQL,简单使用MySQL。 > 毒鸡汤:有些事情,总是不明白,所以我不…...

uni-app vue3封装websocket,支持微信小程序

一、创建useWebSocket.js 文件 // useWebSocket.js // 获取链接的URL前缀 import {BASE_URL } from "./request";import {ref,onMounted,onBeforeUnmount } from "vue";// 假设我们使用 uni-app 的 globalData 或 Vuex 来管理用户状态 // 这里为了简单起…...

杭州算力小镇:AI泛化解锁新机遇,探寻AI Agent 迭代新路径

人工智能技术不断迭代,重点围绕着两个事情,一是数据,二是算力。 算法的迭代推动着AI朝向多模态的方向发展,使之能够灵活应对不同领域的不同任务,模型的任务执行能力大大提升,人工智能泛化能力被推上高潮。…...

IT行业的现状与发展趋势

IT行业的现状与发展趋势 随着信息技术的迅速发展,IT行业已成为全球经济的重要支柱之一。无论是传统行业的数字化转型,还是新兴技术的快速崛起,IT行业都在不断推动社会的进步和发展。本文将探讨IT行业的现状及未来发展趋势。 IT行业的现状 …...

华为认证HCIA篇--网络通信基础

大家好呀!我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分,偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过,如果是新手或小白的话建议还是看一看,先有个印象,好为后续的…...

【linux】regulartor-fixed

作用:创建一个固定的 regulator。一般是一个 GPIO 控制了一路电,只有开(enable) \ 关(disabled)两种操作。 device-tree node io_vdd_en: regulator-JW5217DFND {compatible "regulator-fixed"…...

11年408考研真题解析-计算机网络

第一题: 解析:网络层虚电路服务和数据报服务 传输服务只有:有连接可靠和无连接不可靠两种,直接排除BC。 网络层指的是IP协议,由图二可知:运输层,网际层,网络接口层唯一有连接可靠的协…...

wireshark使用要点

目录 IP过滤 端口过滤 内容过滤 过滤udp 过滤tcp IP过滤 ip.src XXX.XXX.XXX.XXX 只显示消息源地址为XXX.XXX.XXX.XXX的信息 ip.dst XXX.XXX.XXX.XXX 只显示消息目的地址为XXX.XXX.XXX.XXX的信息 ip.addr XXX.XXX.XXX.XXX显示消息源地址为XXX.XXX.XXX.XXX&#xff0…...

WebGL扩展与WebGPU

目录 WebGPU扩展的探索使用实验性或未标准化的特性示例:使用纹理压缩扩展多视口渲染自定义着色器阶段可变多重采样抗锯齿...

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏

基于小安派AiPi-Eyes-Rx的N合1触摸屏游戏 目前存在的游戏: 植物大战僵尸:demos/pvz羊了个羊:demos/yang消消乐:demos/xiaoxiaole华容道:demos/huarongdao PVZ功能展示可见: 羊了个羊: 消消…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

12.找到字符串中所有字母异位词

🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

【Oracle】分区表

个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中&#xff0…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦&#xff0…...