烈日灼心

烈日灼心

0个粉丝

25

问答

9

专栏

42

资料

烈日灼心  发布于  2020-10-02 12:49:51
采纳率 0%
25个问答
5828

在python中利用opencv读取rtsp视频流时,延时大的问题

     

在python中利用opencv读取rtsp视频流时,延时大的问题,但在读取电脑本机摄像头时,延时就小很多,代码是相同的代码。

import threading, cv2
import time


class Stack:

    def __init__(self, stack_size):
        self.items = []
        self.stack_size = stack_size

    def is_empty(self):
        return len(self.items) == 0

    def pop(self):
        return self.items.pop()

    def peek(self):
        if not self.isEmpty():
            return self.items[len(self.items) - 1]

    def size(self):
        return len(self.items)

    def push(self, item):
        if self.size() >= self.stack_size:
            self.items.remove(self.items[0])
        self.items.append(item)

    def clear(self):
        self.items.clear()


def capture_thread(video_path, frame_buffer, lock):
    print("capture_thread start")
    vid = cv2.VideoCapture(video_path)
    print(vid.get(cv2.CAP_PROP_FPS))
    if not vid.isOpened():
        raise IOError("Couldn't open webcam or video")
    while True:
        return_value, frame = vid.read()
        if return_value is not True:
            break
        lock.acquire()
        start_time = time.time()
        print('图像存放时间:', start_time)
        frame_buffer.push([frame, start_time])
        print('存放后列表中有图像的张数:', frame_buffer.size())
        lock.release()
        cv2.waitKey(25)


def play_thread(frame_buffer, lock):
    print("detect_thread start")
    print("detect_thread frame_buffer size is", frame_buffer.size())

    while True:
        if frame_buffer.size() >= 1:
            lock.acquire()
            frame_list = frame_buffer.pop()
            frame = frame_list[0]
            end_time = time.time()
            frame_buffer.clear()
            print('图像取出时间:', end_time)
            print('取出后列表中有图像的张数:', frame_buffer.size())
            print('每张图像显示时间:', end_time - frame_list[1])
            lock.release()
            # TODO 算法
            cv2.imshow("result", frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break


# path = 'rtsp://admin:abcd1234@192.168.1.64'
path = 'rtsp://192.168.1.152/chn0'
# path=0
frame_buffer = Stack(3)
lock = threading.RLock()
t1 = threading.Thread(target=capture_thread, args=(path, frame_buffer, lock))
t1.start()
t2 = threading.Thread(target=play_thread, args=(frame_buffer, lock))
t2.start()
我来回答
回答0个
时间排序
认可量排序
易百纳技术社区暂无数据
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区