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

本文介绍了如何使用Python和OpenCV实现工业环境中,通过摄像头定期拍照并保存,同时将这些图片应用于YOLO目标检测模型。步骤包括摄像头连接、固定间隔抓拍、结果保存与YOLO集成。适合对实时监控和模型训练感兴趣的开发者。
摘要由CSDN通过智能技术生成


前言

工业实时监测任务中,往往要获取摄像头,读取摄像头中的每一帧并检测。由于被检测物体放在传送带上,所以需要间隔一段时间拍照并检测,并且需要保留检测结果或保留目标图像用于模型训练。本文将介绍如何用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检测图片方法。

没有硬件条件,需要云服务的同学可以扫码看看:
请添加图片描述

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十小大

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值