通过 Python 和 OpenCV 实现目标数量监控

 更新时间:2020年01月05日 14:37:25   作者:Python学习啊  
这篇文章主要介绍了如何通过 Python 和 OpenCV 实现目标数量监控,本文通过实例代码图文的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

今天我们将利用python+OpenCV实现对视频中物体数量的监控,达到视频监控的效果,比如洗煤厂的监控水龙头的水柱颜色,当水柱为黑色的超过了一半,那么将说明过滤网发生了故障。当然不仅如此,我们看的是图像视频处理的技巧,你也可以将项目迁移到其他地方等,这仅仅是一个例子而已。我们知道计算机视觉中关于图像识别有四大类任务:


分类-Classification:解决“是什么?”的问题,即给定一张图片或一段视频判断里面包含什么类别的目标。

定位-Location:解决“在哪里?”的问题,即定位出这个目标的的位置。

检测-Detection:解决“是什么?在哪里?”的问题,即定位出这个目标的的位置并且知道目标物是什么。

分割-Segmentation:分为实例的分割(Instance-level)和场景分割(Scene-level),解决“每一个像素属于哪个目标物或场景”的问题。

而定位不仅需要找到物体的位置在哪里,还需要能够统计目标的数目以及物体状态。

除了图像分类以外,目标检验要解决问题的架构难题是:

1.目标有可能经常出现在影像的任何方位;

2.目标有各种有所不同的尺寸;

3.目标有可能有各种有所不同的外形。

如果用矩形框来界定目的,则长方形有有所不同的清晰度。由于目的的清晰度有所不同,因此使用经典之作的转动视窗+影像图形的计划解决问题标准化目的检验难题的生产成本太低。近几年来,目标检测算法取得了很大的突破。比较流行的算法可以分为两类,一类是基于Region Proposal的R-CNN系算法(R-CNN,Fast R-CNN, Faster R-CNN等),它们是two-stage的,需要先算法产生目标候选框,也就是目标位置,然后再对候选框做分类与回归。而另一类是Yolo,SSD这类one-stage算法,其仅仅使用一个卷积神经网络CNN直接预测不同目标的类别与位置。第一类方法是准确度高一些,但是速度慢,但是第二类算法是速度快,但是准确性要低一些。那么今天我们的项目并不会太多的讲解各种算法,而是我们的核心主题,目标数量识别。

那么我们将如何进行实现呢

多说无益,下面可以开始实现我们的项目。

首先导入相关的库

import cv2
from PIL import Image
from PIL import ImageDraw,ImageFont
import numpy as np

接着我们需要把水龙头流出水柱的部分提取出来,即需要把图片预先处理成这样,作为背景图来用,名为3ji.jpg如图所示:

然后通过图像作差的方法找到水柱的部分,首先就需要将图像转彩灰度图然后高斯模糊便于计算,当然其实不这样也是可以的。其中2.jpg是测试的图片,

代码如下:

'''3ji是背景图不可换,调试换另一个图片,3ji自己用画图找到水的位置清除掉水柱即可,所以说摄像头不能动'''
firstframe=cv2.imread("3ji.jpg")
firstframe= cv2.cvtColor(firstframe, cv2.COLOR_BGR2GRAY)
firstframe= cv2.GaussianBlur(firstframe, (21, 21), 0)
secondframe0=cv2.imread("2.jpg")
secondframe0= cv2.cvtColor(secondframe0, cv2.COLOR_BGR2GRAY)
secondframe= cv2.GaussianBlur(secondframe0, (21, 21), 0)
frameDelta = cv2.absdiff(firstframe, secondframe)
x,y=frameDelta.shape
print(x,y)

接着通过边缘检测找到水柱边界,方便查看。

#frameDelta和canny一个是区域一个是轮廓
img = cv2.GaussianBlur(frameDelta,(3,3),0)
canny = cv2.Canny(img, 0, 100)

定义水柱总面积变量。清水面积变量,ss数组存储像素值位置

area=0 #6687,总面积
qingarea=0
ss=[]

然后画出轮廓,并记录水柱处像素值得位置

#画轮廓,存储要识别的像素值位置,记录在ss数组中
for i in range(x):
  for j in range(y):
   if any(frameDelta[i,j]!=[0,0,0]):#白色的时候,占位
    ss.append([i,j])

然后以原图加轮廓图显示,图片相加即可:

canny0=cv2.add(secondframe0,canny)

接着根据像素值大小判断颜色,通过调试这个项目的阈值是50

