凹みTips

C++、JavaScript、Unity、ガジェット等の Tips について雑多に書いています。

Oculus Rift × OVRVISION × OpenCV で線画だけの世界を覗いてみた

はじめに

OVRVISION(オーバービジョン)が届きました!

f:id:hecomi:20140205202919j:plainf:id:hecomi:20140205210757j:plain
Oculus Rift にマウントできる軽量VGA低レイテンシ60 fps なステレオカメラです。いくつかのイベントで触らせて頂いていたのですが、完成度がとても高く、届くのを今か今かと待ち侘びていたのでとても嬉しいです。これで PS Eye x 2 でツライ思いをしながらやっていたことから解放されます(あちらは位置調整がすごい大変...)。

今回は、この OVRVISION を利用して OpenCV でカメラ画を加工して現実の世界を覗いてみるのをやってみました。

デモ

Oculus Rift を被って全画面で見て頂くと、線画なのに遠近感がある面白い感じが体感できると思います。

解説

OVRVISION の使い方はドキュメントに載っているので、これを参考に最小限のコードを書いてみるとこんな感じになります。

#include <memory>
#include <ovrvision.h>
#include <opencv2/opencv.hpp>

const char left_window_name[]  = "OVRVISION LEFT";
const char right_window_name[] = "OVRVISION RIGHT";

int main()
{
	// 初期化
	auto ovrvision_deleter = [](OVR::Ovrvision* ptr) { ptr->Close(); };
	std::unique_ptr<OVR::Ovrvision, decltype(ovrvision_deleter)>
		ovr_vision(new OVR::Ovrvision(), ovrvision_deleter);
	ovr_vision->Open(0, OVR::OV_CAMVGA_FULL);

	cv::namedWindow(left_window_name,  CV_WINDOW_AUTOSIZE);
	cv::namedWindow(right_window_name, CV_WINDOW_AUTOSIZE);
	
	for (;;) {
		cv::Mat left_img(480, 640, CV_8UC3), right_img(480, 640, CV_8UC3);
		
		ovr_vision->GetCamImage(left_img.data,  OVR::OV_CAMEYE_LEFT);
		ovr_vision->GetCamImage(right_img.data, OVR::OV_CAMEYE_RIGHT);

		// そのまま表示したい場合は色を変換
		/*cv::cvtColor(left_img,  left_img,  CV_RGB2BGR);
		cv::cvtColor(right_img, right_img, CV_RGB2BGR);*/

		// 線画にする
		const float threshold1 = 50.0f, threshold2 = 200.0f;
		cv::Canny(left_img,  left_img,  threshold1, threshold2);
		cv::Canny(right_img, right_img, threshold1, threshold2);

		cv::imshow(left_window_name,  left_img);
		cv::imshow(right_window_name, right_img);

		if (cv::waitKey(16) >= 0) break;
	}
	
	cv::destroyWindow(left_window_name);
	cv::destroyWindow(right_window_name);

	return 0;
}

これで 2 窓開くのでウィンドウを適当に配置してあげれば立体視出来ます。最初はこれで作りました。

ただ、ちょっとダサいので、OVRVision を Qt (QML) で使えるようにバインディングして作成したのがデモのムービーになります。配布しようと思ったのですが、開発機以外の Windows PC で何故か動かない状態で原因究明中なので、もう少々お待ちください。多分動くようになったと思うので以下のリンクからダウンロードして試してみてください。

我が家のデスクトップ PC だとぬるぬる動きましたが、Mac Book Pro late 2013 だとカクついていたのでそこそこのスペックが必要だと思います。

(追記:2014/04/06)
最新版はこちら:Ovrvision で色んなエフェクト試してみた - 凹みTips

おわりに

今回は線画だけでしたが、OepnCV と OVRVISION の組み合わせで、現実の世界をアニメ調にしたり、顔認識して顔に何か重畳させたりと、他のネタも色々と楽しめると思います。是非みなさんも遊んでみてください。