//
// list802.cpp    複数のカメラを使ったキャプチャ&グラブ ver1.0
//     list502.h、list502b.cppと一緒ににビルド
//    ○ビデオデバイスからのキャプチャのみ
// ○[プロジェクト][リンク]に strmiids.lib を追加
//  ○COMの操作はすべてHRESULTを返すが、プログラムを簡単にするため
//    最低限の吟味しか行っていない。
//    最大カメラ数は10を想定
//現在は接続カメラが2台であることが前提!!
#include <windows.h>
#include <dshow.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <qedit.h>            // SampleGrabber用
#include “list502.h”

void main()
{
//int aibo[3];//言え!AIBOはどこだ!どこに写っている!
//aibo[0]=aibo[1]=aibo[2]=aibo[3]=0;
IMG0 img00[10];
IMG0 img01[10];
int i,j;
long n,n2;
BYTE *buffer;
BYTE *buf2;
BYTE *buf3;
BYTE *buffer2;
BYTE *buf22;
BYTE *buf32;

ULONG cFetched;
AM_MEDIA_TYPE   amt;

CoInitialize(NULL);                                // COMの初期化

// —- キャプチャフィルタの準備 —-
// キャプチャデバイスを探す
ICreateDevEnum * pDevEnum = NULL;
IEnumMoniker * pClassEnum = NULL;
IBaseFilter  * pbf[10];
HRESULT hr;
IMoniker  * pMoniker[10];                        // 最大カメラ数10
// デバイス列挙子を作成
CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void ** ) &pDevEnum);
// ビデオキャプチャデバイス列挙子を作成
pDevEnum -> CreateClassEnumerator( CLSID_VideoInputDeviceCategory,
&pClassEnum, 0);
if ( pClassEnum == NULL ){
printf(”ビデオキャプチャデバイスは存在しません\n”);
pDevEnum -> Release();
CoUninitialize();
return ;
}
// ビデオキャプチャデバイスのオブジェクトの
// インタフェースを最大10個得る
pClassEnum -> Next(10, pMoniker, &cFetched);
printf(”カメラ数 %d 個\n”, cFetched );
for( i = 0; i < cFetched ; i++){
pMoniker[ i ] -> BindToObject( 0, 0, IID_IBaseFilter, (void**)&pbf[i] );
pMoniker[ i ] -> Release();
printf( “%d 個目のIBaseFilter取得 \n”, i+1 );
}
pDevEnum -> Release();
pClassEnum -> Release();

// —- フィルタグラフの準備 —-
// フィルタグラフを作り、インターフェースを得る
// 複数のカメラを一括制御ならフィルタグラフは1つでいい
IGraphBuilder * pGraph = NULL;
IMediaControl * pMC = NULL;
CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &pGraph);
pGraph -> QueryInterface( IID_IMediaControl, (LPVOID *) &pMC );
// カメラ数分のキャプチャフィルタをフィルタグラフに追加
for( i = 0 ; i < cFetched ; i++){
pGraph -> AddFilter( pbf[ i ], L”Video Device”);    // 名前は任意
printf( “%d 個目のAddFilter完了 \n”, i+1 );
}

// —- グラバフィルタの準備 —-
// グラバフィルタを作る、カメラの数だけ必要
IBaseFilter     * pF[ 10 ];
ISampleGrabber  * pGrab[ 10 ];                    // これらは後で解放すること。
ZeroMemory(&amt, sizeof(AM_MEDIA_TYPE));
amt.majortype  = MEDIATYPE_Video;
amt.subtype    = MEDIASUBTYPE_RGB24;
amt.formattype = FORMAT_VideoInfo;
for( i = 0 ; i < cFetched ; i++){
CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *)& pF[ i ]);
pF[ i ]    -> QueryInterface( IID_ISampleGrabber, (void **)&pGrab[ i ] );
// グラバフィルタの挿入場所の特定のための設定
pGrab[ i ] -> SetMediaType( &amt );
// グラバフィルタをフィルタグラフに追加
pGraph -> AddFilter(pF[ i ] , L”SampGrab”);
}

// —- キャプチャグラフの準備 —-
// キャプチャグラフを作る、カメラの数だけ必要
ICaptureGraphBuilder2 * pCapture[10];            // これらは後で解放すること。
for( i =0 ; i < cFetched ; i++){                // 最大カメラ数10
CoCreateInstance( CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &pCapture[ i ] );
// フィルタグラフをキャプチャグラフに組み込む
pCapture[ i ] -> SetFiltergraph( pGraph );
// キャプチャグラフの設定、グラバをレンダリング出力に設定
pCapture[ i ] -> RenderStream (NULL, NULL,
pbf[ i ] , NULL, pF[ i ]);
printf( “%d 個目のキャプチャグラフ完了 \n”, i+1 );
}

// —- 表示ウィンドウの準備 —-
//IMG0    img00[10];                                // 最大10ウインドウ
VIDEOINFOHEADER * pVideoHeader;
char cbuf1[200];
char cbuf2[200];
gr_reg();

// 表示ウィンドウの定義
for( i =0 ; i < cFetched ; i++){
// ビットマップ情報の取得
pGrab[ i ] -> GetConnectedMediaType( &amt );
// ビデオ ヘッダーへのポインタを獲得する。
printf( “カメラ%d amt.lSampleSize = %d (byte)\n”, i+1, amt.lSampleSize );
pVideoHeader = (VIDEOINFOHEADER * )amt.pbFormat;
// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
img00[ i ].bih = pVideoHeader->bmiHeader;

//後で修正する
if(i==0){
n = img00[i].bih.biSizeImage;
printf(”long n=%d\n”,n);
buffer = (BYTE *)malloc( n );
buf2 = (BYTE *)malloc( n );
buf3 = (BYTE *)malloc( n );
}
if(i==1){
n2 = img00[i].bih.biSizeImage;
printf(”long n2=%d\n”,n2);
buffer2 = (BYTE *)malloc( n2 );
buf22 = (BYTE *)malloc( n2 );
buf32 = (BYTE *)malloc( n2 );
}

printf( “width = %d , height %d , color %d \n”,
img00[ i ].bih.biWidth,
img00[ i ].bih.biHeight,
img00[ i ].bih.biBitCount );
img00[ i ].lpBmpData = (BYTE *)malloc( img00[ i ].bih.biSizeImage );
//————————————————-
img00[ i ].hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );
img00[ i ].x = 100 * i + 100; img00[ i ].y = 100 * i + 100;

