pythongps
① 使用python實時將gps返回的經緯度轉化為圖片
主要就是做了兩件事情:
1.生成一張有文本信息的JPG圖片
2.寫入EXIF信息
生成照片需要PIL和libjpeg
import Imageimport ImageDrawimport ImageFontdef create_pic(path, text=[], type='jpeg'):
img = Image.new("RGB", (2448, 3264), '#37b6ce')#顏色和大小
draw = ImageDraw.Draw(img)
font = ImageFont.truetype('ziti.ttf', 120)#ttf是字體,120是字型大小
for h in range(0, len(text)):#多行文本
draw.text((256, 256 + 120 * h), text[h], font=font)
img.save(path, type)#保存
# img.show()
讀寫EXIF信息需要pyexiv2,獲取google的經緯度需要geopy
順便說下經緯度的表示:
一般exif里看到的都是這樣的57°55'56.6",是度,分,秒這么展示的,google上獲取來的是十進制的57.9323888888888
所以需要轉換一下再寫進去
公式:57°55'56.6" =57+55/60+56.6/3600=57.9323888888888
etemplate=pyexiv2.ImageMetadata('IMG_4408.JPG')template.read()#exif信息很多,所以找個真正手機拍攝的照片當模版googlev3=geopy.GoogleV3()place,gps=googlev3.geocode(location)#獲取gps信息,location寫地名,比如『北京王府井』,偶爾會被牆,最好掛個代理defset_exif(path,date_time=None,gps=()):
"""
datetime=2014:10:0412:41:38
geo=(lat=39.12315,lng=115.12231)
"""
metadata=pyexiv2.ImageMetadata(path)
metadata.read()
forkintemplate.exif_keys:
metadata[k]=pyexiv2.ExifTag(k,template[k].value)
ifnotdate_time:
date_str=pyexiv2.utils.exif(date_time)
metadata['Exif.Photo.DateTimeOriginal']=date_str
metadata['Exif.Photo.DateTimeDigitized']=date_str
metadata['Exif.Image.DateTime']=date_str
iflen(geo)>0:
c_lat=decimal2coordinate(geo[0],['S','N'])
c_lng=decimal2coordinate(geo[1],['W','E'])
metadata["Exif.GPSInfo.GPSLatitude"]=coordinate2rational(c_lat[0],c_lat[1],c_lat[2])
metadata["Exif.GPSInfo.GPSLatitudeRef"]=c_lat[3]
metadata["Exif.GPSInfo.GPSLongitude"]=coordinate2rational(c_lng[0],c_lng[1],c_lng[2])
metadata["Exif.GPSInfo.GPSLongitudeRef"]=c_lng[3]
else:
metadata._delete_exif_tag("Exif.GPSInfo.GPSLatitude")
metadata._delete_exif_tag("Exif.GPSInfo.GPSLatitudeRef")
metadata._delete_exif_tag("Exif.GPSInfo.GPSLongitude")
metadata._delete_exif_tag("Exif.GPSInfo.GPSLongitudeRef")
metadata.write()defdecimal2coordinate(value,loc):
"""
loc=lat=>["S","N"],lng=>["W","E"]
retrunD,M,S,locate
"""
ifvalue<0:
loc_value=loc[0]
elifvalue>0:
loc_value=loc[1]
else:
loc_value=""
abs_value=abs(value)
deg=int(abs_value)
t1=(abs_value-deg)*60
min=int(t1)
sec=round((t1-min)*60,5)
return(deg,min,sec,loc_value)defcoordinate2rational(D,M,S):
return(fractions.Fraction(D,1),fractions.Fraction(int((M+S/60)*100),100),fractions.Fraction(0,1))
② Python卡爾曼濾波器OpenCV跟蹤和預測物體的軌跡
在探索物體運動軌跡時,設想你在霧中駕駛車輛,依賴 GPS 提供速度和位置信息,但GPS難免會有誤差。如何在不確定性中准確追蹤位置?這就是卡爾曼濾波器的用武之地。這個精密工具通過兩個步驟——預測和更新,處理不確定性信息。
預測階段,卡爾曼濾波器採用數學公式[公式],基於當前狀態和模型預測物體的下一狀態。然後是更新階段,[公式]則根據新的測量數據調整預測值,以減小誤差。
在實際操作中,OpenCV 提供了一個易於使用的 KalmanFilter 類,幫助我們避開復雜的數學細節。這里,我們將運用OpenCV實現一個簡單的2D物體運動的卡爾曼濾波,以便預測其位置。首先,設置濾波器的基本結構:
代碼示例:
通過模擬直線移動的物體並添加隨機雜訊,我們觀察其運動,然後運用卡爾曼濾波器進行軌跡估計。接下來,我們將展示真實路徑、測量雜訊以及濾波器估計結果的可視化。
代碼解讀:
通過圖形化,你可以看到模擬的2D物體運動軌跡及其處理後的效果:
通過這段代碼,你可以看到卡爾曼濾波器如何在跟蹤物體運動時發揮作用,即使面對測量雜訊,也能提供更精確的預測。深入研究源代碼,你可以了解更多關於物體軌跡預測的細節:[參閱一] 和 [參閱二]。