OpenCVが複数カメラに対応してない件について
どうにもうまくいかないと思ったら、やはり複数対応していないようでし(2つまではなんとか可能でしたが).
というわけでVideoInputというライブラリ(DirectShowを楽に使うライブラリ)を、ここの記事を頼りにやってみました。
ライブラリはVisual Studio2005コンパイルverを2008で適用しましたが問題無かったです。これで複数カメラへの対応が可能にりました、ありがとうございます。
解説なかったら躓きそうな点として
ビルド時にatlthunk.lib リンカエラーが出たら
プロジェクト−プロパティ−構成プロパティ−リンカ−コマンドライン−追加のオプション に
/NODEFAULTLIB:"atlthunk"
と記述します.
ここらへんがあげられるかと
以下は複数カメラ(三台)の場合のサンプルです。
//---------------------------------------------------------------------- // 概要 : videoInputライブラリを用いたキャプチャサンプル(memcpy版)をちょっと変更したver // File Name : CaptureVI.cpp // Library : OpenCV for MS-Windows 1.0 / videoInput Library 0.195 // Author : dandelion // Date : Dec 29, 2008; 20:3r //---------------------------------------------------------------------- #include <iostream> #include <cstdlib> //ヘッダインクルード(OpenCV関連) #include <cv.h> #include <cxcore.h> #include <highgui.h> //ヘッダインクルード(videoInput Library関連) #include "videoInput.h" //ライブラリ読み込み(OpenCV関連) #pragma comment(lib,"cv.lib") #pragma comment(lib,"cxcore.lib") #pragma comment(lib,"highgui.lib") // ライブラリ読み込み(videoInput Library関連) #pragma comment(lib,"videoInput.lib") //定数 #define CAPTURE_WIDTH 320 //キャプチャサイズ(幅) #define CAPTURE_HEIGHT 240 //キャプチャサイズ(高さ) using namespace std; int main(void) { // device enum { device1, device2, device3, }; int key = 0; //キャプチャ画像 IplImage *image = cvCreateImage(cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3); IplImage *image2 = cvCreateImage(cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3); IplImage *image3 = cvCreateImage(cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3); //ウィンドウ char* window_name = "Capture using videoInput Library"; char* window_name2 = "Capture using videoInput2 Library"; char* window_name3 = "Capture using videoInput3 Library"; cvNamedWindow(window_name, CV_WINDOW_AUTOSIZE); cvNamedWindow(window_name2, CV_WINDOW_AUTOSIZE); cvNamedWindow(window_name3, CV_WINDOW_AUTOSIZE); //videoInputオブジェクト videoInput VI; //利用可能なキャプチャデバイス数を取得 int numDevices = VI.listDevices(); //キャプチャデバイスが見つからなかったら終了 if(numDevices == 0) { cerr << "[Error] Capture device not found!!" << endl; exit(-1); } //デバイス初期化(今回はデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ) VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT); VI.setupDevice(device2, CAPTURE_WIDTH, CAPTURE_HEIGHT); VI.setupDevice(device3, CAPTURE_WIDTH, CAPTURE_HEIGHT); //ESCキーが押されるまでキャプチャを続ける while(key != 0x1b) { //キャプチャ画像をimageDataにコピー memcpy(image->imageData, VI.getPixels(device1, false), image->imageSize); //画像表示 cvShowImage(window_name, image); memcpy(image->imageData, VI.getPixels(device2, false), image->imageSize); cvShowImage(window_name2, image); memcpy(image->imageData, VI.getPixels(device3, false), image->imageSize); cvShowImage(window_name3, image); //キー入力 key = cvWaitKey(1); } //後処理 VI.stopDevice(device1); VI.stopDevice(device2); VI.stopDevice(device3); cvDestroyWindow(window_name); cvDestroyWindow(window_name2); cvDestroyWindow(window_name3); cvReleaseImage(&image); return 0; }