既然是windows下用python,那就不要作死自己弄环境了,直接用anaconda,有条件的还可以把自己的GPU给用起来。
windows(win10)+anacondaGPU版tensorflow安装以及一些常见问题的解决
新建一个python3.5的环境,命名py35
打开Anaconda Prompt,进入新建的py35环境下:
activate py35
安装tensorflow(这是CPU版,GPU版去看上面那个教程)
conda install tensorflow
在这里原文建议用的是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
conda install matplotlib
python3.5已经没有以前常用的PIL,转而用pillow代替
conda install pillow
下载github上的源码
用Anaconda Prompt进入到源码所在目录,运行object_detection_app.py
python object_detection_app.py
正常来说就会启动识别程序了。程序会打开一个窗口,摄像头的图像会实时显示,相关目标会用框框出来。
这个原文给的代码demo识别类别有限,到现在为止我只测出来几种不多的类别。
这里用智能手机自带的摄像头来充当网络摄像头(貌似发现了家中淘汰的智能手机发光发热的机会)
我用的是我的华为m2, 在官方的应用市场里找到了最上方的那款“IP摄像头”
打开之后的界面如上方右图所示,有很多摄像头参数可以自己调节。调完参数后菜单拉倒最下方,点“开启服务器”,网络摄像头功能就开始正常工作了
这个网络摄像头是针对同一局域网内的设备的,所以进行接下来的实验的电脑必须和网络摄像头,也就是智能手机处于同一局域网内(所以如果用智能手机当网络摄像头,就只能连无线网络了)
点击“开启服务器”之后,在电脑的网页浏览器内输入摄像头app给你的局域网ip和端口(默认是8080),就可以进入网络摄像头的接待界面
但是我们在用python程序调用摄像头时是不需要这个交互界面的,我们需要的是纯粹的视频:右键点击视频区域–在新选项卡中打开,最后获得了网络摄像头的地址http://192.168.1.100:8080/video
(我的地址,不同的环境可能有所不同)与图像
至此网络摄像头就配置完成了,这个图像可以被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
... ...
运行方法没变
效果
完工
可以带着小手机到处逛了
关于anaconda3下安装opencv3
opencv调用网络摄像头
OpenCV获取IP摄像头视频
Building a Real-Time Object Recognition App with Tensorflow and OpenCV