IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测

IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测


环境配置

Python3.5

既然是windows下用python,那就不要作死自己弄环境了,直接用anaconda,有条件的还可以把自己的GPU给用起来。
windows(win10)+anacondaGPU版tensorflow安装以及一些常见问题的解决
新建一个python3.5的环境,命名py35

tensorflow 1.2

打开Anaconda Prompt,进入新建的py35环境下:

activate py35

安装tensorflow(这是CPU版,GPU版去看上面那个教程)

conda install tensorflow

OpenCV3

在这里原文建议用的是OpenCV3.0,因为

OpenCV 3.1 might crash on OSX after a while, so that’s why I had to switch to version 3.0. See open issue and solution here.

在OSX上会有bug,但是我们这用的是windows。。win居然还有这种日子

用conda安装opencv,打开Anaconda Prompt:

conda install --channel https://conda.anaconda.org/menpo opencv3

conda自动匹配的是opencv3.1
直接安装

如果下载速度感人,在Anaconda Prompt里把下载源设置为国内地址

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes

如果下载速度还是感人,去Unofficial Windows Binaries for Python Extension Packages下载对应的opencv版本whl文件。在这个网站上对应python3.5d的只有OpenCV3.3,经过亲测,对于这个例子来说没啥影响。
下载opencv_python-3.3.0-cp35-cp35m-win_amd64.whl完毕后,用Anaconda Prompt进入到whl文件所在的目录:

pip install opencv_python-3.3.0-cp35-cp35m-win_amd64.whl

matplotlib

conda install matplotlib

PIL

python3.5已经没有以前常用的PIL,转而用pillow代替

conda install pillow

Object detector 程序测试

下载github上的源码
用Anaconda Prompt进入到源码所在目录,运行object_detection_app.py

python object_detection_app.py

正常来说就会启动识别程序了。程序会打开一个窗口,摄像头的图像会实时显示,相关目标会用框框出来。

这个原文给的代码demo识别类别有限,到现在为止我只测出来几种不多的类别。


设置网络摄像头

这里用智能手机自带的摄像头来充当网络摄像头(貌似发现了家中淘汰的智能手机发光发热的机会)

下载网络摄像头APP

我用的是我的华为m2, 在官方的应用市场里找到了最上方的那款“IP摄像头”

IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测_第1张图片 IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测_第2张图片

打开之后的界面如上方右图所示,有很多摄像头参数可以自己调节。调完参数后菜单拉倒最下方,点“开启服务器”,网络摄像头功能就开始正常工作了

这个网络摄像头是针对同一局域网内的设备的,所以进行接下来的实验的电脑必须和网络摄像头,也就是智能手机处于同一局域网内(所以如果用智能手机当网络摄像头,就只能连无线网络了)

获取网络摄像头地址

点击“开启服务器”之后,在电脑的网页浏览器内输入摄像头app给你的局域网ip和端口(默认是8080),就可以进入网络摄像头的接待界面

IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测_第3张图片

但是我们在用python程序调用摄像头时是不需要这个交互界面的,我们需要的是纯粹的视频:右键点击视频区域–在新选项卡中打开,最后获得了网络摄像头的地址http://192.168.1.100:8080/video(我的地址,不同的环境可能有所不同)与图像

IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测_第4张图片

至此网络摄像头就配置完成了,这个图像可以被python程序直接调用

python 调用网络摄像头

利用opencv可以直接调用并输出摄像头获得的图像:

# -*- coding: utf-8 -*-
import cv2
cv2.namedWindow("webcam test")
cam_url='http://192.168.1.100:8080/video'
vc=cv2.VideoCapture(cam_url)
if vc.isOpened(): 
    rval, frame = vc.read()
else:
    rval = False

while rval:
#    frame=cv2.resize(frame,(100,100)) 调节输出图像的大小
    cv2.imshow("webcam test", frame)
    rval, frame = vc.read()
    key = cv2.waitKey(20)
    if key == 27: # exit on ESC
        break

如果一切顺利,程序运行后系统会自动开启一个名叫”webcam test”的显示窗口,显示的内容正是你智能手机摄像头拍摄到的画面

到这里已经实现了“监控”的功能了,接下来要做的就是把监控和物体探测结合起来

监控 + 物体探测

这就需要改一下先前那个Github项目中的代码了,只需要改object_detection_app.py中的一些关于opencv语句即可
object_detection_app.py

... ...
if __name__ == '__main__':
    ... ...
    input_q = Queue(maxsize=args.queue_size)
    output_q = Queue(maxsize=args.queue_size)
    pool = Pool(args.num_workers, worker, (input_q, output_q))

# webcamera
    cam_url='http://192.168.1.100:8080/video'
    video_capture=cv2.VideoCapture(cam_url)
    #video_capture = WebcamVideoStream(src=args.video_source,
     #                                 width=args.width,
      #                                height=args.height).start()
    fps = FPS().start()
    t_start = time.time()
    out = None
    while True:  # fps._numFrames < 120
        if time.time()-t_start > 2: # 因为识别速度和视频帧率相差过大,为了使输出图像与摄像头输入保持同步,所以每两秒输出一次识别结果。该参数可以根据计算性能加以调整
            t_start = time.time()
            _,frame = video_capture.read()
            frame=cv2.resize(frame,(int(args.width),int(args.height)))
            input_q.put(frame)

            t = time.time()
            out = output_q.get()
            cv2.imshow('Video', out)
            fps.update()

            print('[INFO] elapsed time: {:.2f}'.format(time.time() - t))
        else:  
            _,frame = video_capture.read()
            if out is not None:
                cv2.imshow("Video", out)
            else:
                cv2.imshow("Video", frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break


... ...

运行方法没变

效果

IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测_第5张图片

IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测_第6张图片

完工

可以带着小手机到处逛了


参考资料

关于anaconda3下安装opencv3
opencv调用网络摄像头
OpenCV获取IP摄像头视频
Building a Real-Time Object Recognition App with Tensorflow and OpenCV

你可能感兴趣的:(IoT: Win10+Tensorflow+OpenCV+IPCamera 实时视频物体检测)