Skip to content

imgtag module

imagetag module

imgdir(folderpath)

reads EXIF metadata from images in a single directory and ouputs a summary, map and warnings if applicable

Parameters:

Name Type Description Default
folderpath str

path to image directory

required

Returns:

Type Description
map

ipyleaflet map

Source code in uassist/imgtag.py
def imgdir(folderpath):
    """reads EXIF metadata from images in a single directory and ouputs a summary, map and warnings if applicable

    Args:
        folderpath (str): path to image directory

    Returns:
        map: ipyleaflet map
    """    


    import os, exifread, ipyleaflet, datetime, uassist
    from exifread.utils import get_gps_coords
    from ipyleaflet import Marker, Popup
    from ipywidgets import HTML

    altlist = []
    xlist = []
    ylist = []
    timelist = []
    imghwlist = []
    makemodellist =[]
    coorddict = {}
    m = uassist.Map(google_map = "HYBRID", height="600px")

    for filename in os.listdir(folderpath):
        if filename.endswith(".jpg") or filename.endswith(".JPG"): 
            #print(os.path.join(folder, filename))cona
            filepath = folderpath + "/" + filename
            f = open(filepath, 'rb')
            tags = exifread.process_file(f, details=False)

            # GPS Altitude Values
            gpsaltval = [c.decimal() for c in tags["GPS GPSAltitude"].values]
            gpsalt = round(gpsaltval[0], 2)
            altlist.append(gpsalt)

            # GPS Coords
            gps = get_gps_coords(tags)
            latdd = round(gps[0], 7)
            longdd = round(gps[1], 7)

            xlist.append(latdd)
            ylist.append(longdd)

            xy = [latdd, longdd]
            xyz = [latdd, longdd, gpsalt]

            coorddict[filename] = xyz

            # timestamps
            datetimestr = str(tags.get("Image DateTime"))
            datetimeobj = datetime.datetime.strptime(datetimestr, '%Y:%m:%d %H:%M:%S')
            timelist.append(datetimeobj)

            # model
            make = str(tags["Image Make"])
            model = str(tags["Image Model"])
            makemodel = (make + " " + model)
            if makemodel not in makemodellist:
                makemodellist.append(makemodel)

            #image width and height
            imgh = str(tags.get("EXIF ExifImageLength"))
            imgw = str(tags.get("EXIF ExifImageWidth"))
            imghw = (imgw + " x " + imgh)
            if imghw not in imghwlist:
                imghwlist.append(imghw)


            # Map markers and popup
            marker = Marker(location=xy, draggable=False)
            m.add_layer(marker)

            message = HTML()
            message.value = (filename + "</br>" + str(gpsalt) + " m altitude" + "</br>" + str(datetimestr))

            marker.popup = message

            #masterdict[filename] = [latdd, longdd, gpsalt, datetimeobj, makemodel, imghw, xy, filepath]


            #print(filename + "- (" + str(latdd) + ", " + str(longdd) + ", " + str(gpsalt) + ")")
            #print(filename + " " + str(xyz))
            continue
        else:
            continue

    #print(altlist)
    imgcount = len(altlist)

    altsum = sum(altlist)
    altavg = (altsum / imgcount)

    mintime = min(timelist)
    maxtime = max(timelist)

    print("Image Count: " + str(imgcount))
    print("Average Altitude: " + str(round(altavg, 3)))
    print("Max Altitude " + str(max(altlist)))
    print("Min Altitude: " + str(min(altlist)))
    print("UAS Make & Model(s): " + str(makemodellist))
    print("Image resolution(s): " + str(imghwlist))
    print("Time range: " + str(mintime) + " - " + str(maxtime))

    if len(makemodellist) > 1:
        print('*** WARNING: Multiple cameras in dataset ***')

    if (max(altlist) - min(altlist)) > (altavg * 0.1):
        print('*** WARNING: Altitude variation exceed 10% of average altitude ***')

    if len(imghwlist) > 1:
        print('*** WARNING: Multiple image sizes in dataset ***')


    bounds = [[min(xlist),min(ylist)], [max(xlist), max(ylist)]] 
    m.fit_bounds(bounds)
    #The lat/lon bounds in the form [[south, east], [north, west]].

    #res = list(coorddict.keys())[0]
    #center = list(coorddict.get(res))[0:2]
    #print(center)

    return m

imgtag(imgpath)

Extracts EXIF metadata from photo and outputs relevant information

Parameters:

Name Type Description Default
imgpath str

path to image file

required

Returns:

Type Description
dict

metadata information

Source code in uassist/imgtag.py
def imgtag(imgpath):
    """Extracts EXIF metadata from photo and outputs relevant information

    Args:
        imgpath (str): path to image file

    Returns:
        dict: metadata information
    """    

    import exifread
    from exifread.utils import get_gps_coords

    # Open image file for reading (must be in binary mode)
    f = open(imgpath, 'rb')

    # Return Exif tags
    tags = exifread.process_file(f, details=False)
    gps = get_gps_coords(tags)

    latdd = round(gps[0], 7)
    longdd = round(gps[1], 7)

    gpsaltval = [c.decimal() for c in tags["GPS GPSAltitude"].values]
    gpsalt = round(gpsaltval[0], 2)

    date = tags["Image DateTime"]
    imgh = tags["EXIF ExifImageLength"]
    imgw = tags["EXIF ExifImageWidth"]
    make = tags["Image Make"]
    model = tags["Image Model"]

    print("UAS Make & Model: " + str(make) + " " + str(model))
    print("Capture Date & Time: " + str(date))
    print("Image resolution: " + str(imgh) + " x " + str(imgw))
    print("Latitude: " + str(latdd))
    print("Longitude: " + str(longdd))
    print("Altitude: " + str(gpsalt) + " meters")

    return [latdd, longdd, gpsalt]

Last update: 2021-05-07