python读取宇视摄像头实时流,并用opencv做人脸检测

爱被打了一巴掌 2021-09-19 15:00 1808阅读 0赞

一、测试摄像头

宇视摄像头默认密码123456,取流地址:rtsp://admin:123456@192.168.1.134:554

下载VLC播放器进行验证,下载地址如下

https://dl.pconline.com.cn/html_2/1/124/id=6661&pn=0&linkPage=1.html

选择媒体-打开网络串流

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1YW5zag_size_16_color_FFFFFF_t_70

可以看到预览流。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1YW5zag_size_16_color_FFFFFF_t_70 1

二、准备python 库

1、下载cv2

安装cv2模块不能直接用命令pip install cv2安装,要用pip install opencv-python安装,

如果失败,可以下载whl:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

或者https://pypi.tuna.tsinghua.edu.cn/simple/opencv-python/

一定要下载和python版本相适应的,比如我的3.6必须下

  • opencv_python‑3.4.6‑cp36‑cp36m‑win_amd64.whl,下cp37都会提示is not a supported wheel on this platform

pip install opencv_python‑3.4.6‑cp36‑cp36m‑win_amd64.whl

三、利用opencv预览

  1. #以下是最常用的读取视频流的方法
  2. import cv2
  3. url = 'rtsp://admin:123456@192.168.1.134:554'
  4. cap = cv2.VideoCapture(url)
  5. while(cap.isOpened()):
  6. ret, frame = cap.read()
  7. # Display the resulting frame
  8. cv2.imshow('frame',frame)
  9. if cv2.waitKey(1) & 0xFF == ord('q'):
  10. break
  11. # When everything done, release the capture
  12. cap.release()
  13. cv2.destroyAllWindows()

可以看到跳出预览画面:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2x1YW5zag_size_16_color_FFFFFF_t_70 2

四、人脸检测

  1. 分类器可以用opencv自带的haarcascade_frontalface_default.xml,在安装路径下:\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml,要和代码放在同一文件夹下
  2. 代码如下:
  3. import cv2
  4. def CatVideo():
  5. #1调用摄像头,0表示从pc本地连接的摄像头,url表示从ipc的url取流
  6. cap=cv2.VideoCapture(url)
  7. classfier = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
  8. color = (0, 255, 0)
  9. while cap.isOpened():
  10. ok,frame=cap.read()
  11. if not ok:
  12. break
  13. # 3灰度转换
  14. grey = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  15. # 4人脸检测,1.2和2分别为图片缩放比例和需要检测的有效点数
  16. faceRects = classfier.detectMultiScale(grey, scaleFactor=1.2, minNeighbors=3, minSize=(32, 32))
  17. if len(faceRects) > 0: # 大于0则检测到人脸
  18. print("检测到人脸")
  19. for faceRect in faceRects: # 单独框出每一张人脸
  20. x, y, w, h = faceRect # 5画图
  21. cv2.rectangle(frame, (x - 10, y - 10), (x + w + 10, y + h + 10), color, 3)
  22. cv2.imshow("Face Recognition", frame)
  23. if cv2.waitKey(1) & 0xFF == ord('q'):
  24. break
  25. cap.release()
  26. cv2.destroyAllWindows()

其中:waitKey()方法本身表示等待键盘输入,

参数是1,表示延时1ms切换到下一帧图像,对于视频而言;

参数为0,如cv2.waitKey(0)只显示当前帧图像,相当于视频暂停,;

按q时退出播放

20190613164622771.png

五、问题

1、误报率还是挺高的,

2、解码经常出错

[h264 @ 000000000ef76940] cabac decode of qscale diff failed at 84 17
[h264 @ 000000000ef76940] error while decoding MB 84 17, bytestream 507ffmpeg

解码h264流出错,最挫的方法是设置IPC编码格式

3、启动较慢

发表评论

表情:
评论列表 (有 0 条评论,1808人围观)

还没有评论,来说两句吧...

相关阅读