• 締切済み

win32apiでの動画出力

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); }

みんなの回答

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>hDCをグローバルにしないと StretchDIBits()を実施する前にGetDC()で取得すればよいでしょう。 「WM_CREATEで取得しているハズなのに、IDM_USBで使用しようとしたら不正終了した」からグローバル変数にした。 というのであれば、ローカル変数の寿命とWndProc()がコールされるタイミングについて勉強しましょう。 >win32apiにおいてIDM_USBの処理内でwhile(1)のループから抜ける処理を >どのようにしたらよいのかが分かりません. ループしないで抜ける…でしょう。 ちなみに…ループの終了条件設定したとして、HeapAlloc()で取得したモノは解放されているんですか? >出力されている動画を消さずに他の処理を行うようにするには >while(1)のループをどのように処理させるべきなのでしょうか. スレッド生成してそっちで処理するべき…です。 あるいは、オススメはできませんがタイマーを使う…ですかね。

回答No.1

hDCの宣言がないようですが、ひょっとしてグローバル変数にしてます? デバイスコンテキストは、属性が変わることがあるので、一度取得したものをずっと保持するようなことはしてはいけません、使用する直前で取得するべきです。また、今のままの処理だと、ReleaseDCしたあとに、またhDCを使用する処理に入る可能性があるのでは? WM_COMMAND処理内のIDM_USBの処理内でwhile(1)のループから抜ける処理がないように思います。 これがフリーズの原因じゃないでしょうか。

iyun
質問者

補足

回答ありがとうございます. 勉強不足でよくはわからないのですが, hDCをグローバルにしないと動画すら写らない状態となってしまっててたので グローバルにしました. win32apiにおいてIDM_USBの処理内でwhile(1)のループから抜ける処理を どのようにしたらよいのかが分かりません. 現在USBカメラからの動画は出力されている状態なのですが, 出力されている動画を消さずに他の処理を行うようにするには while(1)のループをどのように処理させるべきなのでしょうか.