コンテンツにスキップ

Top

/

Ubuntu で PureThermal 2 に接続した Flir Lepton 3.5 を OpenCV(C++言語) でプログラムから制御する方法


この記事は古いです。改善版は以下
https://jitaku.work/it/product/flir/lepton35-purethermal2-opencv-2/


いろいろ調べていても、 Ubuntu で C++ 言語の OpenCV を使って PureThermal 2 に接続した Flir Lepton 3.5 を制御する方法が見当たらなかったので自分で書いた。

ちなみに、OpenCVではなく、Qtにつなげるのであれば、 https://github.com/groupgets/GetThermal という公式?のプログラムがあるのでこっちを使えば良い。

Qtやqmlはようわからん。単に画面出したいだけじゃ!という人は以下。

VideoCaptureで取得できない

なんか知らんがOpenCVのVideoCaptureで画像読み込めばいんじゃね?と色々やったんだがエラーばかりで取得できない。
fourcc で Y16 とか設定したりしたけどだめだった。
ので、他の方法を検討した。普通にVideoCaptureででとれるんなら方法おしえてけろ。

OpenCV4のインストール

https://opencv.org/releases/
の「Source」ボタンをクリックするとUbuntuでコンパイルできる OpenCV のzipがダウンロードできる。

1
2
3
4
5
6
7
8
9
$ unzip opencv-4.5.4.zip
cd opencv-4.5.4/
mkdir build
cd build
cmake ..
cmake --build . (時間かかる)
make
sudo make install
sudo ldconfig

アンインストールしたい場合は正確なやり方はしらんが、

1
2
sudo make uninstall
sudo ldconfig

なんだろう。
念の為、
/usr/local/include
/usr/local/lib
/usr/local/share
/usr/local/bin
配下に残っているopencvと名前のつく残骸をすべて手動で消すと安心。

libuvc(USB video devices)のインストール

libuvcが必要なのでコンパイルする。
正確には出来上がる libuvcstatic.a のみ必要。

1
2
3
4
5
6
7
git clone https://github.com/libuvc/libuvc
cd libuvc
mkdir build
cd build
cmake ..
make
sudo make install

PureThermal 2 に接続した Flir Lepton 3.5 の画像を出す

ソース

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
#include <libuvc/libuvc.h>
#include <opencv2/highgui/highgui_c.h>
#include <unistd.h>

#define VENDOR_ID  0x1e4e
#define PRODUCT_ID 0x0100

uvc_context_t*       ctx;
uvc_device_t*        dev;
uvc_device_handle_t* devh;
uvc_stream_ctrl_t    ctrl;

void cb(uvc_frame_t *frame, void *ptr) {
    uvc_frame_t *bgr;
    uvc_error_t ret;
    IplImage* cvImg;

    bgr = uvc_allocate_frame(frame->width * frame->height * 3);
    if (!bgr) {
        printf("unable to allocate bgr frame!");
        return;
    }

    ret = uvc_any2bgr(frame, bgr);
    if (ret) {
        uvc_perror(ret, "uvc_any2bgr");
        uvc_free_frame(bgr);
        return;
    }

    cvImg = cvCreateImageHeader(cvSize(bgr->width, bgr->height), IPL_DEPTH_8U, 3);
    cvSetData(cvImg, bgr->data, bgr->width * 3); 

    // 4倍に拡大
    IplImage* scale_cvImg = cvCreateImage(cvSize((int)(cvImg->width*4), (int)(cvImg->height*4)), IPL_DEPTH_8U, 3);
    //cvResize(cvImg, scale_cvImg, CV_INTER_LINEAR);
    cvResize(cvImg, scale_cvImg, CV_INTER_CUBIC);

    cvNamedWindow("Test", CV_WINDOW_AUTOSIZE);
    cvShowImage("Test", scale_cvImg);
    cvWaitKey(10);

    cvReleaseImage(&scale_cvImg);
    cvReleaseImageHeader(&cvImg);

    uvc_free_frame(bgr);
}

int main()
{
    uvc_error_t res;

    res = uvc_init(&ctx, NULL);
    if (res < 0) {
        uvc_perror(res, "uvc_init");
        return -1;
    }

    res = uvc_find_device(ctx, &dev, VENDOR_ID, PRODUCT_ID, NULL);
    if (res < 0) {
        uvc_perror(res, "uvc_find_device");
        return -1;
    }

    res = uvc_open(dev, &devh);
    if (res < 0) {
        uvc_perror(res, "uvc_open");
        uvc_unref_device(dev);
        dev = NULL;
        return -1;
    }

    // いろいろ情報が出る
    //uvc_print_diag(devh, stderr);

    // なんかY16を押す声が多いけどそれだと表示されなかったのでUYVYで
    res = uvc_get_stream_ctrl_format_size(devh, &ctrl, UVC_FRAME_FORMAT_UYVY, 160, 120, 9);
    uvc_print_stream_ctrl(&ctrl, stderr);

    res = uvc_start_streaming(devh, &ctrl, cb, (void*)0, 0);
    if (res < 0) {
        uvc_perror(res, "start_streaming");
    } else {
        uvc_set_ae_mode(devh, 1);
        sleep(10);
        uvc_stop_streaming(devh);
    }

    // 後処理
    if (devh != NULL) {
        uvc_stop_streaming(devh);
        uvc_close(devh);
    }
    if (dev != NULL) {
        uvc_unref_device(dev);
    }
    if (ctx != NULL) {   
        uvc_exit(ctx);
        puts("UVC exited");
    }

    return 0;
}

コンパイル
さっき作った libuvcstatic.a をカレントディレクトリにコピーした上で、

1
g++ main.cpp -I/usr/local/include/opencv4/ -lopencv_core -lopencv_highgui -L. -luvcstatic -lusb-1.0 -lpthread

実行は sudo で。

画面が10秒間表示されるよ!

時々絵がでなくなる

なんか知らんが時々絵がでなくなった。USB抜き差ししたら直った。

Lepton のSDKを使って制御する

最新かは知らんが、
https://cdn.sparkfun.com/assets/0/6/d/2/e/16465-FLIRLepton-SoftwareIDD.pdf
とかにFlir Lepton のSDKがあった。公式なのか?これ。

例えばこの中にある、

LEP_RunSysFFCNormalization

とかを呼び出すと校正処理が走る(カチッとシャッターが降りて校正する)

ので、なんかよく読んでいろいろやればよろし。

以上。