img01[ i ].bih = pVideoHeader->bmiHeader;
printf( “width = %d , height %d , color %d \n”,
img01[ i ].bih.biWidth,
img01[ i ].bih.biHeight,
img01[ i ].bih.biBitCount );
img01[ i ].lpBmpData = (BYTE *)malloc( img01[ i ].bih.biSizeImage );
img01[ i ].hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );
img01[ i ].x = 100 * i + 100; img01[ i ].y = 100 * i + 200;

gr_init( &img00[ i ] );                        // 表示ウィンドウを作る
gr_init( &img01[ i ] );

wsprintf( cbuf1, “カメラ %d / %d”,i + 1 , cFetched );
SetWindowText( img00[ i ].hwnd, cbuf1 );
wsprintf( cbuf2, “カメラsa %d / %d”,i + 1 , cFetched );
SetWindowText( img01[ i ].hwnd, cbuf2 );
}
img00[0].lpBmpData=buffer;
img00[1].lpBmpData=buffer2;
img01[0].lpBmpData=buf2;
img01[1].lpBmpData=buf22;

// —-レンダリング開始,終了 —-
pMC -> Run();// レンダリング開始
double s;
for( i =0 ; i < cFetched ; i++)
pGrab[ i ] -> SetBufferSamples(TRUE);        // グラブ開始
int nn = 0;    // グラブ回数のカウント、意味はない
int xz;//画面のx座標
int yz;//画面のy座標
int rgb;
int xza,yza;//カメラAの重心の座標
int xzb,yzb;//カメラBの重心の座標
int counta,countb;
double siki,siki2=1;
printf(”開始?”);
getch();
printf(”\n”);
while(1){                                        // 0.5秒に1回グラブ
for( i =0 ; i < cFetched ; i++){
if(i==0) hr = pGrab[ i ] -> GetCurrentBuffer((long *)&(img00[ i ].bih.biSizeImage), (long *)buffer);
if(i==1) hr = pGrab[ i ] -> GetCurrentBuffer((long *)&(img00[ i ].bih.biSizeImage), (long *)buffer2);
}
//差分処理の追加はここ
//ここからカメラAの処理

s=0.0;
xz=0;
yz=0;
xza=0;
yza=0;
rgb=0;
counta=0;
for(j=0;j<n;j++){
rgb++;
buf2[j]=fabs((double)(buffer[j]-buf3[j]));
siki=buf2[j];
if(siki>200) {
if(xz%30==0)printf(”カメラA座標(x,y)=(%d,%d) RGB=%d の差分%d\n”,xz,yz,rgb,buf2[j]);
xza=xza+xz;
yza=yza+yz;
counta++;
}
//ここで重心を計算

if(rgb==3) {yz++; rgb=0;}
s=s+buf2[j];
if(yz==240){xz++; yz=0;}

}
printf(”カメラAの差分値%lf\n”,s/n);
if(counta!=0) printf(”カメラAの重心は(%d,%d)\n”,xza/counta,yza/counta);

//ここからカメラBの処理
s=0.0;
xz=0;
yz=0;
xzb=0;
yzb=0;
rgb=0;
countb=0;
for(j=0;j<n2;j++){
rgb++;
buf22[j]=fabs((double)(buffer2[j]-buf32[j]));
siki=buf22[j];
if(siki>200){
if(xz%30==0) printf(”カメラB座標(x,y)=(%d,%d) RGB=%d の差分%d\n”,xz,yz,rgb,buf22[j]);
xzb=xzb+xz;
yzb=yzb+yz;
countb++;
}
//ここで重心を計算
if(rgb==3) {yz++; rgb=0;}
s=s+buf22[j];
if(yz==288){xz++; yz=0;}
}
printf(”カメラBの差分値%lf\n”,s/n2);
if(countb!=0) printf(”カメラBの重心は(%d,%d)\n”,xzb/countb,yzb/countb);
//開放処理
for(i =0 ; i < cFetched ; i++){
InvalidateRect( img00[ i ].hwnd, NULL, FALSE);

InvalidateRect( img01[ i ].hwnd, NULL, FALSE);
}

printf(”グラブ  n = %d\n”, nn++ );
if( kbhit() ){
getch();                                // kbhitで取得したキーの破棄
pMC -> Pause();
printf( “グラブ停止:終了 — q 、再開 — その他のキー\n” );
if(getch() == ‘q’)
break;
pMC -> Run();
}
CopyMemory( buf3, buffer ,n);
CopyMemory( buf32,buffer2,n2);
Sleep(100);
}

// —- 終了処理 —-
// インターフェースのリリース
for( i =0; i < cFetched ; i++){
pGrab[ i ] -> Release();
pF[ i ] -> Release();
pCapture[ i ] -> Release();                    // キャプチャグラフ用
pbf[ i ] -> Release();                        // キャプチャフィルタ用
free( img00[ i ].lpBmpData );
free( img01[ i ].lpBmpData );
}
pMC -> Release();                                // フィルタグラフ用
pGraph -> Release();
// COMのリリース
CoUninitialize();

}

やっと閑静

