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以下の動画しか対応しないものの、現在は無料で試すことができるため、ちょっとした動画のブレ補正に試してみてはいかがでしょうか。
次回もお楽しみに。