最近想做实时目标检测,需要用到python开启摄像头,我手上只有两个uvc免驱的摄像头,性能一般。利用python开启摄像头费了一番功夫,主要原因是我的摄像头都不能用cv2的VideCapture打开,这让我联想到原来opencv也打不开Android手机上的摄像头(后来采用QML的Camera模块实现的)。看来opencv对于摄像头的兼容性仍然不是很完善。
我尝了几种办法:v4l2,v4l2_capture以及simpleCV,都打不开。最后采用pygame实现了摄像头的采集功能,这里直接给大家分享具体实现代码(python3.6,cv2,opencv3.3,ubuntu16.04)。中间注释的部分是我上述方法打开摄像头的尝试,说不定有适合自己的。
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()
上述代码需要注意一个地方,就是pygame图片和opencv图片的转化(pygame_to_cvimage)有些地方采用cv.CreateImageHeader和SetData来实现,注意这两个函数在opencv3+后就消失了。因此采用numpy进行实现。
至于目标检测,由于现在网上有很多实现的方法,MobileNet等等。这里我不讲解具体原理,因为我的研究方向不是这个,这里直接把代码贴出来,亲测成功了。
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()
上面的实现需要用到两个文件,是caffe实现好的模型,我直接上传(文件名为MobileNetSSD_deploy.caffemodel和MobileNetSSD_deploy.prototxt,上google能够下载到)。
以上这篇python开启摄像头以及深度学习实现目标检测方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 第五街的士高《印度激情版》3CD [WAV+CUE][2.4G]
- 三国志8重制版哪个武将智力高 三国志8重制版智力武将排行一览
- 三国志8重制版哪个武将好 三国志8重制版武将排行一览
- 三国志8重制版武将图像怎么保存 三国志8重制版武将图像设置方法
- 何方.1990-我不是那种人【林杰唱片】【WAV+CUE】
- 张惠妹.1999-妹力新世纪2CD【丰华】【WAV+CUE】
- 邓丽欣.2006-FANTASY【金牌大风】【WAV+CUE】
- 饭制《黑神话》蜘蛛四妹手办
- 《燕云十六声》回应跑路:年内公测版本完成95%
- 网友发现国内版《双城之战》第二季有删减:亲亲环节没了!
- 邓丽君2024-《漫步人生路》头版限量编号MQA-UHQCD[WAV+CUE]
- SergeProkofievplaysProkofiev[Dutton][FLAC+CUE]
- 永恒英文金曲精选4《TheBestOfEverlastingFavouritesVol.4》[WAV+CUE]
- 群星《国风超有戏 第9期》[320K/MP3][13.63MB]
- 群星《国风超有戏 第9期》[FLAC/分轨][72.56MB]