Ovrvision用のキャプチャーソフトを書いてみている (その2)

Ovrvision用のキャプチャーソフトを書いてみている。

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

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



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Time limit is exhausted. Please reload CAPTCHA.

4 × 3 =