使用OpenCV实现实时视频目标检测

文章目录
  1. 1. 前言
  2. 2. 环境准备
    1. 2.1. python
    2. 2.2. opencv
  3. 3. 运行代码
    1. 3.1. 修改
    2. 3.2. 运行
    3. 3.3. 进阶修改
  4. 4. 运行效果
  5. 5. 源码分享
  6. 6. 书签

前言

老板与时俱进,开始带领大家搞机器学习。nice,刚好小生就想往这方面发展。这不,老板派发下了任务:利用深度学习+python+opencv,实现实时视频目标检测。看教程,很简单的样子,那就搞一下。

环境准备

python

1、参考《Anaconda》,安装Anaconda。

Anaconda常用命令:

  • 查看环境,conda env list
  • 进入环境,activate my_env
  • 退出环境,deactivate
  • 查看python版本,python --version
  • 添加环境,conda create -n py3.6 python=3.6
  • 删除环境,conda env remove -n py3.6
  • 查看环境中的包,conda list
  • 更新当前环境下的所有包,conda upgrade --all
  • 安装包,conda install package_name

2、安装python3.6环境,以便使用对应版本的opencv。

1
2
3
conda create -n py3.6 python=3.6
activate py3.6
conda upgrade --all

PS:以下命令都是在python3.6环境中执行。

3、安装numpy、imutils

1
2
pip install numpy
pip install imutils

opencv

1、访问Python Extension Packages for Windows,下载python对应版本的opencv。

比如小编下载的是opencv_python-3.3.0+contrib-cp36-cp36m-win_amd64.whl,cp36表示Python是3.6版本,win_amd64是表示安装的python是64bit的,+contrib表示包括contrib包。

2、下载好后,把它放到C盘中,执行安装命令:
pip install C:\opencv_python-3.3.0+contrib-cp36-cp36m-win_amd64.whl

运行代码

修改

Adrian Rosebrock同学的原版代码适用于直接调用摄像头来获取视频流,尴尬的是,小生的电脑摄像头坏了,无法使用。于是,不得不修改代码,主要是把视频流的获取方式改为从本地获取。

1
2
3
# vs = VideoStream(src=0).start()
# vs =cv2.VideoCapture('C:\\Users\\voidking\\Desktop\\real-time-object-detection\\test_video.flv')
vs =cv2.VideoCapture('./test_video.flv')

1
2
3
4
5
6
7
8
9
10
11
12
# grab the frame from the threaded video stream and resize it
# to have a maximum width of 400 pixels
# frame = vs.read()
# frame = imutils.resize(frame, width=400)

# grab the frame from the threaded video file stream
(grabbed,frame) = vs.read()
# if the frame was not grabbed, then we have reached the end
# of the stream
if not grabbed:
break
frame = imutils.resize(frame, width=800)

运行

推荐使用命令:

1
python real_time_object_detection.py -p ./MobileNetSSD_deploy.prototxt.txt -m ./MobileNetSSD_deploy.caffemodel

或者,指定绝对路径,假设项目目录为C:\Users\voidking\Desktop\real-time-object-detection\,那么命令如下:

1
python real_time_object_detection.py -p "C:\Users\voidking\Desktop\real-time-object-detection\MobileNetSSD_deploy.prototxt.txt" -m "C:\Users\voidking\Desktop\real-time-object-detection\MobileNetSSD_deploy.caffemodel"

进阶修改

我们看到,prototxt和model都是指定的,那我们的视频文件也用这种方式指定,就更加友好一点。

1
2
3
4
5
6
7
8
9
# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--prototxt", required=True,
help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True,
help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2,
help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

我们插入一行:

1
2
ap.add_argument("-v", "--video", required=True,
help="path to Caffe video file")

然后在初始化视频流时,修改为:

1
vs =cv2.VideoCapture(args["video"])

运行命令修改为:

1
python real_time_object_detection.py -p ./MobileNetSSD_deploy.prototxt.txt -m ./MobileNetSSD_deploy.caffemodel -v ./test_video.flv

运行效果

源码分享

https://github.com/voidking/object-detection.git

书签

《深度学习 + OpenCV,Python实现实时视频目标检测》

Real-time object detection with deep learning and OpenCV

Faster video file FPS with cv2.VideoCapture and OpenCV

用 Python 和 OpenCV 检测和跟踪运动对象

用树莓派 + Python + OpenCV 实现家庭监控和移动目标探测(下)

Python 3.x 安装opencv+opencv_contrib