今天我们将利用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如图所示:
"text-align: center">"htmlcode">
'''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%,还是比较准确的
"text-align: center">"color: #ff0000">总结
以上所述是小编给大家介绍的通过 Python 和 OpenCV 实现目标数量监控,希望对大家有所帮助!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]