简体   繁体   中英

Get data as date and hour from images in R

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM