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」を参照します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#coding:utf-8 import requests import time, sys def Stabilize(api_key, video_url): 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時間有効です。)
1 |
https://westus.api.cognitive.microsoft.com/video/v1.0/operations/94a9c990-2ee6-446d-91dc-69ff3a24ff65 |
解析・変換の進捗確認
レスポンスヘッダの「operation-location」で得られるURLに対してGetメソッドでリクエストをすると、動画変換の進捗を確認することができます。レスポンス本文の「status」を参照すると進捗状況に合わせて「Not Started」⇒「Uploading」⇒「Running」⇒「Succeeded / Failed」とステータスが変化するため、定期的に状況をチェックして変換が完了するのを待ちます。Video APIでは、1分間のリクエストが5回に制限されているため、コードでは15秒ごとに進捗を確認するように設定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
def GetOperationResult(api_key, operation_url): 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時間有効です。)
1 |
https://westus.api.cognitive.microsoft.com/video/v1.0/operations/94a9c990-2ee6-446d-91dc-69ff3a24ff65/content |
補正済み動画のダウンロード
動画のダウンロードはダウンロード用URLに対しGETメソッドでリクエストをします。
動画はファイルサイズが大きくなるため、ダウンロードは1KBのチャンクに分けて複数回書き込むようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
def GetResultVideo(api_key, resource_url, output_path): headers = { # Request headers 'Ocp-Apim-Subscription-Key': api_key, } # 動画のダウンロード response = requests.request('GET', resource_url, headers=headers, stream=True) output_name = output_path 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.iter_content(chunk_size=1024): saved_size += len(chunk) progress = saved_size / content_size 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ストレージに保存した動画データを使い、補正された動画をローカルに保存しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def main(): api_key = '**************' video_url = 'https://***********.blob.core.windows.net/test-video/HoloLens.mp4' # ファイル名抽出とサフィックス追加 file_name, file_ext = video_url.split('?')[0].split('/')[-1].split('.') output_path = './%s_stab.%s' % (file_name, file_ext) # 動画の登録 operation_url = Stabilize(api_key, video_url) # 解析・変換の進捗確認 resource_url = GetOperationResult(api_key, operation_url) # 変換済み動画のダウンロード download_status = GetResultVideo(api_key, resource_url, output_path) print(download_status) if __name__ == '__main__': main() |
元の動画と補正された動画を比較すると以下のようになります。
効果を確認するために、あえて強くブレが発生するように撮影をしてみましたが、比べるとVideo APIで補正をした動画は機材を使ったようにブレのない、滑らかな動画に変換されていることがわかりました。
[embedyt] http://www.youtube.com/watch?v=PmZ20YrVrUo[/embedyt]
まとめ
今回は、Video APIで動画のブレ補正をしてみましたが、カメラで処理しきれかったブレも滑らかな動画に補正できており、Video APIの性能を実感することができました。
プレビュー版のためか、制限として100MB以下の動画しか対応しないものの、現在は無料で試すことができるため、ちょっとした動画のブレ補正に試してみてはいかがでしょうか。
次回もお楽しみに。