综合实验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࿰…...

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

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

Java List sort() 排序
sort是java.util.List接口的默认方法。 List的排序方法在Java 8中被引入。 排序方法接受比较器作为参数,并根据指定的比较器对这个列表进行排序。 default void sort(Comparator<? super E> c) 示例代码: import java.text.Collator; import …...

Vue.js 与 Flask 或 Django 后端配合
Vue.js 与 Flask 或 Django 后端配合是一种常见的全栈开发方式,用于构建动态且响应迅速的 Web 应用程序。Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,而 Flask 和 Django 是 Python 语言的两个非常流行的 Web 框架。下面将分别介绍 Vue.js …...

抽奖拼团卷轴模式系统开发小程序源代码解析
在当今的互联网商业环境中,抽奖、拼团与卷轴模式等创新玩法被广泛应用于小程序开发中,旨在通过多样化的互动方式吸引用户参与,提升用户粘性和平台活跃度。本文将围绕“抽奖拼团卷轴模式系统开发小程序源代码”这一主题,探讨其技术…...

MySql语言操作数据库---增删改查数据库,表,数据
思维导图 SQL语言共分为四大类: 数据定义语言DDL:数据定义语言DDL用来创建数据库中的各种对象-----[库]、[表]、[视图]、[索引]、 数据操纵语言DML:(1) 插入:INSERT (2) 更新:UPDATE (3) 删除:DELETE 数据查询语言DQL:数据查询语…...

C++深入学习string类成员函数(2):容器管理
引言 C 标准库中的容器(如 std::string、std::vector、std::list 等)都提供了一系列容器管理成员函数,用于处理容器的大小、容量、清空等操作。容器管理成员函数可以分为几类,主要包括容量查询、修改容器大小、清空容器等操作。 …...

MariaDB 和 MySQL 全面对比:选择数据库需要考虑这几点
谁在使用 MySQL 和 MariaDB? MySQL 和 MariaDB 都发布了各自的用户名单。 使用 MySQL 的有 Facebook、Github、YouTube、Twitter、PayPal、诺基亚、Spotify、Netflix 等。 使用 MariaDB 的有 Redhat、DBS、Suse、Ubuntu、1&1、Ingenico 等。 功能比较…...

Python 实现图形学几何变换算法
目录 Python 实现图形学几何变换算法几何变换介绍变换矩阵Python 实现几何变换代码解释总结 Python 实现图形学几何变换算法 在计算机图形学中,几何变换是非常重要的概念。它们允许我们对对象的位置、大小、方向进行操作,比如平移、缩放、旋转、反射等。…...

接口测试|超详细面试题【附答案】
今天给姐妹们整理了一套超详细的附答案的接口测试面试题,姐妹们快学起来吧~ 接口测试的重要性,相信不用我多说了。接口测试是现在软件测试工程师一个加分项。因为很多朋友一开始做了几年的软件测试都是在做功能测试,做界面UI的测试ÿ…...

Qt网络编程——QTcpServer和QTcpSocket
文章目录 核心APITCP回显服务器TCP回显客户端 核心API QTcpServer用于监听端口和获取客户端连接 名称类型说明对标原生APIlisten(const QHostAddress&, quint16 port)方法绑定指定的地址和端口号,并开始监听bind和listennextPendingConnection()方法从系统中获…...

CentOS 7 aarch64制作openssh 9.9p1 rpm包 —— 筑梦之路
本篇文章还是基于开源项目openssh-rpms制作。 https://github.com/boypt/openssh-rpms.git 官方发行说明: OpenSSH: Release Notes 1. 修改version.env 2. 下载源码包 openssl网站改版,下载地址和之前不一样了 # 下载openssl1.1.1w源码包cd downlo…...