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