- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据这个article的回答这是指将单个图像组合成4面的方式。从那里开始,我想从仅使用单个视频更改为使用 4 个视频作为输入。
这是我的代码,它使用单个视频作为输入
import cv2
import numpy as np
def make4side(image, scale=0.5):
# image = cv2.imread(image)
h = int((scale*image.shape[0])) #height
w = int((scale*image.shape[1])) #width
image = cv2.resize(image, (w,h ), interpolation = cv2.INTER_AREA) #shrink image to half
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")
# top
output[0:h, h:h+w] = image
# left >> rotate 90
output[h:h+w, 0:h] = np.rot90(image,1)
# right >> rotate 270
output[h:h + w, h + w:h +w +h] = np.rot90(image,3)
# bottom >> rotate 180
output[h+w:h+w+h, h:h+w] = np.rot90(image,2)
return output
#cv2.imwrite('test.jpg', output)
def process(video):
cap = cv2.VideoCapture(video)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
holo = None
ret = False
while(not ret):
ret, frame = cap.read()
if ret:
frame = cv2.resize(frame, (640, 480), interpolation = cv2.INTER_AREA)
holo = make4side(frame)
out = cv2.VideoWriter('hologram640x480.avi',fourcc, 23.98, (holo.shape[0],holo.shape[1]))
total_frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
count = 0
print("Processing %d frames"%(total_frames))
while(True):
# Capture frame-by-frame
ret, frame = cap.read()
if ret:
frame = cv2.resize(frame, (640, 480), interpolation = cv2.INTER_AREA)
holo = make4side(frame)
out.write(holo)
count += 1
print("Total:%d of %d"%(count,total_frames))
if(count>=total_frames-1):
break
cap.release()
out.release()
return
process('g.mov')
结果是这样的
在这段代码中,整个帧的高度和宽度仅基于我也关注的单个视频的输入,因为我使用了 4 个视频,当然帧分辨率不相同(但都是横向的) ).函数 make4side() 中的变量 h 和 w 是帮助定位每个小框架的主要部分。那么对于这种情况,大帧(可变输出)分辨率应该是多少?
我必须读取 4 个视频并将其写入一个,因此我如何使用 VideoCapture 对象来实现此目的
为了明确我的问题,我想要一个由 4 个输入视频组成的视频,每个视频都将放置在每个位置(顶部、底部、左侧和右侧)。我的大帧分辨率有问题,如果我有 4 个视频而不是一个,我不知道该用什么。另一个问题是关于 VideoCapture 对象。如何同时读取所有视频的帧或以任何其他方式执行此操作?
谢谢
这些不是我将要使用的真实帧,而只是我将要用于我的视频的简单想法。另一件事,输入文件可能不具有相同的分辨率。我如何使用多个视频捕获对象来读取它们中的每一个并将其放置在大框架的每一侧以编写单个视频
最佳答案
所以一切都取决于你想做什么,所以它会取决于你要处理什么类型的图像。首先,您始终可以拥有 4 个 VideoCapture 类实例,每个实例都加载一个新视频,例如:
videoTop = cv2.VideoCapture(videoTopFileName)
videoLeft = cv2.VideoCapture(videoLeftFileName)
videoRight = cv2.VideoCapture(videoRightFileName)
videoBottom = cv2.VideoCapture(videoBottomFileName)
readCorrect = True
while( readCorrect ):
readCorrect , topFrame = videoTop.read()
ret, leftFrame = videoLeft.read()
readCorrect = readCorrect and ret
ret, rightFrame = videoRight.read()
readCorrect = readCorrect and ret
ret, bottomFrame = videoBottom.read()
readCorrect = readCorrect and ret
if readCorrect :
holo = make4side(topFrame, leftFrame, rightFrame, bottomFrame )
您可以在此循环中将图像保存在 VideoWriter 中。
现在到了棘手的部分,你的图片大小不一样......你可以这样做:
import cv2
import numpy as np
# load images, in your case frames from videos
top = cv2.imread("D:\\testing\\1.jpg")
left = cv2.imread("D:\\testing\\2.jpg")
bottom = cv2.imread("D:\\testing\\3.jpg")
right = cv2.imread("D:\\testing\\4.jpg")
targetSize = (200,200)
h = targetSize[1] #height
w = targetSize[0] #width
top = cv2.resize(top, targetSize )
left = cv2.resize(left, targetSize )
bottom = cv2.resize(bottom, targetSize )
right = cv2.resize(right, targetSize )
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")
# top
output[0:h, h:h+w] = top
# left >> rotate 90
output[h:h+w, 0:h] = np.rot90(left,1)
# right >> rotate 270
output[h:h + w, h + w:h +w +h] = np.rot90(bottom,3)
# bottom >> rotate 180
output[h+w:h+w+h, h:h+w] = np.rot90(right,2)
cv2.imshow("frame", output )
cv2.waitKey(0)import cv2
import numpy as np
# load images, in your case frames from videos
top = cv2.imread("D:\\testing\\1.jpg")
left = cv2.imread("D:\\testing\\2.jpg")
bottom = cv2.imread("D:\\testing\\3.jpg")
right = cv2.imread("D:\\testing\\4.jpg")
targetSize = (200,200)
h = targetSize[1] #height
w = targetSize[0] #width
top = cv2.resize(top, targetSize )
left = cv2.resize(left, targetSize )
bottom = cv2.resize(bottom, targetSize )
right = cv2.resize(right, targetSize )
output = np.zeros((w+h+h , w + h + h, 3), dtype="uint8")
# top
output[0:h, h:h+w] = top
# left >> rotate 90
output[h:h+w, 0:h] = np.rot90(left,1)
# right >> rotate 270
output[h:h + w, h + w:h +w +h] = np.rot90(bottom,3)
# bottom >> rotate 180
output[h+w:h+w+h, h:h+w] = np.rot90(right,2)
cv2.imshow("frame", output )
cv2.waitKey(0)
但这会生成像这样的“坏”图像:
为了使其不变形,您应该找到宽高比并尝试调整它们的大小。如果纵横比不同,则必须填充图像。这是取决于您的任务的部分,您可以裁剪图像或填充图像。
但基本上这是应该做的。希望对您有所帮助。
更新:
只是为了澄清循环部分:
readCorrect , topFrame = videoTop.read()
ret, leftFrame = videoLeft.read()
readCorrect = readCorrect and ret
在第一行中,我将 read
返回的 bool 值分配给了 readCorrect
变量。然后在下一张图片中,我分配给 ret
并用之前的结果做一个逻辑 and
。这样您就可以知道是否所有这些都是真的,或者是否有任何一个是假的。
我还纠正了循环中的一些错误(我输入 while not readCorrect 并且应该没有 not)。
在循环之前还有一件事你应该创建 VideoWriter 对象,你总是可以在阅读之前获取每个视频的大小 get
使用参数 CV_CAP_PROP_FRAME_WIDTH
和 CV_CAP_PROP_FRAME_HEIGHT
,例如 videoTop.get(CV_CAP_PROP_FRAME_WIDTH)
。
然后在循环内,特别是在获取图像后的 if 内,您可以将其写入。
关于python - VideoCapture()读取多个视频和帧分辨率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52278770/
我几乎阅读了所有关于这个主题的问题,但我没有解决它。我正在研究 Linux/Mint。我试图用 opencv 打开我的网络摄像头(或任何无关紧要的视频)并从视频中读取一帧。我写了这段代码: impor
我正在尝试使用 C++ 和 OpenCV 来使用我的网络摄像头,但我遇到了这个错误 (...):Images.cpp:(.text+0x27): undefined reference to cv::
我已经在禁用 GPU 的情况下编译了 caffe,然后 cp caffe/build/Makefile openpose/Makefile.conf 运行 make all -j 6 得到这些错误:
我正在运行以下代码: import numpy as np import cv2 import os count = 0 cap = cv2.VideoCapture("/home/simon/PRO
我有一个问题似乎是由 OpenCV 3.xx 引起的 - 该问题在 OpenCV 2.xx 中没有体现 问题是读取视频文件。我的代码设置如下: >#include >#include >#incl
这可能是一个愚蠢的问题,但我真的无法弄清楚。 首先:抱歉标题含糊不清,我不太确定如何用几句话来描述我的问题。 我在 MS Visual Studio、C++ 中使用 OpenCV 2.4.3。我正在使
我正在使用 webrtc 示例代码从我的 Android 设备流式传输到网页。示例代码不具备切换摄像头的功能。我试图解决它,但失败了。该示例使用 VideoCapturerAndroid 类,我发现切
我正在尝试打开视频并将其写入某个位置: #include #include "opencv2/core/core.hpp" #include "opencv2/highgui/highgui.hpp
我是论坛的新手。几周前我开始将 Opencv 与 Java 结合使用。在我的程序中,我使用 videocapture 从 avi 文件中读取帧。昨天我注意到,在我的程序的不同运行中,从文件读取的第 n
我已经使用工作线程实时获取最新帧,代码如下。但是在我的代码中,有一个问题。该帧一直是第一帧,它没有更新。结果,第一帧做了remap(),remap result frame做了下一个循环remap .
根据这个article的回答这是指将单个图像组合成4面的方式。从那里开始,我想从仅使用单个视频更改为使用 4 个视频作为输入。 这是我的代码,它使用单个视频作为输入 import cv2 import
import numpy as np import cv2 cap = cv2.VideoCapture(0) fourcc = cv2.cv.CV_FOURCC(*'XVID') out = cv2
我正在尝试对 OpenCV 的 VideoCapture 类进行“包装”,但无法使其正常工作,我的代码如下: #include "opencv2/opencv.hpp" #include "openc
我可以在 VLC 中打开一个流,但在 OpenCV 中我无法捕获帧。 (Python 2.7、OpenCV 3.4.3 二进制分发版 x86、Windows 10)。我一直在关注本指南:https:/
我有几个 avi 文件,我试图逐帧读取这些文件。我使用 opencv 3.1.0 来读取帧: import cv2 cap = cv2.VideoCapture(file_path) 然后我只读了 c
该代码显示正确的图像,但是在图像“帧”播放后显示错误消息。所以我无法获得“res”图像 它只显示“无对象文件”错误消息。 我应该修复哪一部分才能使其正常工作? import cv2 import nu
我有一台装有2个Nvidia RTX GPU的机器。 主要任务是解码来自IP摄像机的h264视频,并使用GPU 将原始帧编码为JPEG 。 我通过以下方式从源代码构建了opencv + cuda: c
import cv2 import sys cpt=0 vidStream=cv2.videoCapture(0) while True: ret,frame=vidStream.read()
我一直试图找到一种方法来异步检查以查看我使用videocapture拍摄的下一帧相机是否准备就绪。 我遇到了waitAny(),它被描述为“等待VideoCapture的就绪帧”。 在OpenCV文档
定义类很新,我遇到了在自制类中定义 VideoCapture 对象的问题。请参阅下面的代码。 我尝试创建一个包含有关视频文件的所有信息的类。所以我初始化了 videoCapture 对象。哪个工作正常
我是一名优秀的程序员,十分优秀!