python開(kāi)啟攝像頭以及深度學(xué)習(xí)實(shí)現(xiàn)目標(biāo)檢測(cè)方法
最近想做實(shí)時(shí)目標(biāo)檢測(cè),需要用到python開(kāi)啟攝像頭,我手上只有兩個(gè)uvc免驅(qū)的攝像頭,性能一般。利用python開(kāi)啟攝像頭費(fèi)了一番功夫,主要原因是我的攝像頭都不能用cv2的VideCapture打開(kāi),這讓我聯(lián)想到原來(lái)opencv也打不開(kāi)Android手機(jī)上的攝像頭(后來(lái)采用QML的Camera模塊實(shí)現(xiàn)的)。看來(lái)opencv對(duì)于攝像頭的兼容性仍然不是很完善。
我嘗了幾種辦法:v4l2,v4l2_capture以及simpleCV,都打不開(kāi)。最后采用pygame實(shí)現(xiàn)了攝像頭的采集功能,這里直接給大家分享具體實(shí)現(xiàn)代碼(python3.6,cv2,opencv3.3,ubuntu16.04)。中間注釋的部分是我上述方法打開(kāi)攝像頭的嘗試,說(shuō)不定有適合自己的。
import pygame.camera
import time
import pygame
import cv2
import numpy as np
def surface_to_string(surface):
"""convert pygame surface into string"""
return pygame.image.tostring(surface, 'RGB')
def pygame_to_cvimage(surface):
"""conver pygame surface into cvimage"""
#cv_image = np.zeros(surface.get_size, np.uint8, 3)
image_string = surface_to_string(surface)
image_np = np.fromstring(image_string, np.uint8).reshape(480, 640, 3)
frame = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)
return image_np, frame
pygame.camera.init()
pygame.camera.list_cameras()
cam = pygame.camera.Camera("/dev/video0", [640, 480])
cam.start()
time.sleep(0.1)
screen = pygame.display.set_mode([640, 480])
while True:
image = cam.get_image()
cv_image, frame = pygame_to_cvimage(image)
screen.fill([0, 0, 0])
screen.blit(image, (0, 0))
pygame.display.update()
cv2.imshow('frame', frame)
key = cv2.waitKey(1)
if key & 0xFF == ord('q'):
break
#pygame.image.save(image, "pygame1.jpg")
cam.stop()
上述代碼需要注意一個(gè)地方,就是pygame圖片和opencv圖片的轉(zhuǎn)化(pygame_to_cvimage)有些地方采用cv.CreateImageHeader和SetData來(lái)實(shí)現(xiàn),注意這兩個(gè)函數(shù)在opencv3+后就消失了。因此采用numpy進(jìn)行實(shí)現(xiàn)。
至于目標(biāo)檢測(cè),由于現(xiàn)在網(wǎng)上有很多實(shí)現(xiàn)的方法,MobileNet等等。這里我不講解具體原理,因?yàn)槲业难芯糠较虿皇沁@個(gè),這里直接把代碼貼出來(lái),親測(cè)成功了。
from imutils.video import FPS
import argparse
import imutils
import v4l2
import fcntl
import v4l2capture
import select
import image
import pygame.camera
import pygame
import cv2
import numpy as np
import time
def surface_to_string(surface):
"""convert pygame surface into string"""
return pygame.image.tostring(surface, 'RGB')
def pygame_to_cvimage(surface):
"""conver pygame surface into cvimage"""
#cv_image = np.zeros(surface.get_size, np.uint8, 3)
image_string = surface_to_string(surface)
image_np = np.fromstring(image_string, np.uint8).reshape(480, 640, 3)
frame = cv2.cvtColor(image_np, cv2.COLOR_BGR2RGB)
return frame
ap = argparse.ArgumentParser()
ap.add_argument("-p", "--prototxt", required=True, help="path to caffe deploy prototxt file")
ap.add_argument("-m", "--model", required=True, help="path to caffe pretrained model")
ap.add_argument("-c", "--confidence", type=float, default=0.2, help="minimum probability to filter weak detection")
args = vars(ap.parse_args())
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair", "cow",
"diningtable", "dog", "horse", "motorbike", "person", "pottedplant", "sheep", "sofa", "train", "tvmonitor"]
COLORS = np.random.uniform(0, 255, size=(len(CLASSES), 3))
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])
print("[INFO] starting video stream ...")
###### opencv ########
#vs = VideoStream(src=1).start()
#
#camera = cv2.VideoCapture(0)
#if not camera.isOpened():
# print("camera is not open")
#time.sleep(2.0)
###### v4l2 ########
#vd = open('/dev/video0', 'r')
#cp = v4l2.v4l2_capability()
#fcntl.ioctl(vd, v4l2.VIDIOC_QUERYCAP, cp)
#cp.driver
##### v4l2_capture
#video = v4l2capture.Video_device("/dev/video0")
#size_x, size_y = video.set_format(640, 480, fourcc= 'MJPEG')
#video.create_buffers(30)
#video.queue_all_buffers()
#video.start()
##### pygame ####
pygame.camera.init()
pygame.camera.list_cameras()
cam = pygame.camera.Camera("/dev/video0", [640, 480])
cam.start()
time.sleep(1)
fps = FPS().start()
while True:
#try:
# frame = vs.read()
#except:
# print("camera is not opened")
#frame = imutils.resize(frame, width=400)
#(h, w) = frame.shape[:2]
#grabbed, frame = camera.read()
#if not grabbed:
# break
#select.select((video,), (), ())
#frame = video.read_and_queue()
#npfs = np.frombuffer(frame, dtype=np.uint8)
#print(len(npfs))
#frame = cv2.imdecode(npfs, cv2.IMREAD_COLOR)
image = cam.get_image()
frame = pygame_to_cvimage(image)
frame = imutils.resize(frame, width=640)
blob = cv2.dnn.blobFromImage(frame, 0.00783, (640, 480), 127.5)
net.setInput(blob)
detections = net.forward()
for i in np.arange(0, detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > args["confidence"]:
idx = int(detections[0, 0, i, 1])
box = detections[0, 0, i, 3:7]*np.array([640, 480, 640, 480])
(startX, startY, endX, endY) = box.astype("int")
label = "{}:{:.2f}%".format(CLASSES[idx], confidence*100)
cv2.rectangle(frame, (startX, startY), (endX, endY), COLORS[idx], 2)
y = startY - 15 if startY - 15 > 15 else startY + 15
cv2.putText(frame, label, (startX, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, COLORS[idx], 2)
cv2.imshow("Frame", frame)
key = cv2.waitKey(1)& 0xFF
if key ==ord("q"):
break
fps.stop()
print("[INFO] elapsed time :{:.2f}".format(fps.elapsed()))
print("[INFO] approx. FPS :{:.2f}".format(fps.fps()))
cv2.destroyAllWindows()
#vs.stop()
上面的實(shí)現(xiàn)需要用到兩個(gè)文件,是caffe實(shí)現(xiàn)好的模型,我直接上傳(文件名為MobileNetSSD_deploy.caffemodel和MobileNetSSD_deploy.prototxt,上google能夠下載到)。
以上這篇python開(kāi)啟攝像頭以及深度學(xué)習(xí)實(shí)現(xiàn)目標(biāo)檢測(cè)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python把數(shù)組中的數(shù)字每行打印3個(gè)并保存在文檔中的方法
今天小編就為大家分享一篇python把數(shù)組中的數(shù)字每行打印3個(gè)并保存在文檔中的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
python中import,from……import的使用詳解
這篇文章主要介紹了python中import,from……import的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02
python模擬登陸,用session維持回話的實(shí)例
今天小編就為大家分享一篇python模擬登陸,用session維持回話的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
教你利用Selenium+python自動(dòng)化來(lái)解決pip使用異常
今天帶大家來(lái)學(xué)習(xí)怎么利用Selenium+python自動(dòng)化解決pip使用異常,文中介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)python的小伙伴們有很大的幫助,需要的朋友可以參考下2021-05-05
淺析Python中的getattr(),setattr(),delattr(),hasattr()
這篇文章主要介紹了Python中的getattr(),setattr(),delattr(),hasattr() 的相關(guān)資料,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06
python基礎(chǔ)篇之pandas常用基本函數(shù)匯總
Pandas是一個(gè)python數(shù)據(jù)分析庫(kù),它提供了許多函數(shù)和方法來(lái)加快數(shù)據(jù)分析過(guò)程,下面這篇文章主要給大家介紹了關(guān)于python基礎(chǔ)篇之pandas常用基本函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-07-07

