Функция для извлечения даты из файлов JPG в каталоге - PullRequest
1 голос
/ 21 мая 2019

У меня большой объем (около 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 голосов
/ 21 мая 2019

Рассмотрите возможность перефакторинга вашей функции для запуска в одном jpg-файле, затем присвойте ей столбец с помощью sapply или map.В R последняя строка функции - это возвращаемый объект.Поскольку циклы for не являются последним процессом, функция будет возвращать вектор строки OCR и regex.

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