5. ロジクールC270ウェブカメラを使う
ロジクールC270ウェブカメラについて
2000円程度で買えるロジクールのC270ウェブカメラで結構まともなステレオビジョンシステムをつくることができます. ホームページの紹介ビデオのカメラはこれです. 独IDS(Imaging Development Systems)社や独TIS(The Imaging Source)社の立派な産業用カメラを2016年頃に試してみましたが, 一緒に提供されるSDKで使うことが前提となっていて, OpenCVやOpenGLやCUDAと組み合わせて使うのはなかなか大変のようでした. 私は途中で諦めました. UVC(USB Video Class)対応と謳っていても, Ubuntuのせいかもしれませんが, 私の環境ではきちんとは動かなかった記憶があります. それでとりあえずということで使ったロジクールのC270ウェブカメラがなかなか良かったのでこれを使い続けています. 以下このカメラを使うことが前提ですが,ロジクールの同じランクのカメラであれば同じように使えるのではと思っています.
使えるカメラ
ロジクールのC270はもちろん使えました.
新横浜にあるInfinitegraという会社のFCB-MA130(SONY製)を使ったUSB3.0-UVCカメラも使えました.
ステレオビジョン用のカメラとして有名なSTEREOLABS社のZEDも使えました. ZEDでは2つのカメラの画像,すなわちステレオ画像,がカメラ1台の画像として転送されて来ます.
IDS社の安いUSB2.0用カメラ,LEシリーズのUV-1551LE-Cも使えました.
ロジクールのちょっと高いC922 Pro Stream Webcamも使えました.
ウェブカメラの画像をビデオ表示するプログラムを配布
camera.cppと cameras.cppと makefile をダウンロードして同じディレクトリに置いて
make one
とするとカメラの画像がウィンドウにビデオ表示されます.
make two
とするとカメラ2台の画像が2つのウィンドウに各々ビデオ表示されます.
2つのウィンドウが重なって表示されてしまった場合はマウスでウィンドウを移動させてください.
どちらもキーが押されると終了します.
camera.cppが一台用でcameras.cppが2台用です.
プログラムの説明
camera.cppはOpenCVのライブラリ関数を使って次のようになっています.
#include <opencv2/highgui/highgui.hpp>
int main(int argc, const char** argv) {
cv::VideoCapture cap0(0);
if (cap0.isOpened()) printf("camera successfully opened\n");
else { printf("cannot open camera\n"); return 1; }
cv::namedWindow("image0", cv::WINDOW_AUTOSIZE);
cv::Mat frame0;
for ( ; ; ) {
cap0 >> frame0;
cv::imshow("image0", frame0);
if (cv::waitKey(30) >= 0) break;
}
return 0;
}
waitKey(30)は,30msの間,キー入力を待ち,キー入力があった場合はそのキーコードを,
キー入力がなかった場合は-1を,返すという関数です.これ以外の関数は何となく意味が分かると思います.
このプログラムに対するmakefileは
LFLAGS = -O3 `pkg-config opencv --cflags --libs`
.SUFFIXES:
camera: camera.cpp
g++ -o $@ camera.cpp $(LFLAGS)
one: camera
./camera
clean:
rm -f camera
となります.このプログラムはOpenCVがきちんとインストールされているかのテストにもなります.
勝手に拡張子
またmakefileのダウンロードでは勝手に拡張子.txtが付けられてmakefile.txtとなることがあるようです. HTML5のdownload属性を使っているのですが,同じように記述しても拡張子.txtが付かないときもあるようです. どこからこの違いが発生するのか色々試してみましたが分かりませんでした. 拡張子のないファイルはtarなどでアーカイブしたものをダウンロードするようにすべきかもしれませんが, それはそれで面倒なので,このままにしておきます.makefile.txtとなったらmakefileにリネームしてください.