#include <windows.h>
#include <dshow.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <qedit.h>            // SampleGrabber用
#include “list502.h”

void main()
{
IMG0 img00[10];
IMG0 img01[10];
int i,j;
long n,n2;
BYTE *buffer;
BYTE *buf2;
BYTE *buf3;
BYTE *buffer2;
BYTE *buf22;
BYTE *buf32;

ULONG cFetched;
AM_MEDIA_TYPE   amt;

CoInitialize(NULL);                                // COMの初期化

// —- キャプチャフィルタの準備 —-
// キャプチャデバイスを探す
ICreateDevEnum * pDevEnum = NULL;
IEnumMoniker * pClassEnum = NULL;
IBaseFilter  * pbf[10];
HRESULT hr;
IMoniker  * pMoniker[10];                        // 最大カメラ数10
// デバイス列挙子を作成
CoCreateInstance( CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
IID_ICreateDevEnum, (void ** ) &pDevEnum);
// ビデオキャプチャデバイス列挙子を作成
pDevEnum -> CreateClassEnumerator( CLSID_VideoInputDeviceCategory,
&pClassEnum, 0);
if ( pClassEnum == NULL ){
printf(”ビデオキャプチャデバイスは存在しません\n”);
pDevEnum -> Release();
CoUninitialize();
return ;
}
// ビデオキャプチャデバイスのオブジェクトの
// インタフェースを最大10個得る
pClassEnum -> Next(10, pMoniker, &cFetched);
printf(”カメラ数 %d 個\n”, cFetched );
for( i = 0; i < cFetched ; i++){
pMoniker[ i ] -> BindToObject( 0, 0, IID_IBaseFilter, (void**)&pbf[i] );
pMoniker[ i ] -> Release();
printf( “%d 個目のIBaseFilter取得 \n”, i+1 );
}
pDevEnum -> Release();
pClassEnum -> Release();

// —- フィルタグラフの準備 —-
// フィルタグラフを作り、インターフェースを得る
// 複数のカメラを一括制御ならフィルタグラフは1つでいい
IGraphBuilder * pGraph = NULL;
IMediaControl * pMC = NULL;
CoCreateInstance( CLSID_FilterGraph, NULL, CLSCTX_INPROC,
IID_IGraphBuilder, (void **) &pGraph);
pGraph -> QueryInterface( IID_IMediaControl, (LPVOID *) &pMC );
// カメラ数分のキャプチャフィルタをフィルタグラフに追加
for( i = 0 ; i < cFetched ; i++){
pGraph -> AddFilter( pbf[ i ], L”Video Device”);    // 名前は任意
printf( “%d 個目のAddFilter完了 \n”, i+1 );
}

// —- グラバフィルタの準備 —-
// グラバフィルタを作る、カメラの数だけ必要
IBaseFilter     * pF[ 10 ];
ISampleGrabber  * pGrab[ 10 ];                    // これらは後で解放すること。
ZeroMemory(&amt, sizeof(AM_MEDIA_TYPE));
amt.majortype  = MEDIATYPE_Video;
amt.subtype    = MEDIASUBTYPE_RGB24;
amt.formattype = FORMAT_VideoInfo;
for( i = 0 ; i < cFetched ; i++){
CoCreateInstance( CLSID_SampleGrabber, NULL, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, (LPVOID *)& pF[ i ]);
pF[ i ]    -> QueryInterface( IID_ISampleGrabber, (void **)&pGrab[ i ] );
// グラバフィルタの挿入場所の特定のための設定
pGrab[ i ] -> SetMediaType( &amt );
// グラバフィルタをフィルタグラフに追加
pGraph -> AddFilter(pF[ i ] , L”SampGrab”);
}

// —- キャプチャグラフの準備 —-
// キャプチャグラフを作る、カメラの数だけ必要
ICaptureGraphBuilder2 * pCapture[10];            // これらは後で解放すること。
for( i =0 ; i < cFetched ; i++){                // 最大カメラ数10
CoCreateInstance( CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &pCapture[ i ] );
// フィルタグラフをキャプチャグラフに組み込む
pCapture[ i ] -> SetFiltergraph( pGraph );
// キャプチャグラフの設定、グラバをレンダリング出力に設定
pCapture[ i ] -> RenderStream (NULL, NULL,
pbf[ i ] , NULL, pF[ i ]);
printf( “%d 個目のキャプチャグラフ完了 \n”, i+1 );
}

// —- 表示ウィンドウの準備 —-
//IMG0    img00[10];                                // 最大10ウインドウ
VIDEOINFOHEADER * pVideoHeader;
char cbuf1[200];
char cbuf2[200];
gr_reg();

// 表示ウィンドウの定義
for( i =0 ; i < cFetched ; i++){
// ビットマップ情報の取得
pGrab[ i ] -> GetConnectedMediaType( &amt );
// ビデオ ヘッダーへのポインタを獲得する。
printf( “カメラ%d amt.lSampleSize = %d (byte)\n”, i+1, amt.lSampleSize );
pVideoHeader = (VIDEOINFOHEADER * )amt.pbFormat;
// ビデオ ヘッダーには、ビットマップ情報が含まれる。
// ビットマップ情報を BITMAPINFO 構造体にコピーする。
img00[ i ].bih = pVideoHeader->bmiHeader;

//後で修正する
if(i==0){
n = img00[i].bih.biSizeImage;
printf(”long n=%d\n”,n);
buffer = (BYTE *)malloc( n );
buf2 = (BYTE *)malloc( n );
buf3 = (BYTE *)malloc( n );
}
if(i==1){
n2 = img00[i].bih.biSizeImage;
printf(”long n2=%d\n”,n2);
buffer2 = (BYTE *)malloc( n2 );
buf22 = (BYTE *)malloc( n2 );
buf32 = (BYTE *)malloc( n2 );
}

printf( “width = %d , height %d , color %d \n”,
img00[ i ].bih.biWidth,
img00[ i ].bih.biHeight,
img00[ i ].bih.biBitCount );
img00[ i ].lpBmpData = (BYTE *)malloc( img00[ i ].bih.biSizeImage );
//—————————————————-
//        if(i==0) buffer=img00[i].lpBmpData;
//        if(i==1) buffer2=img00[i].lpBmpData;
//——————————————————
img00[ i ].hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );
img00[ i ].x = 100 * i + 100; img00[ i ].y = 100 * i + 100;

img01[ i ].bih = pVideoHeader->bmiHeader;
printf( “width = %d , height %d , color %d \n”,
img01[ i ].bih.biWidth,
img01[ i ].bih.biHeight,
img01[ i ].bih.biBitCount );
img01[ i ].lpBmpData = (BYTE *)malloc( img01[ i ].bih.biSizeImage );
img01[ i ].hi = (HINSTANCE)GetWindowLong( HWND_DESKTOP, GWL_HINSTANCE );
img01[ i ].x = 100 * i + 100; img01[ i ].y = 100 * i + 200;

gr_init( &img00[ i ] );                        // 表示ウィンドウを作る
gr_init( &img01[ i ] );

wsprintf( cbuf1, “カメラ %d / %d”,i + 1 , cFetched );
SetWindowText( img00[ i ].hwnd, cbuf1 );
wsprintf( cbuf2, “カメラsa %d / %d”,i + 1 , cFetched );
SetWindowText( img01[ i ].hwnd, cbuf2 );
}
img00[0].lpBmpData=buffer;
img00[1].lpBmpData=buffer2;
img01[0].lpBmpData=buf2;
img01[1].lpBmpData=buf22;

