从目录中的jpg文件中提取日期的功能

时间:2019-05-21 15:55:10

标签: r loops jpeg ocr tesseract

我有大量(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图像的小型测试样本上运行该函数时,没有输出。

1 个答案:

答案 0 :(得分:0)

请考虑将您的函数重构为在单个jpg文件上运行,然后使用sapplymap向其分配列。在R中,函数的最后一行是返回对象。由于for循环不是最后一个过程,因此函数将返回OCR和正则表达式字符串向量。

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))