Python+OpenCV调用摄像头固定间隔时间拍照并保存到本地同时应用到YOLO中检测目标

文章目录

  • 前言
  • 获取摄像头
  • 固定间隔拍照并保存到本地
  • 应用到YOLO中
  • 总结


前言

工业实时监测任务中,往往要获取摄像头,读取摄像头中的每一帧并检测。由于被检测物体放在传送带上,所以需要间隔一段时间拍照并检测,并且需要保留检测结果或保留目标图像用于模型训练。本文将介绍如何用python+opencv获取摄像头并间隔某段时间拍照获取目标或检测结果同时保存在本地,并将其应用到YOLO中。


获取摄像头

import cv2

capture = cv2.VideoCapture(0)

其中参数0表示获取笔记本自带摄像头。当有多个摄像头可用时,1表示获取外接摄像头。若笔记本没有自带摄像头而有一个外接摄像头,则参数为0。(笔者的Y7000p就是这样。。。)

capture = cv2.VideoCapture("1.mp4")

也可以传入视频路径获取视频


固定间隔拍照并保存到本地

#判断摄像头是否可用
#若可用,则获取视频返回值ref和每一帧返回值frame
if capture.isOpened():
    ref, frame = capture.read()
else:
    ref = False
    
#间隔帧数
timeF = 10

c = 1
while ref:
	ref,frame=capture.read()
	
	#每隔timeF获取一张图片并保存到指定目录
	#"D:/photo/"根据自己的目录修改
    if (c % timeF == 0):
        cv2.imwrite("D:/photo/" + str(c) + '.jpg', frame)
    c += 1
    
    #1毫秒刷新一次
    k = cv2.waitKey(1)

	#按q退出
	#if k==27:则为按ESC退出
    if k == ord('q'):
  		capture.release()
        break
    

应用到YOLO中

完整代码如下:修改YOLO中的video.py文件

import time
import cv2
import numpy as np
from PIL import Image

from yolo import YOLO
yolo = YOLO()


capture = cv2.VideoCapture(0)
#capture=cv2.VideoCapture("D:/1.mp4")

if capture.isOpened():
    ref, frame = capture.read()
else:
    ref = False

fps = 0.0

timeF = 10

c=1
while ref:
    t1 = time.time()
    # 读取某一帧
    ref,frame=capture.read()

    #此处保存图片无检测结果,用于采集训练数据和测试摄像头是否清晰稳定
    #if (c % timeF == 0):
    #    cv2.imwrite("D:/photo/" + str(c) + '.jpg', frame)
    #c += 1

    # 格式转变,BGRtoRGB
    frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
    # 转变成Image
    frame = Image.fromarray(np.uint8(frame))
    # 进行检测
    frame = np.array(yolo.detect_image(frame))
    # RGBtoBGR满足opencv显示格式
    frame = cv2.cvtColor(frame,cv2.COLOR_RGB2BGR)

    #此处保存的图片有检测结果,用于保留检测结果
    if (c % timeF == 0):
        cv2.imwrite("D:/photo/" + str(c) + '.jpg', frame)
    c += 1

    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)

    #此处保存的图片上既有检测结果,也有fps值,用于监测不同fps下的检测结果
    #if (c % timeF == 0):
    #    cv2.imwrite("D:/photo/" + str(c) + '.jpg', frame)
    #c += 1
    
    #显示摄像头
    cv2.imshow("video",frame)
    k = cv2.waitKey(1)

	#按q退出
    if k == ord('q'):
    	capture.release()
        break
    
    #按ESC退出
    #k =cv2.waitKey(1)
    #if k==27:
    #    capture.release()
    #    break


总结

  1. 一般动画是每秒24帧(也可根据摄像头的fps反算),工业上需要根据传送带的速度来计算。读者可自行改变timeF从而改变间隔时间。
  2. 不加cv2.waitKey()弹出的视频窗口会卡死。
  3. 与video.py在同一目录下的yolo.py文件中包含yolo类和detect_image检测图片方法。

你可能感兴趣的:(小技巧汇总专栏,python,opencv,计算机视觉,人工智能,经验分享)