從開源中國博客搬來,合並博客
實驗室做一個智能小車的小項目,期間涉及到在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)