s-yoshiki
9/27/2015 - 2:07 PM

FlycaptureSDK and OpenCV

FlycaptureSDK and OpenCV

#include "stdafx.h"
#include <pgrflycapture.h>

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>


int _tmain(int argc, _TCHAR* argv[])
{
	FlyCaptureContext flycapture;
	FlyCaptureError error;
	char window_name[] = "Camera image";

	// 初期化処理
	cvNamedWindow( window_name, CV_WINDOW_AUTOSIZE); // OpenCVのウインドウを作成する。ウインドウへのアクセスにはwindow_nameで指定した名前を使います

	FlyCaptureImage camera_image, rgb_image; // 画像保持用の構造体
	IplImage *cv_image; // OpenCVの画像

	error = flycaptureCreateContext( &flycapture); // コンテキストの作成

	error = flycaptureInitialize( flycapture, 0); // IEEE-1394バス上のひとつのカメラを初期化
	if ( error != FLYCAPTURE_OK) // カメラが認識されないと終了
		return 0;

	error = flycaptureStart( flycapture, FLYCAPTURE_VIDEOMODE_ANY, FLYCAPTURE_FRAMERATE_ANY); // カメラから画像の転送を開始する
	if ( error != FLYCAPTURE_OK)
		return 0;

	error = flycaptureGrabImage2( flycapture, &camera_image); // 画像サイズを得るために1回キャプチャする
	if ( error != FLYCAPTURE_OK) 
		return 0;

	unsigned char *bgr_buffer = new unsigned char[ camera_image.iRows * camera_image.iCols * 3]; // キャプチャした画像のサイズと同じサイズのRGB画像を保持するバッファの確保

	cv_image = cvCreateImage( cvSize( camera_image.iCols, camera_image.iRows), IPL_DEPTH_8U, 3); // OpenCV画像の作成(8ビット3チャネル)

	//
	// カメラから画像を取得し、表示するループ
	//
	while ( cvWaitKey( 10) == -1){ // キー入力があるまで繰り返す

		error = flycaptureGrabImage2( flycapture, &camera_image); // 画像をひとつメモリにキャプチャする
		if ( error != FLYCAPTURE_OK) 
			return 0;

		rgb_image.pData = bgr_buffer; // バッファを画像保持する構造体にセット
		rgb_image.pixelFormat = FLYCAPTURE_BGR; // RGB画像のフォーマットをWindowsで標準のBGR形式にセット
		
		error = flycaptureConvertImage( flycapture, &camera_image, &rgb_image); // カメラからキャプチャした画像をRGB画像に変換
		if ( error != FLYCAPTURE_OK)
			return 0;

		memcpy( cv_image->imageData, rgb_image.pData, rgb_image.iRows * rgb_image.iRowInc); // OpenCVの画像バッファにRGBバッファをコピー

		cvShowImage( window_name, cv_image); // ウインドウを描画
	}

	//
	// 終了処理
	//
	error = flycaptureStop( flycapture); // カメラからの画像転送を停止
	error = flycaptureDestroyContext( flycapture); // コンテキストを破棄

	cvReleaseImage( &cv_image); // OpenCV画像の解放
	cvDestroyWindow(window_name); // OpenCVウインドウの解放

	delete []bgr_buffer; // バッファの解放

	return 0;
}