Ovrvision用のキャプチャーソフトを書いてみている。
OpenCVという画像処理用ライブラリを使って、2つのカメラから画像を取り込んでOculus Rift DK1用に2枚の画像をそのまま位置だけ調節して出力してみた。
解像度が粗くて自分の手を映すとドット絵のように輪郭がカクカクになってしまった。(デジカメでOculus Rift DK1の中をのぞき込んで撮影してみた。)

OpenCVでDirectShowを使ったキャプチャーができるというのを教えて貰ったので、安定して動くようになった。
ソースコードも一応ここに晒しておく。
#include <stdio.h>
#include <stdlib.h>
#include "opencv2/opencv.hpp"
#pragma comment( lib, "lib/opencv_core242.lib")
#pragma comment( lib, "lib/opencv_highgui242.lib")
#pragma comment( lib, "lib/opencv_imgproc242.lib")
int main()
{
CvMemStorage *storage = 0;
CvCapture *capture1 = 0;
CvCapture *capture2 = 0;
IplImage *frame1, *frame2, *frame1_copy, *frame2_copy, *image;
CvRect rect1s,rect2s,rect1d,rect2d;
storage = cvCreateMemStorage(0);
int w,h,adj;
// open camera device
capture1 = cvCaptureFromCAM(CV_CAP_DSHOW + 0); // Right camera
capture2 = cvCaptureFromCAM(CV_CAP_DSHOW + 1); // Left camera
if ((!capture1)||(!capture2)) {
fprintf(stderr, "Error: Camera not found.\n"); getchar();
return -1;
}
// Open image window
cvNamedWindow("image", 0);
cvSetWindowProperty("image",CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN); // fullscreen
// frame
frame1 = cvQueryFrame(capture1);
frame1_copy = cvCreateImage(cvGetSize(frame1), 8, 3);
frame2 = cvQueryFrame(capture1);
frame2_copy = cvCreateImage(cvGetSize(frame2), 8, 3);
image = cvCreateImage(cvGetSize(frame1), 8, 3);
w = image->width;
h = image->height;
adj = w/32;
rect1s = cvRect(w/4+adj,0, w/2,h);
rect2s = cvRect(w/4-adj,0, w/2,h);
rect1d = cvRect(w/2,0, w/2,h);
rect2d = cvRect(0 ,0, w/2,h);
// main loop
while(1) {
if(cvWaitKey( 1 ) >= 0) { break; } // any key to quit
frame1 = cvQueryFrame(capture1); //capture a frame
frame2 = cvQueryFrame(capture2); //capture a frame
if (frame1->origin == IPL_ORIGIN_TL) {
cvCopy(frame1, frame1_copy); // copy frame
} else {
cvFlip(frame1, frame1_copy); // flip-copy frame
}
if (frame2->origin == IPL_ORIGIN_TL) {
cvCopy(frame2, frame2_copy); // copy frame
} else {
cvFlip(frame2, frame2_copy); // flip-copy frame
}
cvSetImageROI(frame1_copy,rect1s);
cvSetImageROI(image,rect1d);
cvCopy(frame1_copy, image); // copy frame
cvSetImageROI(frame2_copy,rect2s);
cvSetImageROI(image,rect2d);
cvCopy(frame2_copy, image); // copy frame
cvResetImageROI(image);
cvResetImageROI(frame1_copy);
cvResetImageROI(frame2_copy);
cvShowImage("image", image); // display
}
// release
cvReleaseCapture(&capture1);
cvReleaseCapture(&capture2);
cvDestroyAllWindows();
cvReleaseImage(&image);
cvReleaseImage(&frame2_copy);
cvReleaseImage(&frame1_copy);
return 0;
}