- 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/
我对此很陌生,我在这里的论坛上检查过答案,但我没有找到任何真正可以帮助我的答案。我正在尝试播放 res/raw 文件夹中的视频。到目前为止我已经设置了这段代码: MediaPlayer mp; @Ov
我可以播放一个视频剪辑,检测视频的结尾,然后创建一个表单,然后播放另一个视频剪辑。我的问题是,表单 react 不正确,我创建了带有提交按钮和两个单选按钮可供选择的表单。我希望让用户进行选择,验证响应
首先,我必须说我在web2py讨论组中看到过类似的内容,但我不太理解。 我使用 web2py 设置了一个数据库驱动的网站,其中的条目只是 HTML 文本。其中大多数将包含 img和/或video指向相
我正在尝试在视频 View 中播放 YouTube 视频。 我将 xml 布局如下: 代码是这样的: setContentView(R.layout.webview); VideoV
我正在开发一个需要嵌入其中的 youtube 视频播放器的 android 应用程序。我成功地从 API 获得了 RTSP 视频 URL,但是当我试图在我的 android 视频 View 中加载这个
我目前正在从事一个使用 YouTube API 的网络项目。 我完全不熟悉 API。所以每一行代码都需要付出很多努力。 使用以下代码,我可以成功检索播放列表中的项目: https://www.goog
是否可以仅使用视频 ID 和 key 使用 API V3 删除 youtube 视频?我不断收到有关“必需参数:部分”丢失的错误消息。我用服务器和浏览器 api 键试了一下这是我的代码: // $yo
所以我一直坚持这个大约一个小时左右,我就是无法让它工作。到目前为止,我一直在尝试从字符串中提取整个链接,但现在我觉得只获取视频 ID 可能更容易。 RegEx 需要从以下链接样式中获取 ID/URL,
var app = angular.module('speakout', []).config( function($sceDelegateProvider) {
我正在努力从 RSS 提要中阅读音频、视频新闻。我如何确定该 rss 是用于新闻阅读器还是用于音频或视频? 这是视频源:http://feeds.cbsnews.com/CBSNewsVideo 这是
利用python反转图片/视频 准备:一张图片/一段视频 python库:pillow,moviepy 安装库 ?
我希望在用户双击视频区域时让我的视频全屏显示,而不仅仅是在他们单击控件中的小图标时。有没有办法添加事件或其他东西来控制用户点击视频时发生的情况? 谢谢! 最佳答案 按照 Musa 的建议,附
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 7年前关闭。 Improve this questi
我有一个公司培训视频加载到本地服务器上。我正在使用 HTML5 的视频播放来观看这些视频。该服务器无法访问网络,但我已加载 apache 并且端口 8080 对同一网络上的所有机器开放。 这些文件位于
我想混合来自 video.mp4 的视频(时长 1 分钟)和来自 audio.mp3 的音频(10 分钟持续时间)到一个持续时间为 1 分钟的输出文件中。来自 audio.mp3 的音频应该是从 4
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 8年前关闭。 Improve this questi
我正在尝试使用 peer/getUserMedia 创建一个视频 session 网络应用程序。 目前,当我将唯一 ID 发送到视频 session 时,我能够听到/看到任何加入我的 session
考虑到一段时间内的观看次数,我正在评估一种针对半自动脚本的不同方法,该脚本将对视频元数据执行操作。 简而言之,只要视频达到指标中的某个阈值,就说观看次数,它将触发某些操作。 现在要执行此操作,我将不得
我正在通过iBooks创建专门为iPad创建动态ePub电子书的网站。 它需要支持youtube视频播放,所以当我知道视频的直接路径时,我正在使用html5 标记。 有没有一种使用html5 标签嵌入
我对Android不熟悉,我想浏览youtube.com并在Webview内从网站显示视频。当前,当我尝试执行此操作时,将出现设备的浏览器,并让我使用设备浏览器浏览该站点。如果Webview不具备这种
我是一名优秀的程序员,十分优秀!