У меня есть большой объем (около 10 000) файлов jpg с датами, написанными на каждом из них. Я хочу извлечь дату из каждого jpg и добавить ее в фрейм данных с соответствующим именем файла.
Я прочитал этот форум и не только, и я попытался собрать функцию в R, которая будет выполнять задачу, но я не могу заставить ее работать. Я использовал цикл для:
1) создать список файлов изображений в выбранном каталоге
2) создать фрейм данных для результатов со столбцом для пути к файлу и столбцом на дату (извлечено из jpg)
3) прокрутить файлы в каталоге: изменить размер, Обрезать до части изображения, показывающей дату, оптическое распознавание изображения, Записать дату в фреймворк данных, созданный на шаге 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.
Рассмотрите возможность рефакторинга вашей функции для работы с одним файлом 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))
Большое спасибо, только что проверил, все работает. Сначала он выдал ошибку: «Ошибка в magick_image_readpath (путь, плотность, глубина, полоса): Magick: UnableToOpenBlob `C:\Users\path\file.jpg’: Нет такого файла или каталога @ error/blob.c/OpenBlob /2701" Я погуглил, а другие исправили проблему с установкой ghostscript, которая заработала после перезапуска R. Спасибо.