我有大量(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图像的小型测试样本上运行该函数时,没有输出。
答案 0 :(得分:0)
请考虑将您的函数重构为在单个jpg文件上运行,然后使用sapply
或map
向其分配列。在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))