【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?

win32apiとopenCVを使った動画出力プログラムを作りたいのですが,
フリーズしてしまいます.
詳しい方,力を貸してください.

以下にプログラムを載せます.

LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
int x, y;
int id;
int c;
char* szWndName = "camera capture";
CvCapture* capture;
//IplImage* img;

switch (msg) {
case WM_CREATE:
hDC = GetDC( hWnd );
return DefWindowProc(hWnd, msg, wParam, lParam);
case WM_COMMAND:
switch(LOWORD(wParam)){
case IDM_END:
SendMessage(hWnd, WM_CLOSE, 0, 0L);
break;
case IDM_USB:
capture = cvCaptureFromCAM(0);
if(capture == NULL){
MessageBox(hWnd, (LPCTSTR)TEXT("Not camera"), (LPCTSTR)TEXT("Test"), MB_OK);
return -1;
}

while(1){
img = cvQueryFrame(capture);

bmpData = (LPDWORD)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, img->width * img->height * 4);

iplTobmp(img, bmpInfo, bmpData);

StretchDIBits( hDC,
0, 0, img->width, img->height,
0, 0, img->width, img->height,
bmpData, &bmpInfo, DIB_RGB_COLORS, SRCCOPY);
}
ReleaseDC(hWnd, hDC);
cvReleaseCapture(&capture);
return 0;
break;
}
break;

case WM_LBUTTONDOWN:// マウスカーソルが移動したときに送られてくる
// 移動先の座標を取得
x = LOWORD( lParam );
y = HIWORD( lParam );

// 座標をテキストファイルに書き込む
_ftprintf( g_fp, _T("(%d %d)\n"), x, y );
return 0;

case WM_CLOSE:
id = MessageBox(hWnd, TEXT("Close?"), TEXT("Close"), MB_OKCANCEL | MB_ICONQUESTION);
if(id == IDOK)
DestroyWindow(hWnd);
return (0L);
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return(DefWindowProc(hWnd, msg, wParam, lParam));
}
return (0L);
}

A 回答 (2件)

>hDCをグローバルにしないと



StretchDIBits()を実施する前にGetDC()で取得すればよいでしょう。

「WM_CREATEで取得しているハズなのに、IDM_USBで使用しようとしたら不正終了した」からグローバル変数にした。
というのであれば、ローカル変数の寿命とWndProc()がコールされるタイミングについて勉強しましょう。

>win32apiにおいてIDM_USBの処理内でwhile(1)のループから抜ける処理を
>どのようにしたらよいのかが分かりません.

ループしないで抜ける…でしょう。
ちなみに…ループの終了条件設定したとして、HeapAlloc()で取得したモノは解放されているんですか?

>出力されている動画を消さずに他の処理を行うようにするには
>while(1)のループをどのように処理させるべきなのでしょうか.

スレッド生成してそっちで処理するべき…です。
あるいは、オススメはできませんがタイマーを使う…ですかね。
    • good
    • 0

hDCの宣言がないようですが、ひょっとしてグローバル変数にしてます?


デバイスコンテキストは、属性が変わることがあるので、一度取得したものをずっと保持するようなことはしてはいけません、使用する直前で取得するべきです。また、今のままの処理だと、ReleaseDCしたあとに、またhDCを使用する処理に入る可能性があるのでは?

WM_COMMAND処理内のIDM_USBの処理内でwhile(1)のループから抜ける処理がないように思います。
これがフリーズの原因じゃないでしょうか。

この回答への補足

回答ありがとうございます.
勉強不足でよくはわからないのですが,
hDCをグローバルにしないと動画すら写らない状態となってしまっててたので
グローバルにしました.


win32apiにおいてIDM_USBの処理内でwhile(1)のループから抜ける処理を
どのようにしたらよいのかが分かりません.

現在USBカメラからの動画は出力されている状態なのですが,
出力されている動画を消さずに他の処理を行うようにするには
while(1)のループをどのように処理させるべきなのでしょうか.

補足日時:2011/05/04 11:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!