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

news2024/9/30 0:51:51

一、实验简介

传统的计数方法常依赖于人眼目视计数,不仅计数效率低,且容易计数错误。通常现实中的对象不会完美地分开,需要通过进一步的图像处理将对象分开并计数。本实验巩固对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、其他(实验建议或意见)

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

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

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

相关文章

抽奖拼团卷轴模式系统开发小程序源代码解析

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

【HTTP协议详解-Fiddler抓包工具安装详解-HTTP报文格式-URL详解】

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 &#x1f52d…

安卓13删除下拉栏中的关机按钮版本2 android13删除下拉栏关机按钮

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 顶部导航栏下拉可以看到,底部这里有个设置按钮,点击可以进入设备的设置页面,这里我们将更改为删除,不同用户通过这个地方进入设置。我们之前写过一个文章也是一样的删除…

基于RealSense D435相机实现手部姿态重定向

基于Intel RealSense D435 相机和 MediaPipe的手部姿态检测,进一步简单实现手部姿态与机器人末端的重定向。 假设已经按照【基于 RealSenseD435i相机实现手部姿态检测】配置好所需的库和环境,并且有一个可以控制的机器人接口。 一、手部姿态重定向介绍 …

18924 二叉树的宽度

### 思路 1. 使用广度优先搜索(BFS)遍历二叉树,记录每一层的节点数。 2. 使用队列来实现BFS,队列中存储节点和其对应的层数。 3. 在遍历过程中,更新每一层的节点数,并记录最大节点数。 ### 伪代码 1. 定义…

uni-app - - - - -vue3使用i18n配置国际化语言

uni-app - - - - -使用i18n配置国际化语言 1. 安装vue-i18n2. 配置文件2.1 创建如下文件2.2 文件配置2.3 main文件导入i18n 3. 页面内使用3.1 template内直接使用3.2 变量接收使用 1. 安装vue-i18n npm install vue-i18n --save2. 配置文件 2.1 创建如下文件 locales文件夹里…

__has_include 报错

作用: 在C或C的预处理阶段,__has_include 是一个编译器特定的宏,主要用于检查编译器是否能够包含指定的头文件。这个宏在Clang和GCC(从某个版本开始)等编译器中可用,但在所有编译器中可能并不都支持…

气膜乒乓球馆的前景展望—轻空间

乒乓球作为我国的国球,在全球范围内始终保持领先地位,不仅是国民心中的重要运动,也在国际舞台上占据了举足轻重的地位。气膜乒乓球馆作为一种创新的体育设施,通过结合先进的气膜技术与传统乒乓球运动,为爱好者提供了一…

Heart Animated 写实心脏模型素材带动画医学

心脏动画: 解剖细节逼真的心脏。 此资源包含高质量着色全色HD中的所有纹理,并使用HD中的凹凸贴图(NORMALMASP)。所有Prefab Ready均适用于游戏、应用程序和VR应用程序。预制件已准备好位置和旋转0,0,0。拖动到场景时。 还具有完整的心动周期。 Tris=约81 k。 顶点=约51 k …

关于如何使用终端查看类的布局教程

在继承章节我们使用了vs提供的终端查看类之间的继承模型,在后续多态的学习过程中,我们也将继续使用该方法去查看虚表等信息。 第一步:打开VS提供的终端窗口: 第二步:获取需要查看的类所在的源文件的地址: …

TypeScript 设计模式之【迭代器模式】

文章目录 迭代器模式:优雅遍历集合的智能书签迭代器模式的奥秘迭代器模式有什么利与弊?如何使用迭代器模式来优化你的数据遍历代码实现案例迭代器模式的主要优点迭代器模式的主要缺点迭代器模式的适用场景总结 迭代器模式:优雅遍历集合的智能书签 你是…

运维工具之adb命令安装和使用

一、adb命令简介 ADB(Android Debug Bridge)是 Android 开发者工具包中的一个命令行工具,主要用于在开发、调试和测试 Android 应用时与 Android 设备进行交互。通过 ADB 工具,开发者和用户可以从电脑对 Android 设备执行各种操作…

md编辑器语法

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【递归】5.leetcode 872 叶子相似的树

1 题目描述 题目链接:叶子相似的树 2 解答思路 递归分为三步,接下来就按照这三步来思考问题 第一步:挖掘出相同的子问题 (关系到具体函数头的设计) 第二步:只关心具体子问题做了什么 (关…

Swoole的多进程模块

Swoole是有自己的一个进程管理模块,用来替代PHP的pcntl扩展,需要注意Process进程在系统是非常昂贵的资源,创建进程消耗很大,另外创建的进程过多会导致进程切换开销大幅上升。 为什么不使用pcntl 1.pcntl没有提供进程间通信的功能…

AI智能眼镜_带摄像头的AI智能眼镜,AI大模型落地的载体

随着科技的迅猛发展,AI智能眼镜汇聚了众多硬件的优势,成为现代生活中不可或缺的一部分。这种创新设备不仅内嵌了耳机、摄像头以及WiFi和蓝牙模块等核心硬件,还具备了音频播放、图像拍摄和无线通信等多种功能,极大地提升了信息获取…

深度学习经典模型之BERT(上)

深度学习经典模型之BERT(下) BERT(Bidirectional Encoder Representations from Transformers)是一个双向transformer编码器的言表示模型。来自论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 。由Google公司的…

【WRF运行第二期(Ubuntu)】ARWpost安装及错误总结

WRF运行第二期:ARWpost安装及错误总结 1 ARWpost介绍2 ARWpost安装2.1 ARWpost_V3安装前准备2.2 安装ARWpost2.3 修改Makefile文件2.4 修改configure.arwp文件2.5 生成可执行文件EXE另:报错1-Error: Type mismatch between actual argument at (1) and a…

计算物理精解【3】- FORTRAN计算

文章目录 概述hello,world环境接收输入与输出 读取csv文件if and select case循环formatread,write formatread,write读写文件录入与读取数据文件定位csv 数组一维数组最小二乘法下标隐式循环 关系代数基本运算笛卡尔积投影选择 过程参数select case 和 过程module快排函数自定…

深度学习自编码器 - 分布式表示篇

序言 深度学习作为人工智能领域的重要分支,其核心在于表示学习( Representation Learning \text{Representation Learning} Representation Learning),尤其是分布式表示( Distributed Representation \text{Distribut…