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


Posted in Python onJanuary 05, 2020

今天我们将利用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如图所示:

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

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

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

代码如下:

'''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%,还是比较准确的

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

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

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

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

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

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

总结

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

Python 相关文章推荐
python中字符串前面加r的作用
Jun 04 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
Python黑魔法@property装饰器的使用技巧解析
Jun 16 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
利用python打印出菱形、三角形以及矩形的方法实例
Aug 08 Python
PyTorch快速搭建神经网络及其保存提取方法详解
Apr 28 Python
python框架中flask知识点总结
Aug 17 Python
Python实现的连接mssql数据库操作示例
Aug 17 Python
PyQt5 实现字体大小自适应分辨率的方法
Jun 18 Python
PyCharm 配置远程python解释器和在本地修改服务器代码
Jul 23 Python
python数据处理之如何选取csv文件中某几行的数据
Sep 02 Python
使用Rasterio读取栅格数据的实例讲解
Nov 26 Python
python中count函数简单用法
Jan 05 #Python
Python猴子补丁知识点总结
Jan 05 #Python
Python调用Windows API函数编写录音机和音乐播放器功能
Jan 05 #Python
django ajax发送post请求的两种方法
Jan 05 #Python
关于tensorflow的几种参数初始化方法小结
Jan 04 #Python
基于TensorFlow常量、序列以及随机值生成实例
Jan 04 #Python
Tensorflow 实现分批量读取数据
Jan 04 #Python
You might like
2019十大人气国漫
2020/03/13 国漫
用Flash图形化数据(一)
2006/10/09 PHP
jQuery 源码分析笔记
2011/05/25 PHP
php中使用临时表查询数据的一个例子
2013/02/03 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
Javascript 复制数组实现代码
2009/11/26 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
解析jQuery与其它js(Prototype)库兼容共存
2013/07/04 Javascript
JS实现定时页面弹出类似QQ新闻的提示框
2013/11/07 Javascript
mvvm双向绑定机制的原理和实现代码(推荐)
2016/06/07 Javascript
微信小程序 form组件详解及简单实例
2017/01/10 Javascript
JavaScript正则获取地址栏中参数的方法
2017/03/02 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
three.js中文文档学习之创建场景
2017/11/20 Javascript
详解Angularjs 自定义指令中的数据绑定
2018/07/19 Javascript
加速vue组件渲染之性能优化
2020/04/09 Javascript
详解js中的原型,原型对象,原型链
2020/07/16 Javascript
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
Python3基础之基本运算符概述
2014/08/13 Python
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
Python实现电视里的5毛特效实例代码详解
2020/05/15 Python
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
意大利奢侈品牌在线精品店:Jole.it
2020/11/23 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
酒店中秋节活动方案
2014/01/31 职场文书
工地食品安全责任书
2015/05/09 职场文书
任长霞观后感
2015/06/16 职场文书
2015年汽车销售员工作总结
2015/07/24 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
用python修改excel表某一列内容的操作方法
2021/06/11 Python