// —-レンダリング開始,終了 —-
pMC -> Run();// レンダリング開始
double s;
for( i =0 ; i < cFetched ; i++)
pGrab[ i ] -> SetBufferSamples(TRUE);        // グラブ開始
int nn = 0;                            // グラブ回数のカウント、意味はない
printf(”開始?”);
getch();
printf(”\n”);
while(1){                                        // 0.5秒に1回グラブ
for( i =0 ; i < cFetched ; i++){
//hr = pGrab[ i ] -> GetCurrentBuffer((long *)&(img00[ i ].bih.biSizeImage),(long *)(img00[ i ].lpBmpData) );
if(i==0) hr = pGrab[ i ] -> GetCurrentBuffer((long *)&(img00[ i ].bih.biSizeImage), (long *)buffer);
if(i==1) hr = pGrab[ i ] -> GetCurrentBuffer((long *)&(img00[ i ].bih.biSizeImage), (long *)buffer2);
}
//差分処理の追加はここ

s=0.0;
for(j=0;j<n;j++){
buf2[j]=fabs((double)(buffer[j]-buf3[j]));
s=s+buf2[j];
}
printf(”グラブ hr = %x, n = %f\n”, hr, s / n);

s=0.0;
for(j=0;j<n2;j++){
buf22[j]=fabs((double)(buffer2[j]-buf32[j]));
s=s+buf22[j];
}
printf(”グラブ hr = %x, n = %f\n”, hr, s / n);
for(i =0 ; i < cFetched ; i++){
InvalidateRect( img00[ i ].hwnd, NULL, FALSE);
printf(”Rwctwindow00-%d\n”,i);
InvalidateRect( img01[ i ].hwnd, NULL, FALSE);
printf(”Rwctwindow01-%d\n”,i);
}

printf(”グラブ  n = %d\n”, nn++ );
if( kbhit() ){
getch();                                // kbhitで取得したキーの破棄
pMC -> Pause();
printf( “グラブ停止:終了 — q 、再開 — その他のキー\n” );
if(getch() == ‘q’)
break;
pMC -> Run();
}
CopyMemory( buf3, buffer ,n);
CopyMemory( buf32,buffer2,n2);
Sleep(100);
}

// —- 終了処理 —-
// インターフェースのリリース
for( i =0; i < cFetched ; i++){
pGrab[ i ] -> Release();
pF[ i ] -> Release();
pCapture[ i ] -> Release();                    // キャプチャグラフ用
pbf[ i ] -> Release();                        // キャプチャフィルタ用
free( img00[ i ].lpBmpData );
}
pMC -> Release();                                // フィルタグラフ用
pGraph -> Release();
// COMのリリース
CoUninitialize();

}

#include <stdio.h>
#include <string.h>
#include <string>
#include <windows.h>
#include <dshow.h>
#include <time.h>
#include <qedit.h> // SampleGrabber用
#include <locale.h>
#define RECLIMIT 3 //録画する秒数をここで指定する

int main()
{
int answer,reu;
clock_t start,end;
char filenum[20];
char filename[11]=”result.bmp”;
int filecount=1;
IGraphBuilder *pGraphBuilder;
ICaptureGraphBuilder2 *pCaptureGraphBuilder2;
IMediaControl *pMediaControl;

// 補足情報)英単語の日本語訳
//   Enumerate : 列挙、一覧
//   Moniker   : あだ名
ICreateDevEnum *pCreateDevEnum = NULL;
IEnumMoniker *pEnumMoniker = NULL;
IMoniker *pMoniker = NULL;

ULONG nFetched = 0;
IBaseFilter *pDeviceFilter;

// COMを初期化
CoInitialize(NULL);

// FilterGraphを生成
CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);

//
// SampleGrabber準備
//

IBaseFilter *pSampleGrabberFilter;
ISampleGrabber *pSampleGrabber;
AM_MEDIA_TYPE am_media_type;

// SampleGrabber(Filter)を生成
CoCreateInstance(CLSID_SampleGrabber,NULL,CLSCTX_INPROC,IID_IBaseFilter,(LPVOID *)&pSampleGrabberFilter);

