如何编写一个循环来加载、修改和保存 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相同的结果。