I´m working with some data analysis of images in R for a structural complexity theme in a forest. We set some cameras to take pictures each hour during a period of time. Those images are in a JPEG format The thing is that I need a function where besides other parameters that I´m already working on, help me to get the hour and date and save it in the csv file of each photograph.
images.folder = "C:/Users/abc/Desktop/OSA/BSCAM11"
results.file = "BSCAM11.csv"
if (file.exists(results.file)) {
existing = read.csv(results.file)
start = max(existing$i)+1
} else {
start = 1
}
files = dir(images.folder)
nbins = 15 # see MIG algorithm
nb.photos = length(files)
for (i in start:nb.photos) {
file.to.analyze = files[[i]]
path = paste(images.folder,file.to.analyze,sep="/")
# Load 3 rasters from the target image, one for red, one for green and one for the blue channel
R = raster(path, band=1)
G = raster(path, band=2)
B = raster(path, band=3)
# Combine the RGB channels to create a grayscale image
RGB = brick(R,G,B)
r.grey = mean(RGB)
#
# # Convert RGB bands to HSV channels
# HSV = rgb2hsv(getValues(R),getValues(G),getValues(B))
# r.H = r.S = r.V = raster(ncols = ncol(R), nrows = nrow(R))
# extent(r.H) = extent(r.S) =extent(r.V) =extent(R)
# values(r.H) = HSV[1,]
# values(r.S) = HSV[2,]
# values(r.V) = HSV[3,]
#
# # On the four channels, find either right (1), diagonal (2) or below (3) neighbors for histogram calculations
#
v.grey.1 = getImagePixels(r.grey, side = 1)
# v.H.1 = getImagePixels(r.H, side = 1)
# v.S.1 = getImagePixels(r.S, side = 1)
# v.V.1 = getImagePixels(r.V, side = 1)
#
v.grey.2 = getImagePixels(r.grey, side = 2)
# v.H.2 = getImagePixels(r.H, side = 2)
# v.S.2 = getImagePixels(r.S, side = 2)
# v.V.2 = getImagePixels(r.V, side = 2)
#
v.grey.3 = getImagePixels(r.grey, side = 3)
# v.H.3 = getImagePixels(r.H, side = 3)
# v.S.3 = getImagePixels(r.S, side = 3)
# v.V.3 = getImagePixels(r.V, side = 3)
#
# # Calculate histograms from neighbor vectors
prob.grey.1 = calculateHisto(reference_vector = v.grey.1$reference_vector,
neighbour_vector = v.grey.1$neighbour_vector, nbins = nbins)
# prob.H.1 = calculateHisto(reference_vector = v.H.1$reference_vector,
# neighbour_vector = v.H.1$neighbour_vector, nbins = nbins)
# prob.S.1 = calculateHisto(reference_vector = v.S.1$reference_vector,
# neighbour_vector = v.S.1$neighbour_vector, nbins = nbins)
# prob.V.1 = calculateHisto(reference_vector = v.V.1$reference_vector,
# neighbour_vector = v.V.1$neighbour_vector, nbins = nbins)
#
prob.grey.2 = calculateHisto(reference_vector = v.grey.2$reference_vector,
neighbour_vector = v.grey.2$neighbour_vector, nbins = nbins)
# prob.H.2 = calculateHisto(reference_vector = v.H.2$reference_vector,
# neighbour_vector = v.H.2$neighbour_vector, nbins = nbins)
# prob.S.2 = calculateHisto(reference_vector = v.S.2$reference_vector,
# neighbour_vector = v.S.2$neighbour_vector, nbins = nbins)
# prob.V.2 = calculateHisto(reference_vector = v.V.2$reference_vector,
# neighbour_vector = v.V.2$neighbour_vector, nbins = nbins)
#
prob.grey.3 = calculateHisto(reference_vector = v.grey.3$reference_vector,
neighbour_vector = v.grey.3$neighbour_vector, nbins = nbins)
# prob.H.3 = calculateHisto(reference_vector = v.H.3$reference_vector,
# neighbour_vector = v.H.3$neighbour_vector, nbins = nbins)
# prob.S.3 = calculateHisto(reference_vector = v.S.3$reference_vector,
# neighbour_vector = v.S.3$neighbour_vector, nbins = nbins)
# prob.V.3 = calculateHisto(reference_vector = v.V.3$reference_vector,
# neighbour_vector = v.V.3$neighbour_vector, nbins = nbins)
# Calculate the green index
# r.green = getBinaryVegetationMask(RGB)
# Write to the CSV file after every image is analysed
write.table(
data.frame(
i = i,
ID = file.to.analyze,
MIG.grey = meanInformationGain(prob.grey.2),
Aniso.grey = meanInformationGain(prob.grey.1) / meanInformationGain(prob.grey.3),
Timestamp = Sys.time()
),
file=results.file,
append=i!=1,
col.names = i==1,
row.names = FALSE,
sep=","
)
}
}
I hope this would give you a starting point
add this line after you have created "path" variable in your script
file_ctime <- file.info(path)$ctime
note that it would give a result such as parse to your need as necessary
"2015-10-30 20:52:00 GMT"
It may be easier to use a professional tool for that job, eg
library(abbyyR)
# Visit http://ocrsdk.com/plans-and-pricing/
# open account, set up an app and submit its credentials:
setapp(c("appname", "app_password"))
processRemoteImage(img_url="http://i.stack.imgur.com/n7xQz.jpg")
Sys.sleep(5) # wait a bit
tasklist <- listTasks()
(res <- readLines(as.character(tasklist[1, 7]), encoding = "UTF-8"))
# [1] "2015-01-01 16:30:32 " # <-- seems to work
You probably want to extract the actual date and time the pictures were taken stored in exif metadata, and not the file modification date. Currently there is no direct way of doing this in R.
However, depending on your system, it could be possible to leverage the command line tool exiftool . To extract the date/time for all images in directory
you would write something like:
# extract exif metadata for images in the specified directory
dir = "/path/to/directory/"
info = system(
sprintf("exiftool -T -FileName -DateTimeOriginal %s", dir),
intern = TRUE
)
# read into a data.frame
df <- read.delim(
textConnection(info),
stringsAsFactors = FALSE,
header = FALSE,
col.names = c("Filename", "DateTime")
)
# convert to a formal Date-Time Class
df$DateTime = as.POSIXct(df$DateTime, format = "%Y:%m:%d %H:%M:%S")
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.