VideoForWindowsを使って,USBカメラからピクセル単位の色情報を取り出したいと思っています.WindowsXP,VisualC++6.0,Win32 Application,USB-CCD


WEBを見ると,
capDriverConnect,capSetCallbackOnFrame,capPreviewRate,capPreview
とし,
LRESULT PASCAL FrameCallback( HWND hWnd, LPVIDEOHDR lpVHdr )
{
memcpy( m_lpData, lpVHdr->lpData, lpVHdr->dwBufferLength );
return TRUE;
}
のようにコールバックすればいいとのことなのですが,
実行時にmemcpyのところで0xC0000005: Access Violationとエラーが発生してしまいます.
カメラ画像は表示されていますし,
capFileSaveDIB( hWndCap,filename)で保存もできています.
lpVHdr->lpDataにデータを入力する関数があるのでしょうか?

ご存知のかたがいらっしゃいましたら,よろしくお願いいたします.

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/09/09 18:01:47
  • 終了:--

回答(2件)

id:nitscape No.1

nitscape回答回数526ベストアンサー獲得回数02005/09/09 18:51:09

ポイント80pt

Access Violationは不正なアドレスのメモリにアクセスしたときに出るエラーです。そのためmemcpyに渡しているポインタなり長さのいずれかが変な値になっているのだと思います。

一番ありえる原因はm_lpDataだと思います。どこでメモリを確保しているのでしょうか?(newなどでどのくらいのサイズを取っているのでしょうか?最低でもlpVHdr->dwBufferLengthに書かれているバイト数が必要になります)


参考にならないかもしれませんが私なら以下のようにします。

LRESULT PASCAL FrameCallback( HWND hWnd, LPVIDEOHDR lpVHdr )

{

if(lpVHdr == NULL)

return FALSE;


BYTE* pData;

pData = new BYTE[lpVHdr->dwBufferLength];

if(pData == NULL)

return FALSE;


memcpy(pData,lpVHdr->lpData, lpVHdr->dwBufferLength);


(....pDataのアドレスをどこかに投げるための処理。後で「delete pData;」を実行しないとメモリリークを起こす..)


return TRUE;

}


>lpVHdr->lpDataにデータを入力する関数があるのでしょうか?

これはVFW(Video for Windows)が勝手にデータを代入します。FrameCallback関数を呼び出すところはありませんよね?呼び出すのはVFWが行います。その際にVFWがデータを入れています。


がんばってください。

id:SevenS No.2

SevenS回答回数51ベストアンサー獲得回数32005/09/09 19:01:06

ポイント10pt

 以前VFWを触ったことがありますが、ソースもなくなり、キャプチャ環境がないので力にはなれないかもしれませんが、念の為自分が陥ったミスをいくつか。

 ・m_lpDataが確保されているか?

 ・capCaptureSetSetupは呼んだか?

 ・コールバック内でフォーマットを見て、RGB_24になっているか?

があります。

 キャプチャプログラムならばcapOverlayは必要ないでしょうし、おそらく引数や条件式のちょっとした修正で直ると思います。

 ソースを見る限り、言語はC++と勝手に判断しますが、m_lpDataをメンバとするクラスがちゃんと構築されているか(またはstatic宣言)も、もしかしたら問題になっているかもしれませんね。

 キャプチャだけなら、DirectShowの方が若干楽にできた気もします。環境に問題があるのなら仕方ありませんが、C++との相性もいいので、ご一考下さい。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません