首页 > 其他分享 >综合实验1 利用OpenCV统计物体数量

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

时间:2024-09-25 18:48:50浏览次数:9  
标签:plt img show 物体 cv2 OpenCV 实验 255

一、实验简介

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

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

标签:plt,img,show,物体,cv2,OpenCV,实验,255
From: https://blog.csdn.net/A_Lv123/article/details/142530521

相关文章

  • lims实验室管理软件多少钱 国内一套lims系统厂商报价
    LIMS系统介绍LIMS(LaboratoryInformationManagementSystem)即实验室信息管理系统,是专为实验室设计的一套综合管理软件。它通过自动化数据采集、样品管理、结果报告等功能,显著提升实验室的运营效率和数据准确性。随着科技的进步,LIMS系统已成为现代实验室不可或缺的一部分。......
  • SSM实验室排课系统 毕业设计源码24944
    摘要随着社会的发展,社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。本文以实际运用为开发背景,运用软件工程原理和开发方法,它主要是使用动态网页开发技术java作为系统的开发语言,MySQL作为后台数据库。整个开发过程首先对实验室排......
  • 基于java实验室仪器设备管理系统的计算机毕设源码+论文
    摘要实验室仪器设备管理系统是一个基于Internet,采用B/S(Browser/Server,浏览器/服务器模式)模式,并根据现有的实验室仪器设备管理系统的现状而设计开发的服务于实验室仪器设备管理行业网络管理平台。本文以JSP为开发技术,实现了一个实验室仪器设备管理系统。该信息管理系统分为管理员......
  • 第04周 预习、实验与作业:类的设计与继承
    课前问题列表1.为什么说Java中的所有类都is-a Object?在Java中,所有的类都直接或间接地继承自Object类。这意味着,无论在Java中创建什么类,它都是Object类的一个子类(或更具体地说,是Object的某个子类的子类,直到最终的根是Object)。这种设计允许Java提供一个统一的基类,所有类都继......
  • 登高不系安全带自动识别 Opencv
    登高不系安全带自动识别系统具有以下优势:登高不系安全带自动识别系统通过智能监控摄像头对登高作业人员进行实时监测,准确捕捉是否佩戴安全带的情况。登高不系安全带自动识别采用先进的图像处理和分析技术,能够自动检测和识别登高作业人员是否佩戴安全带,过滤其他类似物体的干扰。登高......
  • 视频监控人员行为识别 Opencv
    视频监控人员行为识别技术基于先进的计算机视觉和深度学习算法。视频监控人员行为识别利用大量的视频数据进行模型训练,使算法能够学习和识别员工的不同行为特征。然后,将训练好的模型应用到实际的监控系统中,对员工的行为进行实时监测和分析。视频监控人员行为识别通过视频监控AI算法......
  • 工厂人员作业现场异常违规行为识别 Opencv
    工厂人员作业现场异常违规行为识别告警系统具有以下优势:工厂人员作业现场异常违规行为识别通过应用先进的图像识别技术,系统能够对工厂人员的作业行为进行高精度识别,包括电力作业过程中的关键节点和动作。工厂人员作业现场异常违规行为识别一旦系统识别到违规不符合要求的作业行为,将......
  • OpenCV_图像的平滑处理详解
    图像平滑处理是图像处理中的一种技术,旨在减少图像中的噪声和细节,从而使图像看起来更平滑。平滑处理可以帮助改善图像质量,去除噪声,并在进一步的图像分析和处理步骤中提供更清晰的数据。常见的平滑处理技术包括滤波、模糊等。例如,下图1是含有噪声的图像,在图像内存在噪声信息,我们......
  • OpenCV_自定义线性滤波(filter2D)应用详解
    OpenCVfilter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般是数组的中心)。上面讲了线性滤波的实质就是计算相......
  • 计算机网络实验2——利用Wireshark对上网操作抓包并进行相关协议分析(实验部分)
    五、实验过程1.安装并启动Wireshark。选择菜单栏上捕获->选项,勾选WLAN网卡。点击Start,进行抓包 Wireshark处于抓包状态中 2.打开浏览器,在地址栏中输入教师指定的web服务器地址。(http://202.113.78.39)为了确保连通性,先ping一下服务器 打开cmd Ping 202.113.78.......