元々は 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
Last-modified: 2021-09-21 (火) 10:34:32