从目录中的jpg文件中提取日期的函数

Function to extract date from jpg files in a directory

我有大量 (aprx 10 000) jpg 文件,每个文件上都写有日期。我希望从每个 jpg 中提取日期并将其添加到具有相应文件名的数据框中。

我已经阅读了这个论坛及其他内容,我试图在 R 中拼凑一个函数来执行任务,但我无法让它工作。我使用循环来:

1) 在所选目录中生成图像文件列表

2) 使用一列文件路径和一列为结果创建一个数据框 日期(从 jpg 中提取)

3) 遍历目录中的文件: 调整大小, 裁剪到显示日期的图像部分, OCR图像, 将日期写入数据框 - 在步骤 2 中创建

当我 运行 这个函数时,这似乎崩溃了,我不太确定为什么。我是 R 用户,但我以前没有写过函数(你可能会说)

我正在使用 R 3.6.0 和 RStudio

library(tesseract)
library(magick)
library(tidyverse)
library(gsubfn)

get_jpeg_date <- function(folder) {
  file_list <- list.files(path=folder, pattern="*.jpg", recursive = T)
  image_dates <- as.data.frame(file_list)
  image_dates $ ImageDate <- rep_len(x = NA, length.out = length(file_list))
  eng <- tesseract("eng")

  for (i in length(file_list) ) {
    ImageDate <- image_read(paste(folder,"\",file_list, sep = ""))%>% 
  image_resize("2000") %>%
  image_crop("300x100+1800") %>%
  tesseract::ocr(engine = eng) %>%
  strapplyc("\d+/\d+/\d+", simplify = TRUE)%>%
      image_dates[,i]
  }
}

x <- get_jpeg_date(folder = folder)
folder <- "C:/file_path"

x <- get_jpeg_date(folder = folder)

循环中的代码适用于单个文件,但是当我 运行 函数在 3 个 jpg 图像的小测试样本上时没有输出。

考虑 re-factoring 您的函数在单个 jpg 文件上 运行,然后使用 sapplymap 为其分配列。在 R 中,函数的最后一行是 return 对象。由于 for 循环不是最后一个过程,函数将 return OCR 和 regex-ed 字符串向量。

get_jpeg_date <- function(pic) {    
    eng <- tesseract("eng")

    image_read(pic) %>% 
        image_resize("2000") %>%
        image_crop("300x100+1800") %>%
        tesseract::ocr(engine = eng) %>%
        strapplyc("\d+/\d+/\d+", simplify = TRUE)    
}

file_list <- list.files(path=folder, pattern="*.jpg", full.names = TRUE, recursive = TRUE)

# DATA FRAME BUILD
image_dates_df <- data.frame(img_path = file_list)
# COLUMN ASSIGNMENT
image_dates_df$img_date <- sapply(image_dates_df$img_path, get_jpeg_date)

# ALTERNATIVELY WITH dplyr::mutate() and purrr:map()
image_dates_df <- data.frame(img_path = file_list) %>%
           mutate(img_date = map(img_path, get_jpeg_date))