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;
}

下図は三台カメラでのサンプルです

MacとかLinuxの場合はどうするのだろうかなぁ