// FilterからISampleGrabberインターフェースを取得します
pSampleGrabberFilter->QueryInterface(IID_ISampleGrabber,(LPVOID *)&pSampleGrabber);

// SampleGrabberを接続するフォーマットを指定。
// ここがポイントです。
// ここの指定の仕方によりSampleGrabberの挿入箇所を
// 決定できます。このサンプルのような指定をすると
// 画面出力の寸前でサンプルを取得できます。
ZeroMemory(&am_media_type, sizeof(am_media_type));
am_media_type.majortype = MEDIATYPE_Video;
am_media_type.subtype = MEDIASUBTYPE_RGB24;
am_media_type.formattype = FORMAT_VideoInfo;
pSampleGrabber->SetMediaType(&am_media_type);

// GraphにSampleGrabber Filterを追加
pGraphBuilder->AddFilter(pSampleGrabberFilter,
L”Sample Grabber”);

//
// キャプチャ用デバイス取得
//

// CaptureGraphBuilder2というキャプチャ用GraphBuilderを生成する
CoCreateInstance(CLSID_CaptureGraphBuilder2,NULL,CLSCTX_INPROC,IID_ICaptureGraphBuilder2,(LPVOID *)&pCaptureGraphBuilder2);

// FilterGraphをセットする
pCaptureGraphBuilder2->SetFiltergraph(pGraphBuilder);

// MediaControlインターフェース取得
pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl);

// デバイスを列挙するためのCreateDevEnumを生成
CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER,IID_ICreateDevEnum, (PVOID *)&pCreateDevEnum);

// VideoInputDeviceを列挙するためのEnumMonikerを生成
pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory,&pEnumMoniker, 0);
if (pEnumMoniker == NULL) {
// 接続された映像入力デバイスが一つも無い場合にはこのif文に入ります
printf(”no device\n”);
return 0;
}

// EnumMonikerをResetする
// Resetすると、先頭から数えなおします
pEnumMoniker->Reset();

// 最初のMonikerを取得
pEnumMoniker->Next(1, &pMoniker, &nFetched);

// MonkierをFilterにBindする
pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pDeviceFilter );

// FilterGraphにデバイスフィルタを追加する
pGraphBuilder->AddFilter(pDeviceFilter, L”Device Filter”);

// この時点でMonkier系、Enumerate系は用済み
pMoniker->Release();
pEnumMoniker->Release();
pCreateDevEnum->Release();

//
// PreviewのためのVideoRendererを用意します
//
IBaseFilter *pVideoRenderer;
CoCreateInstance(CLSID_VideoRenderer,NULL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,(LPVOID *)&pVideoRenderer);
pGraphBuilder->AddFilter(pVideoRenderer, L”Video Renderer”);

// Graphを生成する
// SampleGrabberを間に入れて、
// RendererとしてはVideoRendererを利用します
pCaptureGraphBuilder2->RenderStream(&PIN_CATEGORY_PREVIEW,NULL, pDeviceFilter, pSampleGrabberFilter, pVideoRenderer);

//
// SampleGrabberから情報を取得
//

// 接続情報取得。
// この処理はRenderFileによりGraphが構成された後に
// 行う必要があります。
pSampleGrabber->GetConnectedMediaType(&am_media_type);
VIDEOINFOHEADER *pVideoInfoHeader =
(VIDEOINFOHEADER *)am_media_type.pbFormat;

// 画像(映像)の幅と高さを表示
// サンプルをわかりやすくするために表示しているだけなので、
// 必ず必要というわけではありません。
printf(”size = %dx%d\n”,pVideoInfoHeader->bmiHeader.biWidth,pVideoInfoHeader->bmiHeader.biHeight);

// データサイズを表示
// これも説明のために表示しています。
printf(”sample size = %d\n”,am_media_type.lSampleSize);

// Grabを行う事を設定
// SetBufferSamplesを行わないとバッファから
// データを取得できません。
// 不必要に負荷をかけたくない場合にはFALSEにしておいて、
// データを取得したくなったら、TRUEに変える
// という方法もできます。
pSampleGrabber->SetBufferSamples(TRUE);

// 再生開始
pMediaControl->Run();
start:
// OKが押されるとBITMAPを保存します
answer=MessageBox(NULL,TEXT(”3SECONDS SHOT”), TEXT(”Block”), MB_OKCANCEL);
if(answer==IDOK){
start = clock();
//システム時間処理スタート
while(1){

end = clock();
if((double)(end-start)/CLOCKS_PER_SEC>RECLIMIT) break;

// OKでBITMAPを保存するCANCELで終了する

// バッファを用意
long nBufferSize = am_media_type.lSampleSize;
long *pBuffer = (long *)malloc(nBufferSize);

// 現在表示されている映像を静止画として取得
pSampleGrabber->GetCurrentBuffer(&nBufferSize,pBuffer);

//
// Bitmapに保存。
// このサンプルではキャプチャ結果を見るために
// Bitmapに保存しています。
//
HANDLE fh;
BITMAPFILEHEADER bmphdr;
DWORD nWritten;

memset(&bmphdr, 0, sizeof(bmphdr));

bmphdr.bfType = (’M’ << 8) | ‘B’;
bmphdr.bfSize = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER) + nBufferSize;
bmphdr.bfOffBits = sizeof(bmphdr) + sizeof(BITMAPINFOHEADER);

//ファイル名を取得する

//strcat(filename,nameplus);
reu=sprintf(filenum,”%d%s”,filecount,filename);
fh = CreateFile(filenum,GENERIC_WRITE,0,NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
filecount++;
//エラー処理
if (fh == INVALID_HANDLE_VALUE) {
MessageBox(NULL , TEXT(”ファイルを作成できませんでした”) ,TEXT(”エラー”) , MB_OK);
return 1;
}

WriteFile(fh, &bmphdr, sizeof(bmphdr), &nWritten, NULL);
WriteFile(fh,
&pVideoInfoHeader->bmiHeader,
sizeof(BITMAPINFOHEADER), &nWritten, NULL);
WriteFile(fh, pBuffer, nBufferSize, &nWritten, NULL);
CloseHandle(fh);

free(pBuffer);
}
goto start;
}
if(answer==IDCANCEL){
// 資源を解放
pSampleGrabber->Release();
pSampleGrabberFilter->Release();
pVideoRenderer->Release();

// 資源を解放
pMediaControl->Release();
pCaptureGraphBuilder2->Release();
pGraphBuilder->Release();

// COM終了
CoUninitialize();

return 0;
}
}

