Cognitive Services: HoloLens で撮影した動画をVideo APIでブレ補正してみた② 操作編 (プレビュー)

Michaelです。

前回、「Cognitive Services: HoloLens で撮影した動画をVideo APIでブレ補正してみた① 準備編」として、Video APIの概要とAPIキーの取得方法を説明しました。2回目の今回は、取得したAPIキーを使用して実際にVideo APIの「Stabilization」機能を使って動画のブレ補正を試してみます。

Video APIの利用手順

動画を扱うVideo APIでは、Face APIやComputer Vision APIのような静止画向けAPIと比べ解析、変換に時間がかかるため、APIの利用方法が異なり、下記の3ステップで動画解析、および結果の出力を行います。

1. Video APIへの動画の登録

2. 解析・変換の進捗確認

3. 補正済み動画のダウンロード

Video APIへの動画の登録

まずは、Video APIに解析する動画をAPIに登録します。

動画登録は、他のVision カテゴリのAPIと同じく、ヘッダにAPIキー、本文に対象の動画のURLを設定し、POSTメソッドでリクエストを行います。

Video APIが他のVisionカテゴリのAPIと異なるのは、登録が成功した場合に、ステータスコード202 (Accepted)が返され、レスポンス本文に情報が返されない点です。続く手順で必要になる、進捗確認用のURLは、レスポンスヘッダの「operation-location」を参照します。

#coding:utf-8

import requests
import time, sys

def Stabilize(apikey, videourl):
headers = {

リクエストヘッダ

'Content-Type': 'application/json',
'Ocp-Apim-Subscription-Key': api_key,
}

body = {

リクエスト本文

'url': video_url
}

動画の登録

response = requests.request('POST', 'https://westus.api.cognitive.microsoft.com/video/v1.0/stabilize', headers=headers, json=body)

if response.status_code == 202:
print('Status: Accepted')
return response.headers['operation-location']

elif response.status_code >= 400:
print('Status: Error, Code: ' + response.json()['error']['code'])
sys.exit()

レスポンスヘッダの「operation-location」を参照すると以下のようなURLが確認できます。(このURLは、生成されてから24時間有効です。)

解析・変換の進捗確認

レスポンスヘッダの「operation-location」で得られるURLに対してGetメソッドでリクエストをすると、動画変換の進捗を確認することができます。レスポンス本文の「status」を参照すると進捗状況に合わせて「Not Started」⇒「Uploading」⇒「Running」⇒「Succeeded / Failed」とステータスが変化するため、定期的に状況をチェックして変換が完了するのを待ちます。Video APIでは、1分間のリクエストが5回に制限されているため、コードでは15秒ごとに進捗を確認するように設定しています。

def GetOperationResult(apikey, operationurl):

headers = {

Request headers

'Ocp-Apim-Subscription-Key': api_key,
}

変換進捗の確認

while True:
time.sleep(15) # 15秒待機
response = requests.request('GET', operation_url, headers=headers)
result = response.json()

if response.status_code == 200:
print('Status: ' + result['status'])

if result['status'] == 'Succeeded':
resource_url = result['resourceLocation']
print(resource_url)
break
elif result['status'] == 'Failed':
print('Message: ' + result['message'])
sys.exit()

elif response.status_code >= 400:
print('Stauts: Error, Code: ' + response.json()['error']['code'])
sys.exit()

return resource_url

変換が完了すると「Succeeded」のステータスとともに、レスポンス本文の「resourceLocation」から変換済み動画のダウンロード用URLが取得できます。(URLは、生成されてから24時間有効です。)

補正済み動画のダウンロード

動画のダウンロードはダウンロード用URLに対しGETメソッドでリクエストをします。

動画はファイルサイズが大きくなるため、ダウンロードは1KBのチャンクに分けて複数回書き込むようにしています。

def GetResultVideo(apikey, resourceurl, output_path):

headers = {

Request headers

'Ocp-Apim-Subscription-Key': api_key,
}

動画のダウンロード

response = requests.request('GET', resource_url, headers=headers, stream=True)
outputname = outputpath

saved_size = 0.0
content_size = float(response.headers['content-length'])

if response.status_code == 200:
with open(output_name, 'wb') as f:
for chunk in response.itercontent(chunksize=1024):
saved_size += len(chunk)
progress = savedsize / contentsize
sys.stderr.write('\r' + 'Status: Downloading ' + '%.1f%% ' % (progress * 100.))
sys.stderr.flush()
f.write(chunk)
download_status = "Completed."

elif response.status_code >= 400:
print('Stauts: Error, Code: ' + response.json()['error']['code'])

return download_status

動画のブレ補正実行

ここまでで作成した3つの関数を使い、以下のコードで実際にStabilization機能のブレ補正を実行してみました。

今回は、BLOBストレージに保存した動画データを使い、補正された動画をローカルに保存しています。

def main():

api_key = '******'
video_url = 'https://***.blob.core.windows.net/test-video/HoloLens.mp4'

ファイル名抽出とサフィックス追加

filename, fileext = video_url.split('?')[0].split('/')[-1].split('.')
outputpath = './%sstab.%s' % (filename, fileext)

動画の登録

operationurl = Stabilize(apikey, video_url)

解析・変換の進捗確認

resourceurl = GetOperationResult(apikey, operation_url)

変換済み動画のダウンロード

downloadstatus = GetResultVideo(apikey, resourceurl, outputpath)

print(download_status)

if _name == 'main_':
main()

元の動画と補正された動画を比較すると以下のようになります。

効果を確認するために、あえて強くブレが発生するように撮影をしてみましたが、比べるとVideo APIで補正をした動画は機材を使ったようにブレのない、滑らかな動画に変換されていることがわかりました。

embedyt] [http://www.youtube.com/watch?v=PmZ20YrVrUo[/embedyt]

まとめ

今回は、Video APIで動画のブレ補正をしてみましたが、カメラで処理しきれかったブレも滑らかな動画に補正できており、Video APIの性能を実感することができました。

プレビュー版のためか、制限として100MB以下の動画しか対応しないものの、現在は無料で試すことができるため、ちょっとした動画のブレ補正に試してみてはいかがでしょうか。

次回もお楽しみに。

この記事を書いた人

azure-recipe-user