相关疑难解决方法(0)

在python中保存openCV视频

我正在尝试保存视频,但它无法正常工作.我按照openCV文档中的说明进行操作.

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)


        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()

out.release()

cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

怎么了?

python opencv

33
推荐指数
8
解决办法
7万
查看次数

OpenCV 实时流视频捕获很慢。如何丢帧或与实时同步?

目标和问题

我想设置一个 opencv 系统来处理 HLS 流或 RMTP 流,但是,我遇到了一个关于降低的帧速率和累积延迟的奇怪问题。就好像视频离它应该在流中的位置越来越远。

我正在寻找一种方法来与实时源保持同步,即使这意味着丢帧。

当前方法

import cv2

cap = cv2.VideoCapture()
cap.open('https://videos3.earthcam.com/fecnetwork/9974.flv/chunklist_w1421640637.m3u8')

while (True):
    _, frame = cap.read()
    cv2.imshow("camCapture", frame)
    cv2.waitKey(1)
Run Code Online (Sandbox Code Playgroud)

我已经在 VLC 上验证了流的质量,它似乎在那里工作正常。

cv2速度

.

实际/预期速度

问题:

  • 我在这里做错了什么?
  • 为什么这么慢?
  • 如何将其同步到实时速度?

python video opencv video-capture video-streaming

18
推荐指数
2
解决办法
2万
查看次数

如何使用 OpenCV 捕获多个摄像头流?

我必须拼接从许多 (9) 台相机捕获的图像。最初,我尝试从 2 个相机以 15 FPS 的速率捕获帧。然后,我连接了 4 个摄像头(我还使用了外部供电的 USB 集线器来提供足够的电力)但我只能看到一个流。

为了测试,我使用了以下脚本:

import numpy as np
import cv2
import imutils

index = 0
arr = []
while True:
    cap = cv2.VideoCapture(index)

    if not cap.read()[0]:
        break
    else:
        arr.append(index)
    cap.release()
    index += 1

video_captures = [cv2.VideoCapture(idx) for idx in arr]

while True:
    # Capture frame-by-frame
    frames = []
    frames_preview = []

    for i in arr:
        # skip webcam capture
        if i == 1: continue
        ret, frame = video_captures[i].read()
        if ret:
            frames.append(frame) …
Run Code Online (Sandbox Code Playgroud)

python performance multithreading opencv video-streaming

12
推荐指数
1
解决办法
2万
查看次数

OpenCV-Python:如何从实时视频流中获取最新帧或跳过旧视频流.

我已经在Python中集成了一台带OpenCV的IP摄像头,以便从实时流中逐帧完成视频处理.我已经将相机FPS配置为1秒,这样我就可以在缓冲区中每秒获得1帧处理,但是我的算法需要4秒来处理每个帧,导致缓冲区中未处理帧的停滞,并且会随着时间的推移而不断增长导致指数延迟.为了解决这个问题,我创建了一个Thread,我在调用cv2.grab()API来清理缓冲区,它将指针移动到每个调用中的最新帧.在主线程中,我正在调用retrieve()方法,它给出了第一个Thread抓取的最后一帧.通过这种设计,帧停滞问题是固定的,并且指数延迟被消除,但仍然不能消除12-13秒的恒定延迟.我怀疑当cv2.retrieve()被调用时它没有获得最新的帧,而是来自最新帧的第4或第5帧.OpenCV中是否有任何API或任何其他设计模式来解决此问题,以便我可以获得最新的帧进行处理.

在此先感谢您的帮助.我真的很感激快速反应.

python opencv video-processing video-streaming ip-camera

10
推荐指数
1
解决办法
1495
查看次数

使用OpenCV VideoWriter将RTSP流存储为视频文件

我正在使用OpenCV开发Python模块,该模块连接到RTSP流以对视频执行一些预处理(主要是降低fps和分辨率),然后将其存储在文件系统中。

但是,即使尝试了几种编解码器,也正在寻找类似的发展……我总是以空虚的视频告终。我看过其他线程(cv :: VideoWriter产生不可读的视频),这可能很相似,但是是在C ++上开发的。

有人为此工作吗?我通常使用示例RTSP流作为参考,例如rtsp://freja.hiof.no:1935 / rtplive / definst /hessdalen03.stream,并且可以正确接收甚至观看来自VLC的流。