問題1
実質的意味の憲法と立憲的意味の憲法について説明せよ。
回答例
実質的意味の憲法とは、国家の統治の基本的体制または根本の秩序を定める法規範全体のことである。そこには、当地の主体、組織、作用、治者と被治者の関係などについての基礎的な事柄を定める法が含まれている。
これに対して立憲的意味の憲法とは何か。
イギリスにおいては中世においてすぐに「国王といえども神と法の下にある」という思想があり、この「法の支配」の原理は、君主の専制権力を否定し、それが法によって規律されることを認めたものであって、立憲主義のきざしといえるものである。
多くの国で絶対主義体勢が崩壊し、近代的意味での憲法が確定されていった。
フランス人権宣言は、このような憲法概念の成文の表現として典型的なものである。

問題2
明治憲法の成立過程について説明せよ
回答例
五箇条のご誓文の中には政治への参加者の範囲を拡大した点において民主的議会制の考え方の萌芽を含んでいた。それは封建制の解体とともに、おのずから民選議会の設置の要求へと進んでいった。この民選議会設立への動きとならんで、政府は成文憲法の制定にも熱意を示した。1881年、国会開設の勅諭が発せられ、1890年に議会を開設し、それまでに憲法を制定することが宣言された。調査のために伊藤博文がヨーロッパに派遣され、ドイツの憲法を学んだ。ドイツの立憲君主制は民選議会を認めながらも天皇の権力を最大限に温存したい日本にとって最も適していたからである。
伊藤博文が帰国した後に1889年2月11日「大日本帝国憲法」が発布された。

問題3
日本国憲法の制定過程について説明せよ
回答例
1945年、日本はポツダム宣言を受諾した。その内容には日本の政治が民主、自由、平和の方向に改革されねばならないことが示されていた。しかし明治憲法には反民主的要素があったので連合国最高司令官(まっかーさー)から憲法改正を支持された。ここで政府が作成したのが松本案であったが、天皇が統治権を持つことなどに変更がなかったため拒否された。最高司令官は極東委員会に文句を言われる前になんとしても憲法を公布し既成事実を作っておきたかったので「天皇の地位」「戦争放棄」「封権制の廃止」というマッカーサーの三原則を基礎として全く別の憲法案を示した。これはほとんどそのまま政府によって採択され1946年11月3日に交付、1947年5月3日に施行された。
問題4
国民とは何か説明せよ
回答例
国民とは、国家の構成員としての人間を意味する。その意味の国民は、その所在地に関わりなく、属人的に国家に結びつき、自国の統治権に服する。国民には未成年者も天皇も含まれる。
正式の国民たる資格を国籍と呼ぶ。日本国憲法も日本国民たる要件は法律で定めるものとし、国籍法が日本の国籍について規定している。
国籍の取得には先天的所得と後天的所得があり、先天的取得に関しては血統主義が採用されている。後天的取得に関しては、一定の要件を満たした外国人が法務大臣の許可を得て帰化することによって取得できる。
国籍の喪失は外国に国籍を取得している場合に限って認められている。

問題5
選挙(普通選挙)について説明せよ
回答例
日本では長い間、財産的要件のある制限選挙が行なわれていたが、1925年に25歳以上の全ての男子に選挙権が認められ、1945年には婦人参政権が実現された。
日本国憲法では普通選挙が保障され、「人種、信条、性別、社会的身分、門地、教育、財産または収入によって差別してはならない」と規定されている。
なお、普通選挙といっても全く制限が無いわけではない。国籍による制限はその一例である。
また、国会議員の被選挙権に関しても憲法では選挙権と同じく差別しないことを定めている。しかし、年齢制限が高いことや、選挙事務関係者の立候補禁止、また衆議院と参議院の兼職の禁止などの制限がある。

運営のバカヤロー

大規模アップデートしたって接続できなきゃ意味ねーだろーが

さて

基本的にはGRWINと同じ考え方

偶然出来上がった桜の花びらを描くプログラム

#include <stdio.h>
#include <math.h>
#include “opgls.ft”

void draw_rect(void){
int n;
double i;
glclear();
glcolor(255,0,0);
//gpnt(0,10);//桜の花びら
for(n=100;n<=200;n=n+20){
for(i=0;i<=180;i=i+0.1){
glcolor(255,n,(int)i);
grect(n*sin(i),n*sin(i)+1,n*cos(i),n*cos(i)+1);
}
}
glflush();
}
void main(void){
ginit(1);
gdisplay(draw_rect);
}

運営のバカヤロー 丸一日緊急メンテナンスやってんじゃね~

あと2つで3次転職なんだよさっさとやらせろ

