我想设置一个 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 上验证了流的质量,它似乎在那里工作正常。
.
我必须拼接从许多 (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) 我必须使用包含在各个目录中的大量 jpeg 图像创建低分辨率 AVI 视频。我有将近一百个目录,每个目录可能包含数千个图像。
为了自动化这个过程,我使用 OpenCV 编写了一个 python 脚本来创建一个视频对象,从给定目录加载每个图像,并将每个图像写入该目录的特定视频文件。所有这些都很好用。我的问题是如何控制视频对象的压缩质量。
VideoWriter 模块接受 5 个参数。第二个参数“fourcc”设置压缩代码。
cv2.VideoWriter.open(文件名,fourcc,fps,frameSize[,isColor])
我们可以使用“四字符代码”(即fourcc)在cv2.VideoWriter 中指定压缩代码。
Fourcc = cv2.cv.CV_FOURCC('M','S','V','C') #Microspoft Video 1
这种方法有效,只是视频对象的压缩质量始终设置为最大值。
如果我们让fourcc = -1,则会打开一个Windows 视频压缩对话框,允许用户选择视频压缩并在0 到100 之间设置压缩质量(或时间质量比)。
每个视频必须是 AVI,并且必须满足特定的文件大小要求。如果使用最大压缩质量,则视频文件太大。然而,要求用户为每个视频选择视频压缩和压缩质量会破坏脚本的自动化。
那么,如何在不使用 Windows 视频压缩对话框的情况下指定视频对象的压缩质量?
我的整个代码发布在下面
import cv2, os
Workspace = "J:\jpg to AVI test"
year = "2014"
file_extension = "avi"
Image_file_dir = Workspace + "\\12 - ECD-BONNETT CREEK Y INT (" + year + ")"
print Image_file_dir
Image_file_list = os.listdir(Image_file_dir)
print "Image_file_list: " + str(Image_file_list)
img_cnt = 0
for …Run Code Online (Sandbox Code Playgroud) 我在 RasbpberryPI 3 上运行了简单的 python 脚本。这个脚本负责使用 MJPEG 打开视频设备和流数据 (800x600) 到 HTTP 端点。当我收到这个流时,我的一个 rasbpberrypi 核心 100% 工作。可以使用多线程运行 OpenCV 吗?
这是我的代码
import cv2
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import time
import argparse
import socket as Socket
camera = None
def setUpCameraCV():
global camera
camera = cv2.VideoCapture(0)
class mjpgServer(BaseHTTPRequestHandler):
ip = None
hostname = None
def do_GET(self):
print('connection from:', self.address_string())
if self.ip is None or self.hostname is None:
self.ip, _ = 0.0.0.0
self.hostname = Socket.gethostname()
if self.path == '/mjpg':
self.send_response(200)
self.send_header('Cache-Control', 'no-cache')
self.send_header('Pragma', …Run Code Online (Sandbox Code Playgroud) 我正在使用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) 我正在尝试同时(或几乎同时)从多个网络摄像头捕获图像.我一直在玩OpenCV,使用VideoCapture和python编程.但有一些困惑,希望有人可以帮助解释事情......
首先,我尝试了VideoCapture(Markus Gritsch的工作在这里找到:http://videocapture.sourceforge.net/ ).这是一个非常容易使用的python插件.如果我只是想捕捉一个简单的图像.在大多数情况下,它工作得很好.
我的设置是在单个USB端口上的USB集线器中的2个便宜的网络摄像头和我的笔记本电脑的内置网络摄像头.
我已经阅读了有关在同一USB总线上使用相同型号网络摄像头以及它可能无法正常工作的所有内容等等,但我决定试一试.(我也有一些必须在之前安装过的名为"Cyberlink 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) 我正在尝试从 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) opencv ×7
python ×7
performance ×2
rtsp ×2
video ×2
avi ×1
camera ×1
compression ×1
fourcc ×1
ip ×1
raspberry-pi ×1