- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
情况:
我有一个连接到树莓派的 basler 相机,我正在尝试将它与 FFmpg 的馈送直播到我的 Windows PC 中的一个 tcp 端口,以监控相机前发生的事情。
有用的东西:
我设法在树莓派上设置了一个 python 脚本,该脚本负责记录帧,将它们馈送到管道并将它们流式传输到 tcp 端口。从那个端口,我可以使用 FFplay 显示流。
我的问题:
如果您前进的方向正确,FFplay 非常适合快速轻松地测试,但我想从流中“读取”每一帧,进行一些处理,然后使用 opencv 显示流。那,我还做不到。
最少代表,这是我在树莓派方面使用的代码:
command = ['ffmpeg',
'-y',
'-i', '-',
'-an',
'-c:v', 'mpeg4',
'-r', '50',
'-f', 'rtsp',
'-rtsp_transport',
'tcp','rtsp://192.168.1.xxxx:5555/live.sdp']
p = subprocess.Popen(command, stdin=subprocess.PIPE)
while camera.IsGrabbing(): # send images as stream until Ctrl-C
grabResult = camera.RetrieveResult(100, pylon.TimeoutHandling_ThrowException)
if grabResult.GrabSucceeded():
image = grabResult.Array
image = resize_compress(image)
p.stdin.write(image)
grabResult.Release()
在我的电脑上,如果我在终端上使用以下 FFplay 命令,它可以工作并实时显示流:
ffplay -rtsp_flags listen rtsp://192.168.1.xxxx:5555/live.sdp?tcp
在我的 PC 上,如果我使用以下 python 脚本,则流开始,但在
cv2.imshow
中失败功能,因为我不知道如何解码它:
import subprocess
import cv2
command = ['C:/ffmpeg/bin/ffmpeg.exe',
'-rtsp_flags', 'listen',
'-i', 'rtsp://192.168.1.xxxx:5555/live.sdp?tcp?',
'-']
p1 = subprocess.Popen(command, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
while True:
frame = p1.stdout.read()
cv2.imshow('image', frame)
cv2.waitKey(1)
有谁知道我需要在其中任何一个脚本中更改什么才能让我工作?
最佳答案
您可以从 p1.stdout
读取解码帧,将其转换为 NumPy 数组,并对其进行整形。
command
获取 rawvideo
中的解码帧格式和 BGR 像素格式: command = ['C:/ffmpeg/bin/ffmpeg.exe',
'-rtsp_flags', 'listen',
'-i', 'rtsp://192.168.1.xxxx:5555/live.sdp?tcp?',
'-f', 'image2pipe', # Use image2pipe demuxer
'-pix_fmt', 'bgr24', # Set BGR pixel format
'-vcodec', 'rawvideo', # Get rawvideo output format.
'-']
p1.stdout
读取原始视频帧: raw_frame = p1.stdout.read(width*height*3)
frame = np.fromstring(raw_frame, np.uint8)
frame = frame.reshape((height, width, 3))
cv2.imshow('image', frame)
.
width
和
height
)。
width
的部分和
height
使用
cv2.VideoCapture
,但我不确定它是否适用于您的情况(由于
'-rtsp_flags', 'listen'
。(如果确实有效,您可以尝试使用 OpenCV 而不是 FFmpeg 进行捕获)。
import cv2
import numpy as np
import subprocess
# Use public RTSP Stream for testing
in_stream = 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov'
if False:
# Read video width, height and framerate using OpenCV (use it if you don't know the size of the video frames).
# Use public RTSP Streaming for testing:
cap = cv2.VideoCapture(in_stream)
framerate = cap.get(5) #frame rate
# Get resolution of input video
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Release VideoCapture - it was used just for getting video resolution
cap.release()
else:
# Set the size here, if video frame size is known
width = 240
height = 160
command = ['C:/ffmpeg/bin/ffmpeg.exe',
#'-rtsp_flags', 'listen', # The "listening" feature is not working (probably because the stream is from the web)
'-rtsp_transport', 'tcp', # Force TCP (for testing)
'-max_delay', '30000000', # 30 seconds (sometimes needed because the stream is from the web).
'-i', in_stream,
'-f', 'image2pipe',
'-pix_fmt', 'bgr24',
'-vcodec', 'rawvideo', '-an', '-']
# Open sub-process that gets in_stream as input and uses stdout as an output PIPE.
p1 = subprocess.Popen(command, stdout=subprocess.PIPE)
while True:
# read width*height*3 bytes from stdout (1 frame)
raw_frame = p1.stdout.read(width*height*3)
if len(raw_frame) != (width*height*3):
print('Error reading frame!!!') # Break the loop in case of an error (too few bytes were read).
break
# Convert the bytes read into a NumPy array, and reshape it to video frame dimensions
frame = np.fromstring(raw_frame, np.uint8)
frame = frame.reshape((height, width, 3))
# Show video frame
cv2.imshow('image', frame)
cv2.waitKey(1)
# Wait one more second and terminate the sub-process
try:
p1.wait(1)
except (sp.TimeoutExpired):
p1.terminate()
cv2.destroyAllWindows()
示例框架(只是为了好玩):
width
的代码示例和
height
使用 FFprobe:
import subprocess
import json
# Use public RTSP Stream for testing
in_stream = 'rtsp://wowzaec2demo.streamlock.net/vod/mp4:BigBuckBunny_115k.mov'
probe_command = ['C:/ffmpeg/bin/ffprobe.exe',
'-loglevel', 'error',
'-rtsp_transport', 'tcp', # Force TCP (for testing)]
'-select_streams', 'v:0', # Select only video stream 0.
'-show_entries', 'stream=width,height', # Select only width and height entries
'-of', 'json', # Get output in JSON format
in_stream]
# Read video width, height using FFprobe:
p0 = subprocess.Popen(probe_command, stdout=subprocess.PIPE)
probe_str = p0.communicate()[0] # Reading content of p0.stdout (output of FFprobe) as string
p0.wait()
probe_dct = json.loads(probe_str) # Convert string from JSON format to dictonary.
# Get width and height from the dictonary
width = probe_dct['streams'][0]['width']
height = probe_dct['streams'][0]['height']
关于python - 使用 FFmpeg、python 和 opencv 显示流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66332694/
我正在尝试从我的系统中完全删除 opencv。我试图学习 ROS,而在教程中我遇到了一个问题。创建空工作区后,我调用catkin_make 它给出了一个常见错误,我在 answers.ros 中搜索并
我在尝试逐步转移对warpAffine的调用时遇到崩溃(不是异常): void rotateImage( const Mat& source, double degree, Mat& output )
如何处理opencv gpu异常?是否有用于opencvgpu异常处理的特定错误代码集api? 我尝试了很多搜索,但只有1个错误代码,即CV_GpuNotSupported。 请帮帮我。 最佳答案 虽
笔记 我是 OpenCV(或计算机视觉)的新手,所以告诉我搜索查询会很有帮助! 我想问什么 我想编写一个从图片中提取名片的程序。 我能够提取粗略的轮廓,但反射光会变成噪点,我无法提取准确的轮廓。请告诉
我想根据像素的某个阈值将Mono16类型的Mat转换为二进制图像。我尝试使用以下内容: 阈值(img,ret,0.1,1,CV_THRESH_BINARY); 尝试编译时,出现make错误,提示: 错
我对使用GPU加速的OpenCV中的卷积函数有疑问。 使用GPU的卷积速度大约快3.5 运行时: convolve(src_32F, kernel, cresult, false, cbuffer);
我正在尝试使用非对称圆圈网格执行相机校准。 我通常找不到适合CirclesGridFinder的文档,尤其是findHoles()函数的文档。 如果您有关于此功能如何工作以及其参数含义的信息,将不胜感
在计算机上绘图和在 OpenCV 的投影仪上投影之间有什么区别吗? 一种选择是投影显示所有内容的计算机屏幕。但也许也有这样的选择,即在投影仪上精确地绘制和投影图像,仅使用计算机作为计算机器。如果我能做
我将Processing(processing.org)用于需要人脸跟踪的项目。现在的问题是由于for循环,程序将耗尽内存。我想停止循环或至少解决内存不足的问题。这是代码。 import hyperm
我有下面的代码: // Image Processing.cpp : Defines the entry point for the console application. // //Save
我正在为某些项目使用opencv。并有应解决的任务。 任务很简单。我有一张主图片,并且有一个模板,而不是将主图片与模板进行比较。我使用matchTemplate()函数。我只是好奇一下。 在文档中,我
我正在尝试使用以下命令创建级联分类器: haartraining -data haarcascade -vec samples.vec -bg negatives.dat -nstages 20 -n
我试图使用OpenCV检测黑色图像中一组形状的颜色,为此我使用了Canny检测。但是,颜色输出总是返回为黑色。 std::vector > Asteroids::DetectPoints(const
我正在尝试使用OpenCv 2.4.5从边缘查找渐变方向,但是我在使用cvSobel()时遇到问题,以下是错误消息和我的代码。我在某处读到它可能是由于浮点(??)之间的转换,但我不知道如何解决它。有帮
我正在尝试构建循环关闭算法,但是在开始开发之前,我想测试哪种功能描述符在真实数据集上效果更好。 我有两个在两个方向拍摄的走廊图像,一个进入房间,另一个离开同一个房间。因此它们代表相同的场景,但具有2个
有没有一种方法可以比较直方图,但例如要排除白色,因此白色不会影响比较。 最佳答案 白色像素有 饱和度 , S = 0 .因此,在创建直方图时很容易从计数中删除白色像素。请执行下列操作: 从 BGR 转
就像本主题的标题一样,如何在OpenCV中确定图像的特定像素(灰度或彩色)是否饱和(例如,亮度过高)? 先感谢您。 最佳答案 根据定义,饱和像素是指与强度(即灰度值或颜色分量之一)等于255相关联的像
我是OpenCV的新用户,正在从事大学项目。程序会获取输入图像,对其进行综合模糊处理,然后对其进行模糊处理。当对合成模糊图像进行反卷积时,会生成边界伪像,因为...好吧,到目前为止,我还没有实现边界条
我想知道OpenCV是haar特征还是lbp是在多尺度搜索过程中缩放图像还是像论文中提到的那样缩放特征本身? 编辑:事实证明,检测器可以缩放图像,而不是功能。有人知道为什么吗?通过缩放功能可以更快。
我在openCv中使用SVM.train命令(已定义了适当的参数)。接下来,我要使用我的算法进行分类,而不是使用svm.predict。 可能吗?我可以访问训练时生成的支持 vector 吗?如果是这
我是一名优秀的程序员,十分优秀!