本教程我将分享几个简单步调剂释如何使用OpenCV进行Python对象计数。

需要安装一些软件:

Python 3OpennCV

1.了解Opencv从摄像头获得视频的Python脚本

import cv2, time#1. Create an object.Zero for external cameravideo=cv2. VideoCapture(0)#1. a variablea=0while True:        a=a+1        #3. Create frame object        check, frame = video.read()        print(check)        print(frame) # Reprsenting image        #6. converting to grascale        gray=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)        #4. shadow the frame        cv2.imshow("Capturing", gray)        #5. for press any key to out (milisecond)        #cv2.waitKey(0)        #7. for playing        key=cv2.waitKey(1)                if key==ord('q'):                break        print (a)#2. Shutdown the cameravideo.release() cv2.destroyAllWindows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-1.jpg (51.45 KB, 下载次数: 0)

2018-10-16 16:50 上传

2.加载视频

现在我们将开始逐步学习这个车辆计数教程。第一步是打开我们将在本教程中使用的视频录制。Python示例代码如下:

import numpy as npimport cv2cap = cv2.VideoCapture('traf.mp4') #Open video filewhile(cap.isOpened()): ret, frame = cap.read() #read a frame try: cv2.imshow('Frame',frame) except: #if there are no more frames to show... print('EOF') break #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-2.jpg (33.87 KB, 下载次数: 0)

2018-10-16 16:50 上传

3. 在视频窗口中绘图

这部分很是简单,因为我们只在视频上显示文字或画线。

使用Python代码在视频文件中显示文本如下:

import numpy as npimport cv2cap = cv2.VideoCapture('traf.mp4') #Open video filew = cap.get(3) #get widthh = cap.get(4) #get heightmx = int(w/2)my = int(h/2)count = 0while(cap.isOpened()): ret, frame = cap.read() #read a frame try: count = count + 1 text = "Statistika UII " + str(count) cv2.putText(frame, text ,(mx,my),cv2.FONT_HERSHEY_SIMPLEX ,1,(255,255,255),1,cv2.LINE_AA) cv2.imshow('Frame',frame) except: #if there are no more frames to show... print('EOF') break #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-3.jpg (56.06 KB, 下载次数: 0)

2018-10-16 16:50 上传

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-4.jpg (40.06 KB, 下载次数: 0)

2018-10-16 16:50 上传

除显示文字,我们还可以绘制线条,圆圈等。OpenCV有许多绘制几何形状的体例

import numpy as npimport cv2cap = cv2.VideoCapture('traf.mp4') #Open video filewhile(cap.isOpened()): ret, frame = cap.read() #read a frame try:  cv2.imshow('Frame',frame) frame2 = frame except: #if there are no more frames to show... print('EOF') break line1 = np.array([[100,100],[300,100],[350,200]], np.int32).reshape((-1,1,2)) line2 = np.array([[400,50],[450,300]], np.int32).reshape((-1,1,2)) frame2 = cv2.polylines(frame2,[line1],False,(255,0,0),thickness=2) frame2 = cv2.polylines(frame2,[line2],False,(0,0,255),thickness=1)  cv2.imshow('Frame 2',frame2)  #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-5.jpg (63.02 KB, 下载次数: 0)

2018-10-16 16:50 上传

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-6.jpg (38.95 KB, 下载次数: 0)

2018-10-16 16:50 上传

4.布景分手

此体例通过区散布景和对象(前景)的移动来分手对象。该体例很是广泛地用于进入或离房间计数,交通信息系统中车辆统计,访客数量等。

import numpy as npimport cv2cap = cv2.VideoCapture('traf.mp4') #Open video filefgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True) #Create the background substractorwhile(cap.isOpened()): ret, frame = cap.read() #read a frame  fgmask = fgbg.apply(frame) #Use the substractor  try:  cv2.imshow('Frame',frame) cv2.imshow('Background Substraction',fgmask) except: #if there are no more frames to show... print('EOF') break  #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-7.jpg (43.16 KB, 下载次数: 0)

2018-10-16 16:50 上传

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-8.jpg (31.13 KB, 下载次数: 0)

2018-10-16 16:50 上传

在图像中,黑色的图像为布景,而白色的图像是检测的对象。

5.形态转换

图像措置中的形态学,即数学形态学(mathematical Morphology),是图像措置中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最为素质〈最具区分能力-most discriminative)的形状特征,如鸿沟和连通区域等。同时像细化、像素化和修剪毛刺等技术也常应用于图像的预措置和后措置中,成为图像增强技术的有力弥补。

