/
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がダウンロードできる。
$ unzip opencv-4.5.4.zip
cd opencv-4.5.4/
mkdir build
cd build
cmake ..
cmake --build . (時間かかる)
make
sudo make install
sudo ldconfig
アンインストールしたい場合は正確なやり方はしらんが、
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 のみ必要。
git clone https://github.com/libuvc/libuvc
cd libuvc
mkdir build
cd build
cmake ..
make
sudo make install
PureThermal 2 に接続した Flir Lepton 3.5 の画像を出す
ソース
#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 をカレントディレクトリにコピーした上で、
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
とかを呼び出すと校正処理が走る(カチッとシャッターが降りて校正する)
ので、なんかよく読んでいろいろやればよろし。
以上。