Python语言OpenCV开发之目标跟踪

前言

目标跟踪是对摄像头视频中的移动目标进行定位的过程,对视频的处理分析也越来越成为计算机视觉的主流,而本质上视频是由一帧帧的图像组成,所以视频处理最终还是要归结于图像处理。关于视频帧如何获取的,在GUI特性那一章节已经说过,这里不再讲述。

正文

1、 基本的运动检测
为了检测视频中的目标物体,首要任务就是识别视频帧中耳钉那些可能包含移动目标的区域。有不少实现视频目标检测的办法;例如,当检测所有移动的目标时,帧之间的差异会变得有用。当检测视频中移动的手时,基于皮肤颜色的均值漂移就是最好的解决方案。当知道跟踪对象的一方面时,模板匹配会是不做的选择。下面分析一个简单的例子:

import cv2
import numpy as np

camera = cv2.VideoCapture(0)

es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (10,10))
kernel = np.ones((5,5),np.uint8)
background = None

while (True):
  ret, frame = camera.read()
  if background is None:# 第一帧作为背景输入
    background = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 先将帧转换为灰阶
    background = cv2.GaussianBlur(background, (21, 21), 0)# 再进行一次模糊处理(平滑)
    continue

  gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 先将帧转换为灰阶
  gray_frame = cv2.GaussianBlur(gray_frame, (21, 21), 0)# 再进行一次模糊处理(平滑)
  diff = cv2.absdiff(background, gray_frame) # 计算与背景的差异,并得到一个差分图
  diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1]# 应用阈值得到一副黑白图,
  diff = cv2.dilate(diff, es, iterations = 2)# 膨胀(dilate)图像,从而对孔(hole)和缺陷(imperfection)进行归一化处理
  image, cnts, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 计算一幅图中目标的轮廓

  for c in cnts:
    if cv2.contourArea(c) < 1500:
      continue
    (x, y, w, h) = cv2.boundingRect(c)# 计算矩形的边界框
    cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 255, 0), 2)

  cv2.imshow("contours", frame)
  cv2.imshow("dif", diff)
  if cv2.waitKey(int(1000 / 12)) & 0xff == ord("q"):
      break

cv2.destroyAllWindows()
camera.release()

补充说明:进行模糊处理的原因:每个输入的视频丢回自然震动、光照变化或者摄像头本身等原因而产生噪声,对噪声进行平滑是为了避免在运动和跟踪时将噪声检测出来。当然这里是使用的OpenCV自带的UI控件,如果想用到工程项目中,显示在需要的地方,可以使用PyQt结合Matplotlib将画面完美的显示出来。感兴趣的同学可以参考一下我的PyQT结合OpenCV的Chat中的文章:http://gitbook.cn/gitchat/activity/5a433b3ffee1cd074a5cef06
效果如下:
enter image description here
对于这个简单的技术,其结果还算可以,但是也是有很大的缺点的,最明显的问题是需要通过提前设置‘默认’帧作为背景。在一些情况下,由于光照变化频繁,这种处理方法就显得相当不灵活。
2、 背景分割器
在OpenCV 3中有两种种背景分割器࿱

  • 8
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值