经常使用的形态学操作:包含侵蚀、膨胀, 以及开、闭运算。

膨胀: 输出像素的值是所有输入像素值中的最大值。在二值图像中,如果领域中有一个像素值为1,则输出像素值为1。如下图

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-9.jpg (54.7 KB, 下载次数: 0)

2018-10-16 16:50 上传

侵蚀:输出像素的值是所有输入像素值中的最小值,在二值图像中,若果领域中有一个像素值为0,则输出像素值为0,看下图:

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-10.jpg (59.8 KB, 下载次数: 0)

2018-10-16 16:50 上传

膨胀和侵蚀的Python实现如下:

import cv2import numpy as npimg = cv2.imread("carcount.png")ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)kernel = np.ones((3,3),np.uint8)erosion = cv2.erode(img,kernel,iterations = 1)dilation = cv2.dilate(img,kernel,iterations = 1)cv2.imwrite("erode.png",erosion)cv2.imwrite("dilate.png",dilation)

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-11.jpg (30.11 KB, 下载次数: 0)

2018-10-16 16:50 上传

查看侵蚀和扩张的结果如下图:

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-12.jpg (24.54 KB, 下载次数: 0)

2018-10-16 16:50 上传

开运算:先侵蚀再膨胀,可以去失落目标外的孤立点。目标外的孤立点是和目标像素值一样的点,而非布景像素点,即为1而非0(0暗示选取的空洞或布景像素值)。使用侵蚀,布景扩展,该孤立点被侵蚀失落,可是侵蚀会致使目标区域缩小一圈,因此需要再进行膨胀操作,将目标区域扩展回原来巨细。所以,要使用开运算去除目标外的孤立点。

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-13.jpg (49.74 KB, 下载次数: 0)

2018-10-16 16:50 上传

闭运算:先膨胀再侵蚀,可以去失落目标内的孔。目标内的孔,属于周围都是值为1,内部空洞值为0.目的是去除周围都是1的像素中间的0值。闭运算首先进行膨胀操作,目标区域扩张一圈,将目标区域的0去除,可是目标区域同时也会向外扩张一圈,因此需要使用侵蚀操作,使得图像中的目标区域恢复到之前的巨细。

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-14.jpg (68.05 KB, 下载次数: 0)

2018-10-16 16:50 上传

代码实现如下:

import cv2import numpy as npimg = cv2.imread("carcount.png")ret,thresh1 = cv2.threshold(img,200,255,cv2.THRESH_BINARY)kernel = np.ones((5,5),np.uint8)opening = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel)closing = cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel)cv2.imwrite("carcount_closing.png",closing)cv2.imwrite("carcount_opening.png",opening)

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-15.jpg (35.65 KB, 下载次数: 0)

2018-10-16 16:50 上传

6.寻找轮廓

到目前为止,我们已经过滤了视频流文件,然后我们将检测移动对象上的轮廓。

import numpy as npimport cv2cap = cv2.VideoCapture('traf.mp4') #Open video filefgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True) #Create the background substractorkernelOp = np.ones((3,3),np.uint8)kernelCl = np.ones((11,11),np.uint8)while(cap.isOpened()): ret, frame = cap.read() #read a frame fgmask = fgbg.apply(frame) #Use the substractor try: ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY) #Opening (erode->dilate)  mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kernelOp) #Closing (dilate -> erode)  mask = cv2.morphologyEx(mask , cv2.MORPH_CLOSE, kernelCl) except: #if there are no more frames to show... print('EOF') break _, contours0, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) for cnt in contours0: cv2.drawContours(frame, cnt, -1, (0,255,0), 3, 8) cv2.imshow('Frame',frame) #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-16.jpg (67.9 KB, 下载次数: 0)

2018-10-16 16:50 上传

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-17.jpg (39.9 KB, 下载次数: 0)

2018-10-16 16:50 上传

7.界说对象

这是一个很是有趣的部分,我们将轮廓分类为车辆对象。此界说以小红点标识表记标帜。Python实现如下:

