學習前言
好多人都想了解一下如何對攝像頭進行調用,然後進行目標檢測,於是我做了這個小BLOG。
使用到的庫
opencv-python==4.1.2.30
Pillow==6.2.1
numpy==1.17.4
這些都是通用的庫,版本不同問題應該也不大。
實現思路
利用opencv調用攝像頭,讀取每一幀傳入目標檢測網絡檢測,將檢測結果呈現。
由於本文所用的檢測格式爲RGB格式,CV2讀取的時候會使用BGR格式,因此在檢測的時候要利用cv2.cvtColor進行轉換。
實現代碼
以Retinanet爲例:
from keras.layers import Input
from retinanet import Retinanet
from PIL import Image
import numpy as np
import cv2
retinanet = Retinanet()
# 調用攝像頭
capture=cv2.VideoCapture(0)
while(True):
# 讀取某一幀
ref,frame=capture.read()
# 格式轉變,BGRtoRGB
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
# 轉變成Image
frame = Image.fromarray(np.uint8(frame))
# 進行檢測
frame = np.array(retinanet.detect_image(frame))
# RGBtoBGR滿足opencv顯示格式
frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
cv2.imshow("video",frame)
c= cv2.waitKey(30) & 0xff
if c==27:
capture.release()
break
retinanet.close_session()
2020/4/26更新:FPS計算
很多小夥伴說到想要獲取FPS,於是給所有的目標檢測網絡加上了FPS的功能,需要的小夥伴請重新下載。
FPS記錄的原理
FPS簡單來理解就是圖像的刷新頻率,也就是每秒多少幀。
假設目標檢測網絡處理1幀要0.02s。
此時FPS就是50。
FPS實現代碼
該代碼以ssd爲例。
#-------------------------------------#
# 調用攝像頭檢測
#-------------------------------------#
from ssd import SSD
from PIL import Image
import numpy as np
import cv2
import time
ssd = SSD()
# 調用攝像頭
capture=cv2.VideoCapture(0) # capture=cv2.VideoCapture("1.mp4")
fps = 0.0
while(True):
t1 = time.time()
# 讀取某一幀
ref,frame=capture.read()
# 格式轉變,BGRtoRGB
frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
# 轉變成Image
frame = Image.fromarray(np.uint8(frame))
# 進行檢測
frame = np.array(ssd.detect_image(frame))
# RGBtoBGR滿足opencv顯示格式
frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)
fps = ( fps + (1./(time.time()-t1)) ) / 2
print("fps= %.2f"%(fps))
frame = cv2.putText(frame, "fps= %.2f"%(fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("video",frame)
c= cv2.waitKey(30) & 0xff
if c==27:
capture.release()
break