Darkside(https対応しました)

名前

URL

タイトル

コメント

2022年5月26日(木) 22:05

ソフトウェアIBIS

 いつの間にか youtube の仕様が変わったようで、VR180 3D をアップロードすると自動作成されるサムネイルがサイドバイサイドになった。以前は、片側中央の拡大映像(平面化済み)で、サムネイルがサイドバイサイドになるのはメタタグを付け忘れた場合だった。
 メタタグを付け忘れたままアップロードしたのか!と大焦りしたが実際は正常にアップできていた。クリック一発で問題なく視聴できるし、VR180 マークも付いている。

 さて、真っ先に確認するのは Davinci Resolve のタイムライン解像度8Kで大丈夫かどうか?
 ステッチ済みの左画像と右画像を合体させ、音声付けてエンコードだけする。そういう単純作業であれば大丈夫なことは分かっている。それさえ不可能なら、これまでも完成品を仕上げられていない訳で。
 だが、ちょっとグレーディングしようとすると、あっさり落ちた。異常終了。突然に一瞬に Davinci Resolve が終了する。
 こうなると、グレーディング結果を8K出力し、それを読ませることで左右一緒に自前ステッチするというワークフロー簡略化はできない。これまで通り、左右別々に切り出して左右別々に処理するしかない。

 ならば続く問題は、タイムライン解像度を 3684×3684 から上げても大丈夫かどうか?
 3684×3684 というのは、画角180度分ぴったりに切り出す値である。しかしソフトウェアIBISやろうとすれば、余分が必要。どうせなら、切り良く 4096×4096 で切り出したい。試すと、これは問題無さそうだ。

 実際の手ぶれ補正は、古いページだがここを参考にする。
 ソフトウェアを使った撮影事後の手ぶれ補正処理は、現実的な時間で処理できることも考えるとほぼ手法が確立されているようだ。加速センサーを活用した撮影その場での補正と異なり、事後処理では実際の手ぶれ量は不明である。そのため、実際の手ぶれ量を推測しないことには始まらない。

1)フレームから、特徴点を抽出。
2)次フレームとの間に、特徴点がどう移動したかを調べる。
3)特徴点の移動を最もうまく説明できる(座標ズレ・回転)量を計算する。

 面白いことに、これらの処理が OpenCV では組み込み関数として存在しているのだ。1)は、goodFeaturesToTrack() という関数。しかも、特徴点を抽出するエリアも限定できる。映像の中で、本来ほとんど動かない物体しか存在しない場所が既知であれば、その近辺だけを特徴点の抽出対象にすることが簡単にできる。
 2)は、calcOpticalFlowPyrLK() という関数。デジカメで一般的な「リアルタイムトラッキング」を実現するためにも、恐らく同様の処理が行われている。
 そして3)が、estimateAffinePartial2D() となる。以前は別の関数だったが、それが非推奨となり最新の OpenCV では廃止された。

 1)は映像内に存在する「角」を検出するもので、実際の撮影フレーム相手に試してやると結構うまく検出してくれる。

import numpy as np
import cv2
img = cv2.imread('input.png')
old_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
feature_params = dict( maxCorners = 200,
                       qualityLevel = 0.2,
                       minDistance = 30,
                       blockSize = 7 )
ariamask = np.zeros(old_gray.shape, dtype=np.uint8)
cv2.rectangle(ariamask, (1024,1536), (3072, 1750), (255), -1)
cv2.rectangle(ariamask, (1830,2676), (2520, 3011), (255), -1)
cv2.rectangle(ariamask, (2725,2269), (2992, 2560), (255), -1)
corners = cv2.goodFeaturesToTrack(old_gray, mask=ariamask, **feature_params)
corners = np.int0(corners)
for i in corners:
    x, y = i.ravel()
    cv2.circle(img, (x, y), 5, 255, -1)
cv2.imwrite("output.png", img)

 このサンプル python プログラムは、input.png の角を検出し、その位置に青丸を付けて output.png に出力している。検出範囲の長方形エリアを3箇所指定。

written by higashino [Virtual Reality] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]

この記事へのトラックバックPingURL

Comments

TrackBacks

Darkside(https対応しました)

Generated by MySketch GE 1.4.1

Remodelling origin is MySketch 2.7.4