2012-09-04[n年前へ]
■続 パノラマ画像で眺める「巨人阿倍の空中バウンド・ホームラン」の秘密!?
『パノラマ画像で眺める「巨人阿倍の空中バウンド・ホームラン」の秘密!?』で書いた”カメラワーク”の影響を除去した上で・ホームランボールの軌跡を映し出す」スクリプトを書き直してみました。たとえば、下に貼り付けた画像は、巨人阿部選手のホームランボールが外野上空を飛翔していく0.5秒ほどの動きを、一枚の画像として合成したものです。…そうして眺めてみると、見事なくらいの「綺麗で美しく自然極まりない放物線」を巨人阿部が打ったホームラン・ボールは描いていることがわかります。
「突然、空中でバウンドする軌道のホームラン」…超常現象に思えるホームランボールの軌跡も、それは必然で単純な「カメラマンの指が(アングル的に必然として)操作したカメラ行列の変化によって作りされる「人の視覚の錯覚」だった、ということがわかります。
参考までに、昨日・今日に書いてみたMathematicaスクリプトをここに貼り付けておきます。処理手順を大雑把に書くと、「動画中のフレーム内から特徴点を抽出し、隣接フレーム間での特徴点位置関係からフレーム間の(カメラ)変換を算出して、その逆変換を使うことで一連の撮影映像を一枚のパノラマ画像に合成する、という具合です。(コードの前半は、オーバーレイ表示された文字や画像を除去するためのコードですから、本質的なものではありません)
frames=Import["hoge.mov", "ImageList"];(*画像読み込み*) frames2=ParallelTable[ Sharpen[ ColorConvert[ ImageTrim[ frames[[i]], {{1, 190}, {1024, 720}}] , "Grayscale"] , 7], {i, 1, Length[frames]} ];(*画像切り取り&強調*) i1=frames2[[130]];i1search=frames2[[130]]; Do[ tr=FindGeometricTransform[ (*位置検出用画像と保存用画像は別にする*) i1search,i2 = frames2[[i]] , "Transformation" -> "Affine"]; {w, h} = ImageDimensions[i1search]; tmp = ImagePerspectiveTransformation[ i2, tr[[2]], DataRange -> Full, PlotRange -> {{0, First@tr[[2]][{w, 0}]}, {0, h}} ]; {w, h} = ImageDimensions[tmp]; i1search = ImageCompose[i1, {tmp, 1.}, Round@({w, h}/2)]; i1 = ImageCompose[i1, {tmp, 0.75}, Round@({w, h}/2), {1, 0, -1}]; {i, 131, 140, 1} ]; il (* パノラマ画像 *)
ちなみに、隣接フレーム間から画像変換の関係式を導こうとすると、隣接フレーム間で対応する点を(回転や倍率を算出するために)最低3点抽出しないといけません。…というわけで、上記コードはホームランボール(という名前のただ一点の特徴点)だけが画面に映し出されているような映像があるとエラーを吐いてしまいます。