综合实验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功能展示可见: 羊了个羊: 消消…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
