很多航测朋友对于照片中没有POS点很是懊恼,单反同飞控是分离的,照片由单反生成,而POS点的数据由飞控生成。对于后期数据处理相当不利,尤其是目前对于倾斜摄影的朋友,地理位置信息一定要写到照片中去,而动辄几百上千的照片通过手工加入地理位置信息,是非常不现实的。所以我编写了一个程序,可以通过这个程序将飞控生成得POS点数据批量加入单反所拍摄的照片中。
下面以纵横的飞控生成的POS数据为列子:
数据是以.txt文本的形式进行保存的。
我们需要的数据是 第三列的经度,第四列的纬度,第五列的高度信息。
当然,我的程序需要POS点信息排序同照片的名字排序是都是増序,即POS信息第一条数据是DSC_0001,假设单反拍摄的第一张照片DSC_0078.JPG,那么这就要求DSC_0002数据对应的照片名字为DSC_0079.JPG,以此类推。
那么怎么批量为照片添加POS数据呢?
首先,我们得为一张照片添加POS点,然后才能为大量照片添加,首先我来介绍一下我们的主角exiv2
大部分exif的库都不是很好用,exiv2 (http://www.exiv2.org) 挺不错。但在windows下编译很烦。
我们可以通过命令
exiv2 -M"set Exif.GPSInfo.GPSLatitude 4/1 15/1 33/1" -M"set Exif.GPSInfo.GPSLatitudeRef N" image.jpg 这个命令就是为照片添加一个卑微4°15′33″的GPS信息
当我们要批量为照片添加GPS信息时,我们可以通过读入飞控生成的GPS信息然后循环使用3条命令将这些信息写入照片中:1.添加经度信息,2.添加纬度信息,3.添加高度信息。
cmd_Latitude =" -M\"set Exif.GPSInfo.GPSLatitude"+latitude_value+"\""+"-M \"setExif.GPSInfo.GPSLatitudeRefN\" ";
cmd_Longitude =" -M \"set Exif.GPSInfo.GPSLongitude "+Longitude_value+"\""+" -M \"set Exif.GPSInfo.GPSLongitudeRef E\" ";
cmd_GPSAltitude=" -M \"set Exif.GPSInfo.GPSAltitude "+Altitude_value+"\" ";
qDebug((cmd_Latitude+cmd_Longitude+cmd_GPSAltitude+fileName).toLatin1().data());
p.start("exiv2.exe"+cmd_Latitude+cmd_Longitude+cmd_GPSAltitude+fileName);
p.waitForStarted();
p.waitForFinished();
qDebug()<<QString::fromLocal8Bit(p.readAllStandardError());
以上就是程序的主要代码实现,代码是使用Qt编写的,上面是通过Qt调用exiv2来执行命令来将信息写入。
执行程序之后可以为照片添加GPS信息
exiv2还同样支持以下命令:
Exif.Image.ProcessingSoftware
Exif.Image.NewSubfileType
Exif.Image.SubfileType
Exif.Image.ImageWidth
Exif.Image.ImageLength
Exif.Image.BitsPerSample
Exif.Image.Compression
Exif.Image.PhotometricInterpretation
Exif.Image.Thresholding
Exif.Image.CellWidth
Exif.Image.CellLength
Exif.Image.FillOrder
Exif.Image.DocumentName
Exif.Image.ImageDescription
Exif.Image.Make
Exif.Image.Model
Exif.Image.StripOffsets
Exif.Image.Orientation
Exif.Image.SamplesPerPixel
Exif.Image