元々は DSE の wiki にあったコンテンツです。

現状とは異なる点が多々あるかもしれません。ご了承ください。

研究

What's CameraAgentPlugIn ?

CameraAgentPlugIn suit provides an abstract layer (functions) to access various kinds of camera and capture devices (such as USB Camera[WDM or VfW], ViewRanger[HTTP and JPEG decoder]). So you can use such devices via a DLL of this suit.

YES, NO NEED to make long long and too complicated codes like an use of DirectShow API.

Your task is so simple : make an instance of CameraAgentPlugIn class and call only a few methods.

Is the name of this suits curious ? It has long history but i can't describe it in english orz.

ARCHITECTURE

#ref(): File not found: "DeploymentDiagram.png" at page "研究/カメラエージェント君"

This suit is part of an architecture in a diagram above.

Your software is "Applications" in the diagram, and it connects via "Direct DLL Manipulation".

HOW TO USE

This is fragment code of ConsoleExample.cpp .

Firstly, you specify the include operation at the top of your source.

#include "CameraAgentPlugIn.h"

In "main" function, you'll make an instance of CameraAgentPlugIn class and manipulate it.

// make an instance of CameraAgentPlugIn
CameraAgentPlugIn capi;

Call "Open" and "OnInit" method to open and initialize the dll. After calling "OnInit" method, you can retrieve the device information from a member-variable named strDeviceName_.

// Call "Open" method to open dll. you can change dll filename as you need the type of device
if( !capi.Open( "WdmReader.dll" ) ) {
	printf( "cannot open DLL : %s\n", capi.strDllFilename_.c_str() );
	return -1;
}

// Call "OnInit" method to initialize dll, an argument is HWND of parent window. 
// some type of dll (mainly "VfwReader.dll") has to be supplid the parent window handle.
// but almost DLLs don't need HWND, you specify it as NULL simply.
if( !capi.OnInit( NULL ) ) {
	printf( "fault to initialize DLL\n" );
	return -1;
}

// device(DLL) info.
printf( "DLL:%s\n", capi.strDeviceName_.c_str() );

If your application needs specific resolution, you have to set the resolution by calling "SetResolution" method. If not, the resolution of the captured image is a default value of dll or device; all WDM-type device has the default resolution suitable for its porposes or spec.

// set/get resolution (if you need)
capi.SetResolution( 640, 480 );
long width = 0, height = 0;
capi.GetResolution( &width, &height );

Call "Capture" method to get the image of device.

The captured image is an instance of KImageRGB class. KImageRGB is supporting class for imaging operations; get width/height of image, color of pixel, raw buffer pointer of the image.

// capturing
KImageRGB image;
if( !capi.Capture( image ) ) {
	printf( "fault capturing...\n" );
	return -1;
}

Here is the sample code of KImageRGB class but it's useful i thought. Make brightness histogram of image. It's pretty simple.

// make brightness histogram ( N_DIV is a number of class )
#define	N_DIV	8
int np[N_DIV] = {0};
int y = 0;
for( y=0; y<image.height; y++ ) {
	for( int x=0; x<image.width; x++ ) {
		K_RGB p = image.pixel(x,y);

		// calc. histogram
		int g = (p.r+p.g+p.b)/3;
		for( int i=0; i<N_DIV; i++ ) {
			int lower_bound = 256*i/N_DIV;
			int upper_bound = 256*(i+1)/N_DIV;
			if( lower_bound <= g && g < upper_bound ) {
				np[i] ++;
				continue;	// exactly, you don't need this. 
			}
		}
	}
}
// show histogram
int n = 0, i = 0;
for( i=0; i<N_DIV; i++ ) n += np[i];
for( i=0; i<N_DIV; i++ ) {
	int lower_bound = 256*i/N_DIV;
	int upper_bound = 256*(i+1)/N_DIV;
	printf( "%3d-%3d:%6d: ", lower_bound, upper_bound-1, np[i] );
	int x = np[i]*70/n;
	for( int i=0; i<x; i++ ) putchar( '*' );
	printf( "\n" );
}

KImageRGB class has a function to save the image to bitmap file. Simply calling "save_to_bitmap" method by specifing a filename of bitmap file.

// save (if you need)
if( !image.save_to_bitmap( "capture.bmp" ) )
	printf( "fault to write bitmap...\n" );

REFERENCE

SEE ALSO

AUTHOR

CHANGE LOG

Free Talk

が,がんばって英語で書いてみます...

文法間違い等の訂正大歓迎.

英語だとあまり面白いことが書けないですね.ボキャブラリーのなさを露呈してます.

リファレンスも英語で書いてるんで,使う人はがんばって読んでくださいませ.

こういう説明書的な文書は .h ファイルとか Readme.txt に書くとバージョン管理ができない(だって最新版がどこにあるのか不明でしょ?)んで,Wiki に書くのが現実的な解だと思う.


潟若若菴遵

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS