如何编写一个循环来加载、修改和保存 R 中的视频文件?
How to write a loop to load, modify and save a video file in R?
我需要在 R 中加载视频文件 (.AVI),从中提取帧并将该帧保存为图像 (.jpg),名称与提取它的视频相同。
通过包 magick 我设法做到了,但现在我需要自动化这个过程,但我遇到了问题。循环的第一部分似乎有效,但第二部分无效。我还尝试创建一个 for 循环但没有成功。
谁能帮我?
谢谢!
# For a single video (ok):
library(magick)
video <- image_read_video("C:\Users\Desktop\IMG_0020.AVI", fps=0.1)
image_write(video, path = "C:\Users\Desktop\IMG_0020.jpg", format = "jpg")
# For a entire folder (it doesn't work):
setwd("C:\Users\Desktop\folder_name")
v <- list.files("C:\Users\Desktop\folder_name\", full.names = F, pattern="*.AVI")
for(i in 1:length(v)) {
p <- assign(v[i],
image_read_video(fps=0.1, paste("C:\Users\Desktop\folder_name\",
v[i], sep='')))
}
for(i in 1:length(p)) {
assign(p[i],
image_write(format = "jpg", paste("C:\Users\Desktop\folder_name",
p[i], sep='')))
}
你的for
-loop-assign
-逻辑被破坏了。在这种情况下,实际上使用 assing
没有任何意义,至少对我而言。
像这样将您的循环合并为一个循环:
library(magick)
# For a entire folder (it doesn't work):
setwd("C:\Users\Desktop\folder_name")
videos_list <- list.files(full.names = F, pattern = "*.AVI")
for(file in videos_list) {
p <- image_read_video(fps = 0.1, file)
image_name <- gsub("\.AVI", "\.JPG", file)
image_write(p, path = image_name, format = "jpg")
}
这应该为您的工作目录中的每个 avi
- 视频创建一个 jpg
- 图像。
由于您已经定义了工作目录,因此不需要路径。
正如 Limey 所说,您可以使用 lapply
而不是 for
循环:
lapply(video_list,
function(file) {
image_write(image_read_video(fps = 0.1, file),
path = gsub("\.AVI", "\.JPG", file),
format = "jpg")
}
)
应该return相同的结果。
我需要在 R 中加载视频文件 (.AVI),从中提取帧并将该帧保存为图像 (.jpg),名称与提取它的视频相同。 通过包 magick 我设法做到了,但现在我需要自动化这个过程,但我遇到了问题。循环的第一部分似乎有效,但第二部分无效。我还尝试创建一个 for 循环但没有成功。 谁能帮我? 谢谢!
# For a single video (ok):
library(magick)
video <- image_read_video("C:\Users\Desktop\IMG_0020.AVI", fps=0.1)
image_write(video, path = "C:\Users\Desktop\IMG_0020.jpg", format = "jpg")
# For a entire folder (it doesn't work):
setwd("C:\Users\Desktop\folder_name")
v <- list.files("C:\Users\Desktop\folder_name\", full.names = F, pattern="*.AVI")
for(i in 1:length(v)) {
p <- assign(v[i],
image_read_video(fps=0.1, paste("C:\Users\Desktop\folder_name\",
v[i], sep='')))
}
for(i in 1:length(p)) {
assign(p[i],
image_write(format = "jpg", paste("C:\Users\Desktop\folder_name",
p[i], sep='')))
}
你的for
-loop-assign
-逻辑被破坏了。在这种情况下,实际上使用 assing
没有任何意义,至少对我而言。
像这样将您的循环合并为一个循环:
library(magick)
# For a entire folder (it doesn't work):
setwd("C:\Users\Desktop\folder_name")
videos_list <- list.files(full.names = F, pattern = "*.AVI")
for(file in videos_list) {
p <- image_read_video(fps = 0.1, file)
image_name <- gsub("\.AVI", "\.JPG", file)
image_write(p, path = image_name, format = "jpg")
}
这应该为您的工作目录中的每个 avi
- 视频创建一个 jpg
- 图像。
由于您已经定义了工作目录,因此不需要路径。
正如 Limey 所说,您可以使用 lapply
而不是 for
循环:
lapply(video_list,
function(file) {
image_write(image_read_video(fps = 0.1, file),
path = gsub("\.AVI", "\.JPG", file),
format = "jpg")
}
)
应该return相同的结果。