見たいところに目が届くヘッドマウントディスプレイ「遊EYE離脱」

Home > Raspberry Pi > 見たいところに目が届くヘッドマウントディスプレイ「遊EYE離脱」
すき 1
うんこ 0

 

みんなのラズパイコンテスト2016に応募するために「遊EYE離脱」を作成しました!

機能

本機はヘッドマウントディスプレイと内視鏡型カメラで構成されています。

図1

図2

ヘッドセットのディスプレイにはRaspberry Pi 3を用いて右目用と左目用に同一の内視鏡カメラ映像2つがリアルタイムで表示されます。

%e3%82%b9%e3%82%af%e3%83%aa%e3%83%bc%e3%83%b3%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88-2016-09-08-19-28-24

カメラを様々な方向や対象に向けることで、まるで目が体から離脱したような体験ができます。

使い方

機器を起動しヘッドマウントディスプレイを装着します。カメラを手に持ち対象物に向けます。
以下のようなシチュエーションで本機の有用性がより発揮されます。

  • ヘアチェック
    図3

 

  • ヒゲや鼻毛の処理
    図4

 

  • 耳かき
    図5png

仕組み

構成

%e3%83%95%e3%82%99%e3%83%ad%e3%83%83%e3%82%af%e5%9b%b3

Raspberry Pi 3に7インチIGZOディスプレイと内視鏡カメラを接続し電源にモバイルバッテリを使用した。ディスプレイを市販のVRゴーグルを加工して実装しヘッドマウントディスプレイを構成している。

  • Raspberry Pi 3

     
  • Raspberry Pi用 7インチ IGZO LCDパネル


     

  • USB内視鏡カメラ

     
  • モバイルバッテリー

     
  • VRゴーグル3D

ラズパイ設定

経緯

最初は Raspberry Pi Zero での実装予定だったのですが、IGZOパネルが高精細ということもあり、カメラ画像を遅延無く表示させるには、画像サイズを320×240 位に落とさねばなりませんでした。

Raspberry Pi に X11VNC を入れて OpenCV カメラを起動

それだと、IGZOパネル上では上記の様に画面が小さすぎる為、Raspberry Pi Zero での実装を断念し、高性能な Raspberry Pi 3 を使用しました。

(ちなみにRaspberry Pi 2 はこのブログを動かしているサーバーにしています。)

設定

Raspberry Pi 3 セットアップ

まずは、Raspberry Pi 3 のセットアップ、IGZOパネルの接続、固定IPの設定を行いました。

Mac で Raspberry Pi 3 セットアップ(IGZOパネル接続、Wi-Fi固定IP迄)

Python版OpenCVのインストール

Raspberry Pi 3 に Python版OpenCV をインストールします。

内視鏡カメラの接続

こちらは接続しただけで認識されました。

OpenCV

Python コード

PYTHON コード 解説

ウィンドウの作成

ウィンドウは、ここで宣言された順番に表示されるので、表示順に下記のウィンドウを作成します。

  1. 黒背景用ウィンドウ
  2. 左目用カメラウィンドウ
  3. 右目用カメラウィンドウ
  4. カメラウィンドウのタイトルバーを消す為のウィンドウ

4についてですが、OpenCVのウィンドウはタイトルバーを消すことは出来ない様なので、苦肉の策として、タイトルバーの上に更に黒背景のウィンドウを重ねるという手段をとっています。

塗りつぶし用配列の作成

  1. IGZOパネルのウィンドウサイズ(1920*1200) 配列を作り、黒(0)で塗りつぶします。
  2. 前述の、タイトルバーを消す為のウィンドウサイズ(1920*275)配列を作り、黒で塗りつぶします。高さは、実際に画面を見ながら調節しました。
ウィンドウの配置

各ウィンドウの配置を行います。左上を0として、横、縦のピクセルを指定します。画面の配置は、最初は真ん中に置いてから画面を見ながら調整しました。

カメラを開く

カメラウィンドウのリサイズ

画面を見て丁度良い感じのサイズが1.2倍だったので、リサイズ用の変数をセットします。

最初、カメラの解像度がわからなかったため、whileの中に下記コードを入れて取得しました。

print すると、LXTerminal 上に フレーム毎に数値が出力されました。

背景ウィンドウの表示

背景ウィンドウはwhileの中に入れる必要が無いので、先に表示させます。
(最初、whileの中に入れてしまったのですが、それだと結構遅延が発生しました。)

画面の表示

フレーム取得、表示を繰り返します。

キャプチャ画面を取得します。

フレームが無い場合終了します。

先ほどセットしたサイズにリサイズします。

imshowで画面を表示します。ちなみにここでの順番は、表示順には関係ありませんでした。

エスケープキーを押したら終了するコードです。

終了時は、画面を破棄し、カメラを開放します。

 

実際に鼻の穴や耳の穴をみると、思いの外の臨場感で気持ち悪かったです。。。。。

追記(16/9/16)

Adafruit様のブログで紹介していただけました!

追記(16/11/18)

みんなのラズパイコンテスト2016で優秀賞頂きました!!

追記(17/1/18)

ITproさんで紹介して頂きました!

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください