OpenCV获取IP摄像头视频

从开源中国博客搬来,合并博客

实验室做一个智能小车的小项目,期间涉及到在PC端处理小车摄像头的视频。这里先用安卓手机代替一下进行试验。大致流程就是手机摄像头获取视频,开启一个IP摄像头服务软件,在局域网内可以根据IP进行访问。Python+OpenCV2获取视频并进行显示人脸识别。

具体步骤

  • Step1:安装IP摄像头软件

    这个在应用商店里搜一下就行了

  • Step2:浏览器访问测试

    根据IP摄像头软件的提示从在同一个局域网中的PC的浏览器上进行访问(如:192。168.1.111:8080)

  • Step3:OpenCV获取视频

    视频的本质是不断变化的图片,而Python是可以直接通过URL/IP获得图片的,找到图片地址,就可以进行获取了代码如下:

resp = urllib.urlopen("http://192.168.1.128:8080/shot.jpg")
frame = resp.read()
  • Step4:进行图片转码

    上一步获得的图片OpenCV是无法直接处理的(你把它保存了再打开的话,算我没说),而这就涉及到了图片的存储格式的转换,将比特流转换成OpenCV里的图片格式,代码如下:

resp = urllib.urlopen("http://192.168.1.128:8080/shot.jpg")
frame = np.asarray(bytearray(resp.read()), dtype="uint8")
frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
  • Step5:人脸识别

    这个就没什么说的了,将图片转码之后就和处理普通视频没什么差别了。完整代码如下:

#coding:utf-8
import cv2
import urllib2
import urllib
import numpy as np
cv2.namedWindow("test")#命名一个窗口
#cap=cv2.VideoCapture("http://192.168.1.128:8080/shot.jpg?rnd=190604?dummy=param.mjpg")#打开1号摄像头
#success, frame = cap.read()#读取一桢图像,前一个返回值是是否成功,后一个返回值是图像本身
# print success
success = True
resp = urllib.urlopen("http://192.168.1.111:8080/shot.jpg")
frame = np.asarray(bytearray(resp.read()), dtype="uint8")
frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
color = (255,0,0)#设置人脸框的颜色
classfier=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")#定义分类器
while success:
    #success, frame = cap.read()
    resp = urllib.urlopen("http://192.168.1.111:8080/shot.jpg")
    frame = np.asarray(bytearray(resp.read()), dtype="uint8")
    frame = cv2.imdecode(frame, cv2.IMREAD_COLOR)
    size=frame.shape[:2]#获得当前桢彩色图像的大小
    image=np.zeros(size,dtype=np.float16)#定义一个与当前桢图像大小相同的的灰度图像矩阵
    image = cv2.cvtColor(frame, cv2.cv.CV_BGR2GRAY)#将当前桢图像转换成灰度图像
    cv2.equalizeHist(image, image)#灰度图像进行直方图等距化
    #如下三行是设定最小图像的大小
    divisor=8
    h, w = size
    minSize=(w/divisor, h/divisor)
    faceRects = classfier.detectMultiScale(image, 1.2, 2, cv2.CASCADE_SCALE_IMAGE,minSize)#人脸检测
    if len(faceRects)>0:#如果人脸数组长度大于0
        for faceRect in faceRects: #对每一个人脸画矩形框
                x, y, w, h = faceRect
                cv2.rectangle(frame, (x, y), (x+w, y+h), color)
    cv2.imshow("test", frame)#显示图像
    key=cv2.waitKey(10)
    c = chr(key & 255)
posted @ 2015-10-07 17:08  Tacey Wong  阅读(3732)  评论(1编辑  收藏  举报