【Opencv工程开发所用类】VideoTracker 视频摄像头

简介: 【Opencv工程开发所用类】VideoTracker 视频摄像头

前言:


       普通播放视频的代码是有非常多劣势,  像这下面这个代码其实会出现非常多的问题,例如:容易内存泄漏;面对文件读取错误会导致整个程序崩盘;无法合成视频保存;无法显示当前帧数和视频总帧数等等。诶,反正就是不太好啦!


       所以我自己编写了一个可以处理异常,稳定的视频播放类,且可以读取视频、保存视频,播放当前帧,视频总帧数、Fps等等功能!

import numpy as np
import cv2
cap = capture = cv2.VideoCapture('C2.mp4')
while (cap.isOpened()):
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', gray)
    cv2.waitKey(1)
cap.release()
cv2.destroyAllWindows()


VideoTracker.py


# --time**2022.8.13
# --** worker:江子良
import cv2
import time
import torch
import warnings
import numpy as np
from PIL import Image
from loguru import logger
import os
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
class VideoTracker(object):
    def __init__(self, cam=-1, video_path='', save_path='', use_frame=[0, -1], display=True):
        self.display = display
        self.use_frame = use_frame
        self.video_path = video_path
        self.cam = cam
        if self.cam != -1:
            print("Using webcam :" + str(self.cam))
            self.vdo = cv2.VideoCapture(self.cam)
        else:
            print("Using video :" + str(self.video_path))
            self.vdo = cv2.VideoCapture()
        self.save_path = save_path
        self.frame_interval = 1
        self.use_cuda = True
        use_cuda = self.use_cuda and torch.cuda.is_available()
        if not use_cuda:
            warnings.warn("Running in cpu mode which maybe very slow!", UserWarning)
    def __enter__(self):
        if self.cam != -1:
            ret, frame = self.vdo.read()
            assert ret, "Error: Camera error"
            self.im_width = frame.shape[0]
            self.im_height = frame.shape[1]
            self.count_frame = int(-1)
        else:
            assert os.path.isfile(self.video_path), "Path error"
            self.vdo.open(self.video_path)
            self.im_width = int(self.vdo.get(cv2.CAP_PROP_FRAME_WIDTH))
            self.im_height = int(self.vdo.get(cv2.CAP_PROP_FRAME_HEIGHT))
            self.count_frame = int(self.vdo.get(cv2.CAP_PROP_FRAME_COUNT))
            assert self.vdo.isOpened()
        if self.save_path != '':
            os.makedirs(self.save_path, exist_ok=True)
            # path of saved video and results
            self.save_video_path = os.path.join(self.save_path, "results.avi")
            # create video writer
            fourcc = cv2.VideoWriter_fourcc(*'MJPG')
            self.writer = cv2.VideoWriter(self.save_video_path, fourcc, 24, (self.im_width, self.im_height))
            # logging
            logger.info("Save results to {}".format(self.save_path))
        return self
    def __exit__(self, exc_type, exc_value, exc_traceback):
        if exc_type:
            print(exc_type, exc_value, exc_traceback)
    def run(self):
        idx_frame = 0
        all_costTime = 0
        while self.vdo.grab():
            idx_frame += 1
            if idx_frame % self.frame_interval:
                continue
            if idx_frame < self.use_frame[0]:
                continue
            if idx_frame > self.use_frame[1] and self.use_frame[1] != -1:
                break
            start = time.time()
            ref, ori_im = self.vdo.retrieve()
            if ref is True:
                # start your code from here
                # -----------end-----------
                if self.display:
                    cv2.imshow("frame", ori_im)
                    if cv2.waitKey(1) & 0xFF == ord('q'):
                        break
                if self.save_path:
                    self.writer.write(ori_im)
                # logging
                end = time.time()
                all_costTime += end - start
                if self.display:
                    if self.cam != -1:
                        logger.info("frame schedule:<{}/-1> ({:.2f} ms), fps: {:.03f}"
                                .format(idx_frame, end - start, 1 / (end - start)))
                    else:
                        logger.info("frame schedule:<{}/{}> ({:.2f} ms), fps: {:.03f}"
                                .format(idx_frame, self.count_frame, end - start, 1 / (end - start)))
        logger.info("ALL_COST_TIME:{:.3f}s".format(all_costTime))


How to use?


#using camer
from VideoCapture import VideoTracker
if __name__ == '__main__':
    # select the camer you want to use
    with VideoTracker(cam=0) as vdo_trk:
        vdo_trk.run()
#using video
from VideoCapture import VideoTracker
if __name__ == '__main__':
    # select the video you want to use
    with VideoTracker(video_path='test.mp4',use_frame=[0, -1]) as vdo_trk:
        vdo_trk.run()
# save video

只需要在VideoTracker中设置参数save_path,save_path是要存放保存视频的位置,如:'datasets/out_video/'


【OUTPUT】

1dc618a0ed9580ce8bfa6facb208c08f.png

相关文章
|
3月前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
130 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
3月前
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
134 1
|
3月前
|
编解码 计算机视觉 Python
Opencv学习笔记(九):通过CV2将摄像头视频流保存为视频文件
使用OpenCV库通过CV2将摄像头视频流保存为视频文件,包括定义视频编码格式、设置保存路径、通过write写入视频文件,并提供了相应的Python代码示例。
172 0
|
5月前
|
计算机视觉 索引
OpenCv实时设置摄像头参数/获得摄像头参数值的方法论
这篇文章提供了一个OpenCV的实例教程,展示了如何使用`createTrackbar()`函数实时设置和获取摄像头参数值,如饱和度、Gamma和亮度,并通过回调函数在程序中连续修改这些参数。
|
3月前
|
缓存 监控 计算机视觉
视频监控笔记(三):opencv结合ffmpeg获取rtsp摄像头相关信息
本文介绍了如何使用OpenCV结合FFmpeg获取RTSP摄像头信息,包括网络架构、视频监控系统组成、以及如何读取和显示网络摄像头视频流。
96 1
|
3月前
|
计算机视觉 Python
python利用pyqt5和opencv打开电脑摄像头并进行拍照
本项目使用Python的PyQt5和OpenCV库实现了一个简单的摄像头应用。用户可以通过界面按钮打开或关闭摄像头,并实时预览视频流。点击“拍照”按钮可以捕捉当前画面并保存为图片文件。该应用适用于简单的图像采集和处理任务。
186 0
python利用pyqt5和opencv打开电脑摄像头并进行拍照
|
3月前
|
编解码 关系型数据库 计算机视觉
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
本文介绍了如何在OpenCV中通过使用cisco开源的openh264库来解决不支持H.264编码的问题,并提供了完整的代码示例。
196 0
Opencv学习笔记(十一):opencv通过mp4保存为H.264视频
|
5月前
|
计算机视觉 索引
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
本文介绍了解决OpenCV读取视频失败的错误,指出问题通常由视频路径错误或摄像头索引错误导致,并提供了相应的解决方法。
OpenCV读取视频失败<无可用信息,未为 opencv_world453.dll 加载任何符号> cv::VideoCapture
|
6月前
|
机器学习/深度学习 XML 计算机视觉
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它提供了大量的函数和工具,用于处理图像和视频数据。
|
7月前
|
机器学习/深度学习 算法 Ubuntu
十年OpenCV开发以后发布的作品 - OpenCV实验大师
十年OpenCV开发以后发布的作品 - OpenCV实验大师
63 2