動画にコメント

動画にコメントが流れるようにしてみた。
コメントはニコニコファームのコメント抽出をエクセルにテキスト形式を選択して貼り付けてcsvファイルで保存してARDeskTopで読み込む。時間がミリセコンドに対応してないのが残念。


まだ文字の大きさとか全然調整してない。フィルターにも対応してない。
もちろんこれから3Dならではのコメントの見せ方も追加する予定。


参考サイト:
ニコニコ動画まとめwiki - ニコニコ動画まとめwiki
http://nicowiki.com/

ニコニコファーム
http://nico.xii.jp/

立方体マーカー型ポイントデバイス

もっとWebカメラの解像度が高い製品が出れば、指先にキャップ式の立方体マーカー型ポイントデバイスも可能になるだろう。

現在のARDeskTopの指マーカーの幅が2.5cm。これが1〜1.5cmで認識できるようになったら実現できる。
また、ポイントデバイスなのでマーカーの傾きは必要なく、色を付けただけの正方形のマーカーでもいいかも。ARToolKitの内部に手を入れるのは面倒だけど。

あと、中にLEDを入れて光らせれば認識率を上げられるかな。

            • -

LogicoolWebカメラで1280×800でも動作した。5fpsだけど。それより大きいと落ちてしまう。
確かどこかARToolKitの中でWebカメラの解像度の最大値を定義してたような・・・。
とりあえずUSB 3.0を待つか。

Labelクラスの修正

これまで、文字のアレンジが左、中、右、しかなかったのを縦方向にも上、中、下でセットできるようにした。
水平方向のアレンジもバグがあったので修正した。
奥行きも出来たほうがいいのかな?

void CLabel3D::Precompute(void)
{
	CText3D::Precompute();

	if(!font || !changedText) return;

	changedText = false;

	double	newPos[3];
	float	llx, lly, llz, urx, ury, urz;
	float	adv;

	font->ftFont->BBox(str, llx, lly, llz, urx, ury, urz);
	adv = font->ftFont->Advance(str);

	if(alignmentH == kLeft)
		newPos[0] = -width2 / 2.0 + marginH;
	else if(alignmentH == kCenter)
		newPos[0] = -adv / 2.0;
	else if(alignmentH == kRight)
		newPos[0] = width2 / 2.0 - marginH - adv;

	//追加
	if(alignmentV == kTop)
		newPos[1] = height2 / 2.0 - ury - marginV;
	else if(alignmentV == kCenter)
		newPos[1] = (lly - ury) / 2.0;
	else if(alignmentV == kBottom)
		newPos[1] = -height2 / 2.0 + lly + marginV;

	if(card) {
		SetPosition(pos[0] + newPos[0], pos[1] + newPos[1], pos[2]);
	} else {
		newPos[2] = depth2 / 2.0;
		SetPosition(pos[0] + newPos[0], pos[1] + newPos[1], pos[2] + newPos[2]);
	}
}

ARDeskTop上で動画再生(その4)

思いつきで、ブルーバックの絵や動画を表示できたら楽しいだろうなあと思ったのでやってみた。
ニコニコ動画の「ブルーバック素材」タグで検索するといっぱい出てくるので、やよクリのブルーバック表示に挑戦してみた。

やよクリBB素材
http://www.nicovideo.jp/watch/sm2409649

OpenCVでflvが再生できたら楽だろうなあと思ってやってたけど、全てのflvが開けるわけではなく、このやよクリも不可だった。
しょうがないのでflvからmpegに変換するアプリを探してたら、フリーでいいのを見つけた。

XMedia Recode
http://www.gigafree.net/media/conv/xmediarecode.html

これで変換してARDeskTop上で再生してみる。
・・・できない!
調べてみたらDirectShowで動画の再生時間や経過時間を調べる関数の返り値が0になっていた。応急処置で適当にごまかして、再生してみた。

・・・青い箇所が青いままだ!
mpegにしたらpngファイルみたいに正確な青じゃなくなるんだな。まあ、あたりまえか。
青の判定の条件を少しゆるくして、再生。

・・・できた!
元々音の入ってない動画なので、少し寂しいけど、何かかわいい。

カメラがほぼ固定なのもいいね!

おまけにもう一つ。

ARDeskTop上で動画再生(その3)

次にDirectShowでなにもしなければ、かってに開いてしまう映像トラックのウインドウを出なくする。
新たにNull Rendererフィルタを追加してVideo Rendererと入れ替えれば、映像なし・音声のみで動画ファイルが再生される。

void CCVVideoManager::TurnOffVideo(void)
{
	IBaseFilter* pNullRenderer = 0;
	IBaseFilter* pFilter = 0;
	IBaseFilter* pVideoRenderer = 0;
	IPin* pinIn = 0;
	IPin* pinOut = 0;

	//NULL Rendererを追加
	CoCreateInstance(CLSID_NullRenderer, NULL,CLSCTX_INPROC_SERVER,
		IID_IBaseFilter, (LPVOID *) &pNullRenderer);
	pGraphBuilder->AddFilter(pNullRenderer, L"Null Renderer");

	//Video Rendererを探す
	pGraphBuilder->FindFilterByName(L"Video Renderer", &pVideoRenderer);

	//Video Rendererの入力ピンを探す
	pVideoRenderer->FindPin(L"VMR Input0", &pinIn);

	//出力されているピンを探す
	pinIn->ConnectedTo(&pinOut);

	//NULL Rendererに接続
	pNullRenderer->FindPin(L"In", &pinIn);
	pinOut->Connect(pinIn, NULL);

	//Video Rendererを除去
	pGraphBuilder->RemoveFilter(pVideoRenderer);
	pVideoRenderer->Release();
}

これでARDeskTop上で動画の単純再生ができるようになった。
OpenCVで動画をキャプチャしているので早送りは出来ても巻き戻しはちょっと厳しいかもしれない。