综合实验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、其他(实验建议或意见)

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

相关推荐
V_fanglue370511 分钟前
qmt量化交易策略小白学习笔记第67期【qmt编程之获取ETF申赎清单】
大数据·前端·数据库·笔记·python·学习·区块链
@sinner14 分钟前
自然语言处理实战项目:从理论到实现
人工智能·机器学习·自然语言处理
FreakStudio17 分钟前
全网最适合入门的面向对象编程教程:53 Python 字符串与序列化-字符串与字符编码
python·嵌入式·面向对象·电子diy
索迪迈科技1 小时前
车载视频监控:安全生产与管理的新趋势
大数据·人工智能·安全·远程监控·车载监控录像机·客流统计
迪娜学姐1 小时前
Nature:科研论文中正确使用ChatGPT的三个原则
论文阅读·人工智能·chatgpt·论文笔记
IRevers1 小时前
【论文速看】DL最新进展20240927-目标检测、Transformer
图像处理·人工智能·深度学习·目标检测·机器学习·计算机视觉·transformer
软糖工程0011 小时前
正则表达式【详细解读】
大数据·前端·爬虫·python·学习·正则表达式·数据分析
程序员的战歌1 小时前
django drf to_internal_value
python·django
程序员的战歌1 小时前
django drf 分页器
python·django
第六五2 小时前
__init__.py文件
python