なんのための土曜日だとおもってんだよ!(謎

さて、フーリエ解析のメモ

complexをインクルードするのかと思ったらしなくてもできるっぽい

complexはdoubleに変換できない!という痛い目をみるだけだった

#include<stdio.h>
#include<math.h>

double pai = 3.141592;

double g[1000],ck[1000][2];
int n=250;

void DFT(int k){
int j;
double im=0.0,re=0.0;    /* im:虚数部  re:実数部 */
double s;    /* 位相 */

for(j=0;j<n;j++){
s = 2.0*pai/(double)n*(double)k*(double)j;
re = re+g[j]*cos(s);
im = im+g[j]*-1*sin(s);
}

im = im/(double)n;
re = re/(double)n;

ck[k][0] = sqrt(im*im+re*re);    /* |Ck| */
return;
}

void main(){
FILE *fp;
int i;

if((fp = fopen(”ck.csv”,”w”)) == NULL)
printf(”file open error!!\n”);

for(i=0;i<n;i++)
g[i] = sin(2.0*pai*(double)i*0.01);

for(i=0;i<n;i++){
DFT(i);
fprintf(fp,”%2d,%lf,%lf,\n”,i,g[i],ck[i][0]);
}

fclose(fp);

return;

}

 

プログラムの内容

生徒の名前と名前に対応するIDが格納されているファイルと、生徒のIDと得点が格納されているファイルがある。ただし、格納されている順番はばらばらである。

この2つのファイルを読み込んで、名前とIDと得点を格納するファイルを作成する。

file01.txtの内容(名前とID)
kyohei 40544
kou 81345
ryo 89742
taku 89871

file02.txtの内容(IDと得点)
81345 85
40544 90
89871 77
89742 99

実行後にfile03.txtに書き込まれる内容
kou 81345 85
kyohei 40544 90
taku 89871 77
ryo 89742 99

プログラムリスト

#include <stdio.h>

#include <string.h>//strcpyを使用するのに必要となる

#define MAX 50 //人数の最大数

struct nameid{ //名前とIDと点数を格納できる構造体の型

              char name[20];

              int id;

              int point;

};

struct idpoint{ //IDと点数を格納できる構造体の型

              int id;

              int point;

};

int  read03(int id,struct nameid *kaku){

              if(id==kaku->id){

                            return 1;

              }

              else return 0;

}

void read02(int id,int point,struct idpoint *yobi){

              yobi->id=id;

              yobi->point=point;

}

void read01(char name[],int id,struct nameid *kaku){

              strcpy(kaku->name,name);

              kaku->id=id;

}

int main(){

              FILE *fp1=fopen(”file01.txt”,”r”);//名前とIDが格納されたリストファイル

              FILE *fp2=fopen(”file02.txt”,”r”);//IDと点数が格納されたリストファイル

              FILE *fp3=fopen(”file03.txt”,”w”);//2つのファイルを適切に結合させるファイル

              struct nameid kaku[MAX];//ファイルに出力するための構造体を定義

              struct idpoint yobi[MAX];//一時的に点数を入れておく予備の構造体を定義

              char name[20];

              int i,j,t,id,point;

              int kuri=0;//インクリメント用変数

              while(fscanf(fp1,”%s %d”,&name,&id)!=EOF){

                            read01(name,id,&kaku[kuri]);

                            kuri++;

              }

              kuri=0;//インクリメント用変数を0にリセット

              while(fscanf(fp2,”%d %d”,&id,&point)!=EOF){

                            read02(id,point,&yobi[kuri]);

                            kuri++;

              }

              for(i=0;i<=kuri;i++){

                            id=yobi[i].id;

                            for(j=0;j<=kuri;j++){

                                         

                                          t=read03(id,&kaku[j]);

                                          if(t==1){

                                                        kaku[j].point=yobi[i].point;

                                                        fprintf(fp3,”%s %d %d\n”,kaku[j].name , kaku[j].id , kaku[j].point);

                                          }

                            }

              }

              printf(”right\n”);//プログラムの正常終了の確認

              fclose(fp1);

              fclose(fp2);

              fclose(fp3);

              return 0;

}

解説

2つの構造体をmainで定義して、ユーザー定義関数read01read02には構造体への

アドレス(場所)を送って、構造体の実体はmainにおきながら構造体の中の変数に値を格納させた。

インクリメント用変数kuriを使用し、main関数内でファイルのデータを読みこんで、

読み込んだデータと、構造体配列へのアドレスをread01read02に送る。

read01では構造体配列kaku[kuri]file01.txtから読み込んだ名前とIDを入れる。

read02では構造体配列yobi[kuri]file02.txtから読み込んだIDと点数を入れる。

上の2つの処理が終わった時点で、インクリメント用変数kuriは読み込んだオブジェクトの数(読み込んだファイルの行数)になっているのでこれをそのまま使用した。

forループを2つ重ねて、2つの構造体に含まれるIDのデータを照らし合わせる。

これも関数read03へ構造体配列kaku[ ]のアドレスと構造体配列yobi[ ]に含まれる IDのデータを送る。

関数read03は、送られてきた2つのデータを比べて、一致したなら1を返し、一致しなければ0を返す。

返された値が1の場合のみfile03.txtに名前とIDと点数を書き込み、改行する。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct LIST
{
/* 具体的なデータ */
char name[20];//名前
char tel[20]; //番号
char add[70]; //メールアドレス
struct LIST* next; /* 次の要素へのポインタ */
};
struct LIST head; /* リストの先頭要素(ダミー) */

/* プロトタイプ宣言 */
void addlist(void);
void deletelist(void);
void showlist(void);

//FILE *fp1=fopen(”file01.txt”,”r”);
int main(void)
{
char command;

head.next = NULL;

do
{
clrscr();
puts( “コマンドを入力して下さい” );
puts( “名前、電話番号、メールアドレスの追加:a” );
puts( “リスト構造から既存のデータを削除する:b” );
puts( “リスト構造に格納したデータを一覧表示:c” );
puts( “終了:q” );
scanf( “%c”, &command );

switch( command )
{
case ‘a’: /* 追加 */
addlist();
break;
case ‘b’: /* 削除 */
deletelist();
break;
case ‘c’: /* 表示 */
showlist();
printf(”\nなにかキーを押すと戻ります\n”);
getch();
break;
case ‘q’: /* 終了 */
break;
default: /* 無効 */
puts( “コマンドが正しくありません” );
break;
}

puts( “” );
fflush( stdin );

}while( command != ‘q’ );

return 0;
}

/* 線形リストに要素を追加する */
void addlist(void)
{
struct LIST* p, *q, *newcell;
int naga;
char name[20];
char tel[20];
char add[70];

puts( “追加する名前、番号、メールアドレスを入力して下さい” );
// fscanf(fp1, “%s %s %s”,name,tel,add );
scanf( “%s %s %s”,name,tel,add );
naga=strlen(name);
p = head.next; /* 先頭要素の次の要素のアドレス */
q = &head; /* 先頭要素のアドレス */
while( p != NULL && naga > (int)strlen(p->name) )
//文字数を比較して文字数が少ないほうがリストの上(最初のほう)に来るようにする処理
{
q = p; /* 追加位置の直前の要素のnextを後で設定するために、
追加位置の直前の要素のアドレスを記憶しておく */
p = p->next; /* 次の要素へ進む */
}

/* 新しく追加する要素のためのメモリ領域を確保する */
newcell = (struct LIST*)malloc( sizeof(struct LIST) );
if( newcell == NULL )
{
puts( “メモリ不足” );
return;
}

// newcell->data = data; /* 新しい要素のデータを設定 */
strcpy(newcell->name,name);
strcpy(newcell->tel,tel);
strcpy(newcell->add,add);

newcell->next = p; /* 新しい要素の次の要素へのアドレスを設定 */
q->next = newcell; /* 新しい要素の直前の要素のnextに、新しい要素のアドレスを設定 */
}

/* 線形リストから要素を削除する */
void deletelist(void)
{
struct LIST *p, *q;
char name[20];

puts( “削除する名前を入力して下さい” );
scanf( “%s”,name);

p = head.next; /* 先頭要素の次の要素のアドレス */
q = &head; /* 先頭要素のアドレス */
while( p != NULL && strstr(name,p->name)==NULL )
{
q = p; /* 削除位置の直前の要素のnextを後で設定するために、
削除位置の直前の要素のアドレスを記憶しておく */
p = p->next; /* 次の要素へ進む */
}

if( p == NULL ) /* 一致する値がないままリストの末尾まで来た */
{
puts( “指定された要素はリスト内に存在しません” );
getch();
}
else
{
q->next = p->next; /* 削除する要素の直前の要素のnextポインタを再設定 */
free( p ); /* 要素はmallocで確保されているのでfreeで解放する */
}
}

/* 線形リストの内容を表示する */
void showlist(void)
{
struct LIST *p;

for( p=head.next; p!=NULL; p=p->next )
{
printf( “%s %s %s\n”, p->name,p->tel,p->add );
}
}

IT関連の会社に応募する際の志望動機サンプル(自作)

質問:自己PRを2分以内でおねがいします

私は昔からコンピュータが好きでOOでも情報技術を専攻しました。

学校でも、プログラミングなどの情報系の科目が得意で、OOOOOOOOOをすることができ自信がつきました。
社会に出てからも、情報分野で自分を成長させるために情報技術者の道を目指しています。
会社案内を見て会社訪問させていただき、御社のOOOOOOOOOOOOを知ることができ、

非常に心惹かれました。その中でもとくにすばらしいと感じたのはOOOOOOOOOです。
これはOOOOやOOOO等さまざまな分野で応用が効き、これからも発展することが可能であると確信しました。
このような情報システム開発や管理に携わるため、御社で情報技術者として働きたいと願っております。

質問: 当社でどんな仕事をしたいかを具体的にお話しください(志望動機を1分程度でおねがいします)

私は、 会社案内を見て会社訪問させていただき、御社のOOOOOOOOOOOOを知ることができ、

非常に心惹かれました。その中でもとくにすばらしいと感じたのはOOOOOOOOOです。
これはOOOOやOOOO等さまざまな分野で応用が効き、これからも発展することが可能であると確信しました。
このような情報システムの開発や管理に携わるため、御社で情報技術者として働きたいと願っております。

質問:卒業研究はなにをしていますか

テーマ名は4速歩行ロボットのオンライン学習システムの構築です。

具体的にはロボットの歩行する場面をカメラで読み取り、ロボット本体のセンサーから送られてくる 情報もあわせて

正しい歩き方をしているかどうか判断するシステムの開発をしています。

履歴書と面接のあれこれ

どうやら志望動機と自己PRはほとんど同一のものらしい。

履歴書などを書くときに使用したものをそのまま使える。

あとは笑顔で堂々と入室し、自信をもって答えることかな。

心構えは「自分を採用しないと他の企業に行くしかない 俺を蹴ったことを後悔するぜ~ 」

入室のセリフ「行くぜぇ 俺っ!参上! 採らないと後悔するぜ」

授業:通信システム(前川)

ネットワーク工学 村上泰司 547.4 NET

授業:ディジタル信号処理(高久)

ディジタル信号処理の基礎 桶口龍 547.1 DEI

授業:システム工学(後期)

システム工学の講義と演習 中溝 日進出版 509.6 SIS

(ただし書庫にある )

現在注文中の教科書

科目名:半導体工学

半導体デバイスの基礎 (単行本)
浜口 智尋 (著), 谷口 研二 (著)
朝倉書店

追記 ↑は入荷した

科目名:データベース

データベース技術教科書―DBMSの原理・設計・チューニング    IT TEXT”

都司達夫、宝珍輝尚 著 CQ出版社

« Previous Entries
ステップワゴン 千葉 不動産 市川 不動産 美容外科 札幌 ホームページ制作