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件)
- 最新から表示
- 回答順に表示
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)のループから抜ける処理がないように思います。
これがフリーズの原因じゃないでしょうか。
この回答への補足
回答ありがとうございます.
勉強不足でよくはわからないのですが,
hDCをグローバルにしないと動画すら写らない状態となってしまっててたので
グローバルにしました.
win32apiにおいてIDM_USBの処理内でwhile(1)のループから抜ける処理を
どのようにしたらよいのかが分かりません.
現在USBカメラからの動画は出力されている状態なのですが,
出力されている動画を消さずに他の処理を行うようにするには
while(1)のループをどのように処理させるべきなのでしょうか.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DoEvents関数って何?
-
Excelでのセル内容の高速消去方法
-
Chat GPTに、課題として、二と...
-
プログラム上のCPU稼働率低減に...
-
VBでのシューティングゲーム
-
Excel VBAにて、2GB超の点群デ...
-
SQLの速度をあげるには・・・
-
小数点を含む数値かどうか判断...
-
VC++2010 GDIオブジェクトの解...
-
テキストファイルの空行をスキ...
-
If Not c Is Nothing Then ~延...
-
基本情報技術者試験詳しい方へ...
-
Macターミナルで実行中のプログ...
-
3のつく数字と3の倍数のみを表...
-
VBSの処理中一旦処理を止めて再...
-
vba listviewにおけるtextのAli...
-
緯度、経度の 10進法と 60進法...
-
C# シリアル通信でデータ受信...
-
「ヒープサイズの設定」て何?
-
VBSで応答不要のメッセージボッ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelでのセル内容の高速消去方法
-
win10で、正確な待ち時間の作り方
-
DoEvents関数って何?
-
小数点を含む数値かどうか判断...
-
SQLの速度をあげるには・・・
-
ナップザック問題?をエクセル...
-
Excel VBAにて、2GB超の点群デ...
-
Excel(VBA)でSetTimer関数を使...
-
If Not c Is Nothing Then ~延...
-
ノットイコールを教えて下さい
-
基本情報技術者試験詳しい方へ...
-
絶対パスの取得について
-
Excel VBA データ削除の高速化
-
C言語で、文字とか入力されなく...
-
WebBrowserの読み込み待ちの処...
-
プログラム上のCPU稼働率低減に...
-
Excel VBA での処理時間計測結...
-
C言語 時刻差分の算出方法
-
.netからexcel操作の処理速度が...
-
WindowsMessage(ウィンドウメッ...
おすすめ情報