我已经看到很多线程讨论如何从RTSP流中捕获视频,或者如何与VideoWriters和VideoReaders类以及视频文件一起工作,但是几乎没有结合这两者的内容。

任何帮助将不胜感激:)谢谢!


编辑1:用于存储框架的示例代码。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import numpy

# Test frame.
width, height = 400, 300
width_2, height_2 = int(width / 2), int(height / 2)
frame = numpy.zeros((height, width, 3), numpy.uint8)
cv2.rectangle(frame, (0, 0), (width_2, height_2), (255, 0, 0), cv2.FILLED)
cv2.rectangle(frame, (width_2, height_2), (width, height), (0, 255, 0), cv2.FILLED)

frames = [frame for _ in range(100)]
fps = 25

# Define …
Run Code Online (Sandbox Code Playgroud)

python video opencv image-processing rtsp

7
推荐指数
1
解决办法
1159
查看次数

opencv 单个 h264 原始帧作为二进制字符串

在 python 中创建了一个 rtsp 客户端,它接收 h264 流并以二进制字符串形式返回单个 h264 原始帧。我正在尝试即时处理每个 h264 帧。

我尝试了几种方法来将此帧转换为 numpy 数组进行处理,但均未成功。

到目前为止,我知道 cv2.VideoCapture 只接受一个文件名作为它的参数,而不是一个框架,也不是一个 StringIO 对象(像指向缓冲区的指针的文件),但我需要将我的字符串传递给它。

我也尝试过类似的事情:

nparr = np.fromstring(frame_bin_str, np.uint8)
img_np = cv2.imdecode(nparr, cv2.CV_LOAD_IMAGE_COLOR)
Run Code Online (Sandbox Code Playgroud)

尝试了不同的标志。但也惨败。

在许多其他失败的尝试之后,我用完了想法。

总结一下我需要做的事情:我在一个变量中有一个 h264 原始帧,我需要为其创建一个 openvc 有效的 numpy 数组,或者以某种方式最终得到一个包含该单个帧的 VideoCapture 对象,以便我可以处理该帧。

任何指针将不胜感激。

希望这一切都有意义。

先感谢您

python opencv numpy h.264 mat

6
推荐指数
1
解决办法
3512
查看次数

使用python和OpenCV与VideoCapture洞察多个网络摄像头捕获

我正在尝试同时(或几乎同时)从多个网络摄像头捕获图像.我一直在玩OpenCV,使用VideoCapture和python编程.但有一些困惑,希望有人可以帮助解释事情......

