2012-09-02[n年前へ]
■「阿部の打球は本当に曲がったのか?」 
問題の打球は8月26日の横浜DeNA戦(横浜)の6回、阿部が左腕・篠原貴行投手(35)から放った19号2ラン。高い弧を描いて下降をはじめ、中飛かと思われた次の瞬間、突然空中でバウンドするような軌道でバックスクリーンに飛び込んだのだ。
曲がっているように見える原因は、ズームだったわけです。夜の球場で視覚的情報量が少ないことからズームに気づきにくく、そのためボールが曲がったように見えたというのが私の結論です。
この解析のために書いたMathematicaコード・アルゴリズムは、『パノラマ画像で眺める「巨人阿倍の空中バウンド・ホームラン」の秘密!?』で読むことができます。
2012-09-03[n年前へ]
■パノラマ画像で眺める「巨人阿倍の空中バウンド・ホームラン」の秘密!? 
「突然、空中でバウンドするような軌道で、バックスクリーンに飛び込んだ」という巨人 阿部選手の横浜DeNA戦ホームランの話(「阿部の打球は本当に曲がったのか?」)が面白かったので、TV動画から「カメラマンが操作したズームなど”カメラワーク”の影響を除去した上で・ホームランボールの軌跡を映し出す」スクリプトを書いて、阿倍の打球が「空中バウンド」した辺りの映像を「パノラマ画像」にしてみました。
そうして眺めてみると、特に奇妙でもない普通の打球(軌跡)に見えます。…なるほど、確かにナイトゲームとカメラワークが、奇妙で不思議な空中で突然方向を変えるホームラン、ミステリアスな魔法のホームラン・ボールを生み出したのかもしれないと感じますね。
問題の打球は8月26日の横浜DeNA戦(横浜)の6回、阿部が左腕・篠原貴行投手(35)から放った19号2ラン。高い弧を描いて下降をはじめ、中飛かと思われた次の瞬間、突然空中でバウンドするような軌道でバックスクリーンに飛び込んだのだ。
曲がっているように見える原因は、ズームだったわけです。夜の球場で視覚的情報量が少ないことからズームに気づきにくく、そのためボールが曲がったように見えたというのが私の結論です。
この解析のために書いたMathematicaコード・アルゴリズムは、『パノラマ画像で眺める「巨人阿倍の空中バウンド・ホームラン」の秘密!?』で読むことができます。
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点抽出しないといけません。…というわけで、上記コードはホームランボール(という名前のただ一点の特徴点)だけが画面に映し出されているような映像があるとエラーを吐いてしまいます。


