python onvif庫基本使用

2021-10-05 07:18:57 字數 4219 閱讀 9814

最近新專案中要把一套現有的系統移植到華為atlas終端上,因為現在這套系統裡關於攝像頭預置位跳轉,抓圖等功能是呼叫海康sdk實現的;但是atlas終端是arm平台的,海康的sdk是x86平台的,並沒有提供arm版本的,所以考慮使用onvif協議實現預置位跳轉和抓圖功能,這樣就不用考慮平台差異了。

onvif介面說白了就是webservice介面的呼叫,各個語言也都提供了相關的類庫,大致看了一下c++和python的。對比看來,不得不承認在易用性方面python高出了c++不止乙個量級。下面就介紹一下,如何通過python-onvif實現攝像頭座標跳轉,預置位跳轉以及抓圖功能。

首先是開發環境,這裡使用的是python3

然後安裝python-onvif:

pip3 install --upgrade onvif_zeep
下面介紹一下使用的使用python-onvif基本流程:

1.建立onvifcamera物件,我們可以理解為支援onvif協議的裝置。

2.呼叫onvifcamera物件的create_***_service()方法來獲取相應服務。

3.一般我們首先會呼叫create_media_service()方法來獲取media_service()服務,然後呼叫這個服務提供的getprofiles()來獲取配置資訊,可以從配置資訊裡取到token。

4.接下來就是通過給onvif介面傳遞引數,來呼叫相關介面了。至於如何傳參,及呼叫文件裡寫的很清楚

there are two ways to pass parameter to services methods

1. dict

params =

device_service.sethostname(params)

2. type instance

params = device_service.create_type('sethostname')

params.hostname = 'newhostname'

device_service.sethostname(params)

'''

還是要多看官方文件,廢話少說,先上**,下面的測試demo裡實現了專案裡可能用到的幾個方法:座標跳轉,預置位跳轉,抓圖以及獲取當前座標:

#座標跳轉

def absolute_move():

pan = 0

pan_speed = 1

tilt = 0

tilt_speed = 1

zoom = 1

zoom_speed = 1

mycam = onvifcamera('192.168.1.100', 80, 'admin', 'pass')

# create media service object

media = mycam.create_media_service()

# create ptz service object

ptz = mycam.create_ptz_service()

# get target profile

zeep.xsd.******.any******type.pythonvalue = zeep_pythonvalue

media_profile = media.getprofiles()[0]

request = ptz.create_type('absolutemove')

request.profiletoken = media_profile.token

ptz.stop()

if request.position is none:

request.position = ptz.getstatus().position

if request.speed is none:

request.speed = ptz.getstatus().position

request.position.pantilt.x = pan

request.speed.pantilt.x = pan_speed

request.position.pantilt.y = tilt

request.speed.pantilt.y = tilt_speed

request.position.zoom = zoom

request.speed.zoom = zoom_speed

ptz.absolutemove(request)

print('finish')

#抓圖def snap():

# get target profile

zeep.xsd.******.any******type.pythonvalue = zeep_pythonvalue

mycam = onvifcamera("192.168.1.100", 80, "admin", "pass")

media = mycam.create_media_service() # 建立**服務

media_profile = media.getprofiles()[0] # 獲取配置資訊

with open(res, 'wb') as f: # 儲存截圖

f.write(response.content)

#預置位跳轉

def gotopreset():

zeep.xsd.******.any******type.pythonvalue = zeep_pythonvalue

mycam = onvifcamera("192.168.1.100", 80, "admin", "pass")

media = mycam.create_media_service()

ptz = mycam.create_ptz_service()

params = ptz.create_type('gotopreset')

media_profile = media.getprofiles()[0] # 獲取配置資訊

print(media_profile.token)

params.profiletoken = media_profile.token

params.presettoken = 1

re = ptz.gotopreset(params)

print(re)

#獲取當前位置資訊

def getstatus():

zeep.xsd.******.any******type.pythonvalue = zeep_pythonvalue

mycam = onvifcamera("192.168.1.100", 80, "admin", "pass")

media = mycam.create_media_service()

ptz = mycam.create_ptz_service()

params = ptz.create_type('getstatus')

media_profile = media.getprofiles()[0] # 獲取配置資訊

print(media_profile.token)

params.profiletoken = media_profile.token

res = ptz.getstatus(params)

print(res)

if __name__ == '__main__':

absolute_move()

snap()

gotopreset()

getstatus()幾個方法的流程都是一樣的,都是獲取服務,傳參呼叫。其他的介面也沒有測試,等用到的時候再測吧。

Javascript cssText基本使用指北

一 csstext之起步 那些年,我們是這樣設定樣式的 style.width 233px style.position fixed style.left 233px 現如今,我們可以這樣搞 style.csstext width 233px height 233px position fixed ...

ios NSUserDefaults基本使用

nsuserdefaults適合儲存輕量級的本地資料儲存,比如儲存登陸介面的使用者名稱 密碼之類的資料,並使之本地持久化。nsuserdefaults支援的資料格式有 nsnumber integer float double nsstring,nsdate,nsarray,nsdictionary...

swift UIBezierPath基本使用

參考 import uikit uibezierpath 使用 instancetype bezierpath 可以根據我們的需要任意定製樣式 instancetype bezierpathwithrect cgrect rect 根據乙個矩形畫貝塞爾曲線 instancetype bezierpa...