首先,我尝试了VideoCapture(Markus Gritsch的工作在这里找到:http://videocapture.sourceforge.net/ ).这是一个非常容易使用的python插件.如果我只是想捕捉一个简单的图像.在大多数情况下,它工作得很好.

我的设置是在单个USB端口上的USB集线器中的2个便宜的网络摄像头和我的笔记本电脑的内置网络摄像头.

我已经阅读了有关在同一USB总线上使用相同型号网络摄像头以及它可能无法正常工作的所有内容等等,但我决定试一试.(我也有一些必须在之前安装过的名为"Cyber​​link YouCam"的photobooth程序.出于某种原因,这个程序"看起来"像OpenCV和VideoCapture的相机.

VideoCapture连接到每个摄像头并从中捕获,如下所示:

Cam0 = Device(devnum=0)
Cam0.saveSnapshot("filename0.jpg")
del Cam0
Cam1 = Device(devnum=1)
Cam1.saveSnapshot("filename1.jpg")
del Cam1
Run Code Online (Sandbox Code Playgroud)

使用VideoCapture和我描述的设置,我可以独立捕获我系统上的所有摄像头(共4个,包括YouCam ... 0 - 3)

问题是这个程序似乎无法同时连接到多个摄像头...如果我不关闭以前的摄像头实例,它只是冻结,我必须断开连接并重新连接第一个摄像头从USB重新获得访问权限.

这不起作用:

cam0 = Device(devnum=0)
cam1 = Device(devnum=1)
cam0.saveSnapshot("filename0.jpg")
cam1.saveSnapshot("filename1.jpg")
del cam0
del cam1
Run Code Online (Sandbox Code Playgroud)

Cam0将打开,但这就是它的结束.冻结.

VideoCapture的另一件事是,在廉价的网络摄像头上,有一个很大的延迟(差不多一秒),直到图片活着......为了成功捕获,我不得不做这样的事情:

Cam1 = Device(devnum=1)
Cam1.saveSnapshot("filename1.jpg") #gets the camera going and saves black image
time.sleep(.75) #delay
Cam1.saveSnapshot("filename1.jpg") #captures the image second time around
Run Code Online (Sandbox Code Playgroud)

有效地保存图像两次......

如果每个摄像机的图像相隔几毫秒,我就不会想到了

#open connection to cam, take image
#close connection to cam …
Run Code Online (Sandbox Code Playgroud)

python camera opencv image-capture video-capture

5
推荐指数
1
解决办法
8478
查看次数

如何使用openCV在Python中提高视频播放速度

我正在编写一个程序,在遇到栏杆的第一个像素的视频上画一条线,我的问题是视频播放缓慢。

在此处输入图片说明 屏幕截图,供您参考视频的外观。在录像过程中,摄像机移近了,但由于速度慢,我不得不等待几分钟才能看到变化,但是在拍摄时,摄像机每隔几秒钟就移动一次。

我认为问题是for循环在视频的每一帧上都起作用,但我不确定。

我可以采用什么解决方案来加快程序执行速度?

import cv2

cap = cv2.VideoCapture('video.mp4')

while(cap.isOpened()):

    ret, frame = cap.read()
    canny = cv2.Canny(frame, 85, 255)
    height, width = canny.shape

    first_black_array = []

    for x in range(width):
        first_black_pixel_found = 0
        for y in range(height):
            if first_black_pixel_found == 0:
                if canny[y,x] == 255:
                    first_black_array.append(height - y)
                    first_black_pixel_found = 1
                    cv2.line(frame,(x,y),(x,y),(0,255,0),1)

    cv2.imshow('frame',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

谢谢!

python performance opencv video-capture

5
推荐指数
1
解决办法
579
查看次数

使用 OpenCV cv2.VideoCapture 在 Python 中从 IP 摄像头流式传输视频

我正在尝试从 IP 摄像头获取 python 中的视频流,但出现错误。我正在使用 Pycharm IDE。

import cv2
scheme = '192.168.100.23'


host = scheme
cap = cv2.VideoCapture('http://admin:Ebmacs8485867@'+host+':81/web/admin.html')

while True:
    ret, frame = cap.read()

    # Place options to overlay on the video here.
    # I'll go over that later.

    cv2.imshow('Camera', frame)

    k = cv2.waitKey(0) & 0xFF
    if k == 27:  # esc key ends process
        cap.release()
        break
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)
import cv2
scheme = '192.168.100.23'


host = scheme
cap = cv2.VideoCapture('http://admin:Ebmacs8485867@'+host+':81/web/admin.html')

while True:
    ret, frame = cap.read()

    # Place options to overlay …
Run Code Online (Sandbox Code Playgroud)

python ip opencv rtsp video-streaming

5
推荐指数
1
解决办法
2万
查看次数

打开CV RTSP相机缓冲滞后

我很难理解为什么我无法从我的网络摄像机获得“实时”反馈。

似乎存在一个缓冲区,如果不被读取,它会导致帧堆积 - 由于我的代码的每次迭代都需要一些时间,因此会出现积压,最终导致实际发生的情况几乎变慢。

我发现下面的代码会触发一个线程来循环读取相机,以尝试避免这种情况。但现在我得到了大约 5 帧的“实时”提要,然后它停止并显示另外几帧的相同图像。

##camera class - this stops the RTSP feed getting caught in the buffer 

class Camera:

    def __init__(self, rtsp_link):

        #init last ready and last frame
        self.last_frame = None
        self.last_ready = None
        self.lock = Lock()

        #set capture decive
        capture = cv2.VideoCapture(rtsp_link,apiPreference=cv2.CAP_FFMPEG)

        #set thread to clear buffer
        thread = threading.Thread(target=self.rtsp_cam_buffer, args=(capture,), name="rtsp_read_thread")
        thread.daemon = True
        thread.start()

        #delay start of next step to avoid errors
        time.sleep(2)

    def rtsp_cam_buffer(self, capture):
        #loop forever 
        while True:
            with self.lock:           
                capture.grab()
                self.last_ready, …
Run Code Online (Sandbox Code Playgroud)

python opencv rtsp opencv3.0

2
推荐指数
1
解决办法
1万
查看次数