import numpy as npimport cv2cap = cv2.VideoCapture('traf.mp4') #Open video filefgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True) #Create the background substractorkernelOp = np.ones((3,3),np.uint8)kernelCl = np.ones((11,11),np.uint8)areaTH = 500while(cap.isOpened()): ret, frame = cap.read() #read a frame  fgmask = fgbg.apply(frame) #Use the substractor try: ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY) #Opening (erode->dilate)  mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kernelOp) #Closing (dilate -> erode)  mask = cv2.morphologyEx(mask , cv2.MORPH_CLOSE, kernelCl) except: #if there are no more frames to show... print('EOF') break _, contours0, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) for cnt in contours0: cv2.drawContours(frame, cnt, -1, (0,255,0), 3, 8) area = cv2.contourArea(cnt) print (area) if area > areaTH: ################# # TRACKING # #################  M = cv2.moments(cnt) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) x,y,w,h = cv2.boundingRect(cnt) cv2.circle(frame,(cx,cy), 5, (0,0,255), -1)  img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)  cv2.imshow('Frame',frame)  #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-18.jpg (98.47 KB, 下载次数: 0)

2018-10-16 16:50 上传

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-19.jpg (36.23 KB, 下载次数: 0)

2018-10-16 16:50 上传

8.移动标的目的

您已经知道我们的视频上有什么对象,现在您想知道它们往哪里移动(如:向上/向下)。在第一帧中,您需要将检测到的ID对象保存初始位置。然后,在下一帧中,要继续跟踪对象,必须将帧中对象的轮廓与首次呈现时的ID匹配,并保存该对象的坐标。然后,在对象跨越视频的鸿沟(或一定量的限制)之后,您可以使用存储的位置来评估它是向上或是向下移动。

import numpy as npimport cv2import Carimport timecap = cv2.VideoCapture('peopleCounter.avi') #Open video filefgbg = cv2.createBackgroundSubtractorMOG2(detectShadows = True) #Create the background substractorkernelOp = np.ones((3,3),np.uint8)kernelCl = np.ones((11,11),np.uint8)#Variablesfont = cv2.FONT_HERSHEY_SIMPLEXcars = []max_p_age = 5pid = 1areaTH = 500while(cap.isOpened()): ret, frame = cap.read() #read a frame  fgmask = fgbg.apply(frame) #Use the substractor try: ret,imBin= cv2.threshold(fgmask,200,255,cv2.THRESH_BINARY) #Opening (erode->dilate)  mask = cv2.morphologyEx(imBin, cv2.MORPH_OPEN, kernelOp) #Closing (dilate -> erode)  mask = cv2.morphologyEx(mask , cv2.MORPH_CLOSE, kernelCl) except: #if there are no more frames to show... print('EOF') break _, contours0, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE) for cnt in contours0: cv2.drawContours(frame, cnt, -1, (0,255,0), 3, 8) area = cv2.contourArea(cnt) if area > areaTH: ################# # TRACKING # #################  M = cv2.moments(cnt) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) x,y,w,h = cv2.boundingRect(cnt)  new = True for i in cars: if abs(x-i.getX()) <= w and abs(y-i.getY()) <= h: # the object is close to one that was already detected before new = False i.updateCoords(cx,cy) #Update coordinates on the object and resets age break if new == True: p = Car.MyCar(pid,cx,cy, max_p_age) cars.append(p) pid += 1  cv2.circle(frame,(cx,cy), 5, (0,0,255), -1) img = cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2)  cv2.drawContours(frame, cnt, -1, (0,255,0), 3) for i in cars: if len(i.getTracks()) >= 2: pts = np.array(i.getTracks(), np.int32) pts = pts.reshape((-1,1,2)) frame = cv2.polylines(frame,[pts],False,i.getRGB()) if i.getId() == 9: print (str(i.getX()), ',', str(i.getY())) cv2.putText(frame, str(i.getId()),(i.getX(),i.getY()),font,0.3,i.getRGB(),1,cv2.LINE_AA)   cv2.imshow('Frame',frame)  #Abort and exit with 'Q' or ESC k = cv2.waitKey(30) & 0xff if k == 27: breakcap.release() #release video filecv2.destroyAllWindows() #close all openCV windows

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-20.jpg (140.41 KB, 下载次数: 1)

2018-10-16 16:50 上传

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-21.jpg (51.12 KB, 下载次数: 1)

2018-10-16 16:50 上传

9.计数

你之前的部分已经知道如何检测对象运动的体例。现在,我们必须看到这个列表并确定对象是否在我们的视频中向上或下降。要做到这一点,首先将创作发现两条线,这将显示什么时候来评估对象的标的目的(line_up,line_down)。并且还会有两行界限,告诉我们什么时候停止跟踪物体(up_limit,down_limit)。

计算机视觉:利用OpenCV和Python进行车辆计数详细步调-22.jpg (44.99 KB, 下载次数: 0)

2018-10-16 16:50 上传

更多内容回复查看:

