python打造监控摄像头 (python摄像头识别系统)

今天给大家分享一篇非常实用的文章,用folium制作北京市交通电子眼分布地图,再也不怕被隐藏摄像头*拍偷**了

成果图如下:

python编写的网络摄像头,python绘制多组雷达图

主要分为以下2个步骤:

1.电子眼地理数据获取

网址如下:

https://www.icauto.com.cn/weizhang/wzd/110000/

python编写的网络摄像头,python绘制多组雷达图

此网站可以获取全国各地区的电子眼数据

我们以北京市为例,用python爬取北京市所有电子眼名称,代码如下:

url1='https://www.icauto.com.cn/weizhang/wzd/110000/list_1.html'
response=requests.get(url1,headers=header)
soup=BeautifulSoup(response.text,'html.parser')
results=soup.find('div',class_='cdz-ccotent').find_all('li')
forresultinresults:
time.sleep(0.5)
name=result.find('a').text
index=result.find('span').text.split(':')[1]

经过抓包分析,可以得到根据电子眼名称获取经纬度信息的接口:

https://api.map.baidu.com/?qt=gc&wd=北京西路中坝隧道路段&cn=北京&ie=utf-8&oue=1&fromproduct=jsapi&res=api&ak=s8sS5dBsZ7bLRi3bcVRAaYMAnqlXoyeo

返回结果为:

python编写的网络摄像头,python绘制多组雷达图

大家主要看coord参数,刚一看确实有点懵逼,不知道这是啥玩意,我查了半天,才知道这种是百度地图采用的墨卡托平面坐标,利用百度地图api可以转化成经纬度,转化代码如下:

url3='http://api.map.baidu.com/geoconv/v1/?coords={}&from=6&to=5&ak=换成你的ak'.format(str(coord['x'])+','+str(coord['y']))
response=requests.get(url3,headers=header)
result=json.loads(response.text)['result'][0]
lon=result['x']
lat=result['y']

最后将结果保存到csv表格中:

withopen('dianziyan.csv','a+',newline='',encoding='gb18030')asf:
f_csv=csv.writer(f)
f_csv.writerow([name,index,lon,lat])

python编写的网络摄像头,python绘制多组雷达图

2.用folium标点

folium地图标点的方法之前已经有介绍了,可以参考:

python生成广州全市停车场分布地图

代码如下:

importpandasaspd
data=pd.read_csv('dianziyan.csv',encoding='gbk')
importfolium
fromfoliumimportplugins
Camera_map=folium.Map(location=[data['纬度'].mean(),data['经度'].mean()],zoom_start=10,control_scale=True,)
incidents=folium.map.FeatureGroup()
forname,rowindata.iterrows():
incidents.add_child(
folium.CircleMarker(#CircleMarker表示花圆
[row["纬度"],row["经度"]],#每个停车场的坐标
radius=7,#圆圈半径
color='yellow',#标志的外圈颜色
fill=True,#是否填充
fill_color='red',#填充颜色
fill_opacity=0.4,#填充透明度

)
)

Camera_map.add_child(incidents)
Camera_map.save('Camera_map1.html')

python编写的网络摄像头,python绘制多组雷达图

经过放大后可以发现,坐标定位不是很准,有的严重偏离路线,有的甚至定位到湖里了,这是因为底图坐标和电子眼经纬度标准不统一

为了定位更准确,我们把底图和电子眼经纬度统一规范为高德地图

百度经纬度转换成高德经纬度的函数如下:

importmath
defbdToGaoDe(lat,lon):
"""
百度经纬度转高德经纬度
:paramlon:
:paramlat:
:return:
"""
PI=3.14159265358979324*3000.0/180.0
x=lon-0.0065
y=lat-0.006
z=math.sqrt(x*x+y*y)-0.00002*math.sin(y*PI)
theta=math.atan2(y,x)-0.000003*math.cos(x*PI)
lon=z*math.cos(theta)
lat=z*math.sin(theta)
returnlat,lon

读取数据,进行转换:

importpandasaspd
data=pd.read_csv('dianziyan.csv',encoding='gbk')
forname,rowindata.iterrows():
print(bdToGaoDe(row["纬度"],row["经度"]))

将底图换成高德地图,然后将标点转换成电子眼图标:


importfolium
fromfoliumimportplugins
Camera_map=folium.Map(location=[data['纬度'].mean(),data['经度'].mean()],zoom_start=10,zoom_control='False',
tiles='http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',attr='AutoNavi')
incidents=folium.map.FeatureGroup()
tooltip='请点击我查看该点信息'
forname,rowindata.iterrows():
incidents.add_child(
folium.Marker(#CircleMarker表示花圆
[bdToGaoDe(row["纬度"],row["经度"])[0],bdToGaoDe(row["纬度"],row["经度"])[1]],#每个停车场的坐标
icon=folium.Icon(color='green',prefix='fa',icon='bullseye')
)
)

Camera_map.add_child(incidents)
Camera_map.save('Camera_map2.html')

python编写的网络摄像头,python绘制多组雷达图

通过tiles可以设置不同的地图瓦片在,这里设置为高德地图瓦片

Folium.Icon类可以设置color, icon_color, icon, angle, prefix这5个参数:

color的可选项包括:[‘red’, ‘blue’, ‘green’, ‘purple’, ‘orange’, ‘darkred’, ‘lightred’, ‘beige’, ‘darkblue’, ‘darkgreen’, ‘cadetblue’, ‘darkpurple’, ‘white’, ‘pink’, ‘lightblue’, ‘lightgreen’, ‘gray’, ‘black’, ‘lightgray’] ,或者HTML颜色代码
icon_color同上
icon可以在Font-Awesome网站中找到对应的名字,并设置prefix参数为’fa’
angle以度为单位设置

本文只显示了北京地区的电子眼位置,感兴趣的朋友可以深入研究一下,做一张全国的交通电子眼分布图。

-完-

文中完整代码已经打包整理完毕,请在公众号【python数据分析之禅】后台回复电子眼获取,代码遇有问题请添加小编微信:python_bird

python编写的网络摄像头,python绘制多组雷达图