#判断水柱颜色,清水占多少像素
for t in ss:
 k,l=t
 area=area+1
 if canny0[k, l] > 50:
  print(canny0[k,l])
  qingarea+=1
接着统计黑色水柱占比率为多少
deta=(qingarea/area)*100
print(qingarea)
pred="清水占比为"+str(deta)+"%"
print(pred)

最后输出图像结果:

cv2.imwrite("pred.jpg",canny0)
canny0=cv2.imread("pred.jpg")
img_PIL = Image.fromarray(cv2.cvtColor(canny0, cv2.COLOR_BGR2RGB))
myfont = ImageFont.truetype(r'C:/Windows/Fonts/simfang.ttf', 40)
draw = ImageDraw.Draw(img_PIL)
draw.text((200, 10), pred, font=myfont, fill=(255,23,140))
img_OpenCV = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR)
cv2.imshow("frame", img_OpenCV)
key = cv2.waitKey(0)

最终达到的演示效果如图所示:

清水占比96%,还是比较准确的

清水占比38%,黑水占比62%,也基本准确。

当然这仅仅是一个思路的问题,至少目前为止网上还没有对物体数目去监控的项目例子,尽管并不是如此高深,但是却是一个很好的探究方向。不仅仅是智能采矿的需要,也可以是智能农业或者智能畜牧业等方面监控的一个想法。当然大家也是可以再次基础上修改完善代码,完整的代码上面已经给出。伴随着移动互联网、手机及各交友的平台的较慢持续发展,照片的广泛传播幅度大大增强,广泛传播范围内也日益扩展。比起书写、视频、录像等广泛传播方式,照片广泛传播极具“点睛”视觉效果,合乎节奏贫困下人们高效的读者方法。

当照片给人们带给快捷的数据纪录和共享方法的同时,照片普遍地广泛传播在社会大众视线下,适当的难题也接踵而来。书写记述,使用者可以精彩通过关键字搜寻提供意愿数据,而当照片记述,使用者难以必要通过搜寻照片索引到可借助数据。

科技进步的变革常常与解决的表达意见如影随形,在使用者痛点下,亟需高科技的改进创意,此自然环境下涌现的图像识别新技术之后变得尤为重要。由此也可见计算机视觉的日益高涨的地位。

总结

以上所述是小编给大家介绍的通过 Python 和 OpenCV 实现目标数量监控,希望对大家有所帮助!

相关文章

  • Python ORM数据库框架Sqlalchemy的使用教程详解

    Python ORM数据库框架Sqlalchemy的使用教程详解

    对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。本文主要介绍了其使用的相关资料,感兴趣的小伙伴可以学习一下
    2022-10-10
  • python实现猜拳小游戏

    python实现猜拳小游戏

    这篇文章主要为大家详细介绍了python实现猜拳小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • python新手学习使用库

    python新手学习使用库

    在本篇文章里小编给大家整理的一篇关于python新手学习使用库的相关方法和知识点,需要的朋友们参考下。
    2020-06-06
  • 对python中for、if、while的区别与比较方法

    对python中for、if、while的区别与比较方法

    今天小编就为大家分享一篇对python中for 、if、 while的区别与比较方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 对Python强大的可变参数传递机制详解

    对Python强大的可变参数传递机制详解

    今天小编就为大家分享一篇对Python强大的可变参数传递机制详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06
  • python打包pyinstall的实现步骤

    python打包pyinstall的实现步骤

    PyInstaller可将Python代码打包成单个可执行文件,本文主要介绍了python打包pyinstall的实现步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 浅谈Python几种常见的归一化方法

    浅谈Python几种常见的归一化方法

    这篇文章主要介绍了几种常见的归一化方法,数据归一化是深度学习数据预处理中非常关键的步骤,可以起到统一量纲,防止小数据被吞噬的作用,需要的朋友可以参考下
    2023-04-04
  • 如何基于Python爬虫爬取美团酒店信息

    如何基于Python爬虫爬取美团酒店信息

    这篇文章主要介绍了如何基于Python爬虫爬取美团酒店信息,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python多线程爬取豆瓣影评API接口

    Python多线程爬取豆瓣影评API接口

    这篇文章主要介绍了Python多线程爬取豆瓣影评API接口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • windows下ipython的安装与使用详解

    windows下ipython的安装与使用详解

    大家都知道ipython是一个python的交互式shell,比默认的python shell好用得多,IPython有许多种安装方式,这主要和使用什么操作系统有关。本文给大家介绍的是在windows下ipython的安装与使用,有需要的朋友们可以参考学习。
    2016-10-10

最新评论