プログラミングノート

忘れないためにプログラミングTipsをメモしていく。本当にメモ程度のこともあれば、かっちり書くこともある

Windows10でPSeyeを動かし、OpenCVで利用する(2019 年)

Windows10でPSeyeを動かしたい

PSeyeは320*240の解像度のときのみだが、187fpsのキャプチャができる代物。
センサ(レンズとセンサの間)にはIRカットフィルタがついている。 それを外し、逆に可視光カットフィルタをつけることで、高速なIRセンサーと出来る。 試行錯誤の末、OpenCV上でPSeyeが動作することを確認したので、備忘録程度にメモを載せておく。省略箇所も多々あるため、もしより詳しく知りたい方がいましたらコメントください。

まずWindows10でPSeyeがカメラとして利用できるようにする。

最初に、大事なこととして、あるタイミングまでPCにPSeyeを接続してはいけない。

CL-eyeというドライバで利用できるようになる。しかし、現在は有料だ。
archive.orgに無料だった頃のドライバが存在したのでこれを使う。 CL-Eye-Driver-5.3.0.0341-Emuline.exeをダウンロードし、実行する。

CL-eye(archive)
https://archive.org/download/CLEyeDriver5.3.0.0341Emuline/

動作確認

実行し終わるとデスクトップにCL-eye Testという実行ファイルがある。
ここでPSeyeを接続し、実行する。
上手くいくとカメラの赤いLEDが点灯し、動作する。
PC内蔵カメラなどがある人は、DevicesタブからPs3 Eye Cameraを選択する必要がある。

OpenCVで動かす

OpenCVで動かすために、まずOpenCVを導入する。OpenCV4.1を導入したら、なぜかPSeyeが動かなかった。試行錯誤の末、OpenCV3.46(x86)での動作を確認している。x86(x86,Win32)で、動作したので、CMakeを使って導入する。
※10/28追記:OpenCV3.46(x64)の動作を確認した
※10/29追記:気のせいだった、やはりCL-eyeを用いるとx64では動作しない。どうやら、ドライバがx86にしか対応していないようだ。

OpenCVx86(3.46)
https://cmake.org/download/

以下のサイトを参考にした。導入時の注意点をまとめる。
https://qiita.com/mine820/items/32fea085350b57e3f9bf

  • https://opencv.org/releases/
    米印のついていないバージョンをダウンロードする(3.16は問題ない)
  • CMakeのインストールディレクトリは無理に変えない(コケた)
  • CMake:Configure時にPlatformはWin32にセット
  • CMakeでのビルド時にBUILD_opencv_worldを有効化させる

Visual Studioでの設定は以下のサイトが参考になる。ただし、ソリューションプラットフォームやパスの部分などはCMakeのビルド先を参照しながら適宜読み替える必要あり。
https://qiita.com/h-adachi/items/aad3401b8900438b2acd

OpenCVでの動作確認

以下のソースコードでPS eyeの動作を確認した。

#include <opencv2/opencv.hpp>

using namespace cv;
int main(int argh, char* argv[])
{

    cv::VideoCapture cap(1);//内蔵カメラがあるため、PS eyeのカメラは1
    
    if (!cap.isOpened())
    {
        return -1;
    }

    //PS eyeのFPSと解像度の設定
    //FPSと解像度の組み合わせの選択肢はCL-Eye TestのOptionsタブのVideo Capture Pinより確認できる
    cap.set(CAP_PROP_FPS,187.003);
    cap.set(CAP_PROP_FRAME_WIDTH, 320);
    cap.set(CAP_PROP_FRAME_HEIGHT, 240);
    
    cv::Mat frame; 
    while (cap.read(frame))
    {

        cv::imshow("PS eye", frame);
        const int key = cv::waitKey(1);
        if (key == 'q')
        {
            break;
        }
        else if (key == 's')
        {
            cv::imwrite("img.png", frame);
        }
    }
    cv::destroyAllWindows();
    return 0;
}

なにか、至らぬ点や不明な箇所があればコメントください。

以上。