游客,如果您要查看本帖隐藏内容请回复

python用opencv计算汽车间距_计算机视觉:利用OpenCV和Python进行车辆计数详细步调...相关推荐

  1. python图像计数_计算机视觉:利用OpenCV和Python进行车辆计数详细步骤

    本教程我将分享几个简单步骤解释如何使用OpenCV进行Python对象计数. 需要安装一些软件: Python 3 OpennCV 1.了解Opencv从摄像头获得视频的Python脚本import ...

  2. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  3. 用python做科学计算的好处_使用Python做科学计算初探(转)

    今天在搞定Django框架的blog搭建后,尝试一下python的科学计算能力. python的科学计算有三剑客:numpy,scipy,matplotlib. numpy负责数值计算,矩阵操作等: ...

  4. python 批量查询网页导出结果_李亚涛:python批量查询网页收录情况并计算收录率...

    想要一个关键词有排名 第一件事就是保证有一个页面布局了这个关键词,而且这个页面已经被收录了. 所以,我们网站在更新一些信息的时候,比如发布资讯,如果没有被收录,那就无法获得排名,也就没办法带来流量. ...

  5. python excel模板_如何利用Excel与Python制作PPT

    对外汉语课堂中需要制作PPT.有些PPT的版式是相对固定的,如果数量巨大的话,可以利用python的pptx插件,与excel相结合,制作PPT.完整工作流有些复杂,所以分为4个部分来说明. PPT准 ...

  6. python网上有免费资源吗_【转载】学习Python无从下手?最好的免费资源想要拿走...

    Python 可以用来做什么? 在我看来,基本上可以不负责任地认为,Python 可以做任何事情.无论是从入门级选手到专业级选手都在做的爬虫,还是Web 程序开发.桌面程序开发还是科学计算.图像处理, ...

  7. python要和什么一起学_跟哥一起学Python(1) - python简介

    01-写在前面 我做了十几年的程序猿,码过代码.带过项目.做过产品经理.做过软件架构师.因为我是做通信设备软件的,面向底层操作系统,所以我的工作主要以C语言为主.Python在我的工作中通常用来写一些 ...

  8. python 内存溢出能捕获吗_从0基础学习Python (19)[面向对象开发过程中的异常(捕获异常~相关)]...

    从0基础学习Python (Day19) 面向对象开发过程中的=>异常 什么是异常 ​ 当程序在运行过程中出现的一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行了,反而出现了一些错误的 ...

  9. python里面两个大于号_【课堂笔记】Python常用的数值类型有哪些?

    学习了视频课程<财务Python基础>,小编特为大家归纳了Python常用的数值类型和运算符,大家一起来查缺补漏吧~~ 数值类型 整型(int):整型对应我们现实世界的整数,比如1,2,1 ...

最新文章

  1. Subversion权限详解
  2. 到底多大才算高并发?
  3. 春运首日武警广东总队护航
  4. sharepoint ECMAScript对象模型系列
  5. python del函数_python中del函数的垃圾回收
  6. 枚举算法:最小连续n个合数。试求出最小的连续n个合数(其中n是键盘输入的任意正整数)。
  7. Google Chrome,另类的邪恶垄断?
  8. 用TMG搭建×××服务器(二)---L2TP/IPsec ×××
  9. java求字符串数组交集、并集和差集
  10. 1000个脑筋急转弯
  11. Elsevier LaTeX 模板中参考文献没有序号,且文章引用不是序号引用
  12. Aggressive cows--二分法思想
  13. C++中的五种构造函数
  14. java 斗地主出牌算法_斗地主智能(AI)出牌算法
  15. 常用背景色RGB数值
  16. 吐血整理《上海市居住证》积分申请指南
  17. Dell EMC VxRail
  18. jupyter 内核似乎挂掉了 它很快将自动重启---解决方案
  19. 2.springcloud配置ssh
  20. 低代码时代的团队分工有哪些?

热门文章

  1. 嘉立创SMT下单流程
  2. 嘉立创 指定位置放编号的规则
  3. 童夫尧:进入物联网时代 中国如何弯道超车
  4. 阿里小号给106号码发短信
  5. php 手势验证码,通过微信小程序如何实现手势图案锁屏
  6. win10系统解决cmd不是默认管理员打开的办法
  7. 智能编程助手:GPT如何改变程序员的职业生涯
  8. C++_list快速学习入门(中英文结合)
  9. 多进程生产者消费者框架设计
  10. QQ小程序模板消息填坑——40003、40035