• ベストアンサー

ビデオキャプチャ

どうしても、うまくいきません・・・ 以下のプログラムで、BorlandC++ Builder6.0のpanel1にカメラから取得した映像をストリーム再生したいのですが・・・。 コンパイルエラーとして、->か->*の左には構造体のポインタが必要、と出ます。 どうやったらこのエラーを解決し、ストリーム再生できるようになるでしょうか? アドバイスお願いします!!! #include <vcl.h> #pragma hdrstop #include <windows.h> #include <vfw.h> #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; HWND hwnd; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { // キャプチャドライバに接続 SendMessage(hwnd,WM_CAP_DRIVER_CONNECT,0,0L); CAPDRIVERCAPS CapDrvCaps; capDriverGetCaps(hwnd, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); if (CapDrvCaps.fHasOverlay) capOverlay( hwnd->Panel1, TRUE ); // オーバーレイモードで動作 //ShowWindowAsync( hWndCap, SW_SHOW ); capDriverDisconnect( hwnd ); // ドライバの解放 //::DestroyWindow( hwnd ); // ウィンドウの破棄 }

noname#47454
noname#47454

質問者が選んだベストアンサー

  • ベストアンサー
  • HogePiyo
  • ベストアンサー率57% (24/42)
回答No.1

> capOverlay( hwnd->Panel1, TRUE ); // オーバーレイモードで動作 の第一引数に hwnd->Panel1 が渡されているからじゃないでしょうか? capOverlay マクロの第一引数はキャプチャウィンドウのハンドル hwnd を渡さないといけないんじゃ、、、? それと、ソース見る限りじゃ、hwnd の実体はどこにあるんでしょう? > HWND hwnd; のウィンドウハンドル変数にキャプチャウィンドウのハンドルが入っていないように思えるんですが、ひょっとして > __fastcall TForm1::TForm1(TComponent* Owner) > : TForm(Owner) > { が呼び出されると自動的に hwnd にキャプチャウィンドウのハンドルが入るのですか? もしそうでないんなら参照URLのソースにあるように、 > hWndCap = capCreateCaptureWindow( > "Captrue Window", // キャプチャウィンドウの名前 > WS_OVERLAPPEDWINDOW, // ウィンドウスタイル このパラメータについてはここを見てください。 > 0, 0, // 表示位置 > 320, 240, // ウィンドウサイズ > NULL, // 親のハンドル NULL:親なしのウィンドウ > NULL); // よくわかりません のようにしてキャプチャウィンドウを作ってそのハンドルをそれぞれのマクロなり関数なりに代入してやるか、別のファイルなりで作ったキャプチャウィンドウがあるならそのキャプチャウィンドウのハンドルをグローバル変数を通して持ってくるなり、キャプチャウィンドウのハンドルを取得する関数とかを調べてみてください。

参考URL:
http://laputa.cs.shinshu-u.ac.jp/~gtakano/prog.html
noname#47454
質問者

お礼

ご回答、何度目になるか・・・本当にありがとうございます。あまりにも、理解できていないのに、要望だけは達者で申し訳ありません。 今回、このように記述してしまったのは、Panel1をキャプチャウィンドウとしたい、と考えた為、 > hWndCap = capCreateCaptureWindow( と書いて、キャプチャウィンドウを作るは必要ないだろう、としてしまいました。 hwndの実体とは、、、キャプチャウィンドウの構造体のことでしょうか・・・? 勘違いでしたら、すみません・・・。 キャプチャウィンドウはPanel1にしたいのですが、どのようにして記述すればよいのでしょうか? > HWND hwnd; と書いたのは、HogePiyoさんが参考に、と添付してくださったサイトに”よくわからない場合は、#include文の下あたりに、HWND hWndCap;の1行を追加してください”とあったから書いただけなのです。 > __fastcall TForm1::TForm1(TComponent* Owner) > : TForm(Owner) > { が呼び出されると、自動的にPanel1がキャプチャウィンドウとして機能するためには、hwndの実体を記述する際に書き込めばよいのでしょうか? ただ、 > hWndCap = capCreateCaptureWindow( > "Captrue Window", // キャプチャウィンドウの名前 > WS_OVERLAPPEDWINDOW, // ウィンドウスタイル このパラメータについてはここを見てください。 > 0, 0, // 表示位置 > 320, 240, // ウィンドウサイズ > NULL, // 親のハンドル NULL:親なしのウィンドウ > NULL); // よくわかりません このように記述した場合、実行画面でFormの真ん中にキャプチャウィンドウがきませんでした。 それは、 > 0, 0, // 表示位置 としてあるこの数字0,0,を書き換えると真ん中に表示できるでしょうか? これは明日の朝、学校で確かめてみますね。確認不足で申し訳ございません。 無理やりPanel1をキャプチャウィンドウに・・・と私が考えているのは、どうしても、ポインタ・構造体、これらのものが頭の中でビジュアル的組み立てて見ることができないからだと思うのです。 初めてプログラミングをする上で、こんなにも大変だとは思っていませんでした。 HogePiyoさんには、何度も何度もアドバイスを頂いており、大変申し訳なく、ありがたいと思っております。 私も頑張って、成功をお伝えできるよう努力いたしますので、どうかよろしくお願いします。

その他の回答 (2)

  • HogePiyo
  • ベストアンサー率57% (24/42)
回答No.3

↓いろいろ探してみたらいいサイトが見つかりました。 http://www6.airnet.ne.jp/miyakawa/project/prj1/video.htm

参考URL:
http://www6.airnet.ne.jp/miyakawa/project/prj1/video.htm
noname#47454
質問者

お礼

参考サイトを見てびっくりしました!!! 早速、やってみます。 本当にありがとうございます!!!

noname#30727
noname#30727
回答No.2

一般的な SDK でウィンドウハンドルを必要とする部分に、C++Builderのウィンドウを使用する場合は、Handle プロパティを使用します。 例えば、こんな感じです。 capDriverConnect(Panel1->Handle, 0);

noname#47454
質問者

お礼

ありがとうございます!! Hogepiyoさんの参考サイトとinthefloiさんのヒントでなんとか頑張っていきたいと思います!! しかし、サイトのコードを丸写ししても、はじめの画面の1コマだけが静止画?(フリーズとも言うような気がしますが)として表示されるだけで、連続してオーバーレイできていない気がします。 OSにXPを使用しているからでしょうか?

関連するQ&A

  • ビデオキャプチャプログラミングについて

    現在、思考錯誤しながら作っているプログラミングは以下の通りです。 #include <vcl.h> #pragma hdrstop #include <windows.h> #include <vfw.h> #include "Unit1.h" //----------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; HWND hwnd; //---------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { hwnd = capCreateCaptureWindow( NULL, WS_CHILD | WS_VISIBLE, 0, 0, 960, 720, this->Handle,100 ); // キャプチャウィンドウの作成 SendMessage(hwnd,WM_CAP_DRIVER_CONNECT,0,0L); // キャプチャドライバに接続 capDriverGetCaps(hWndC, &CapDrvCaps, sizeof (CAPDRIVERCAPS)); if (CapDrvCaps.fHasOverlay) capOverlay(hwnd,TRUE); } のプログラムでビデオキャプチャしたいと思っています。 現段階では、静止画は表示できるのですが、ストリーム再生(カメラからの映像垂れ流し)が実行できません。 capOverlayではデータの上書きができるのではないかと思うのですが、うまくいきません。 このプログラムのどこを直せば、うまく実行できるのでしょうか? 開発ツールはBorlandC++6.0です。 よろしくお願いします。

  • TCP、UDPソケット

    あるC++言語の教科書に、TCPやUDPのクアリアントプログラム例が書いてありました。この例では、最初に、sock=0となっており、一つの接続しかできません。 複数の接続を行う場合、例えば、どのようにすると、良いのか御教授をお願いいたします。 #pragma comment(lib, "wsock32.lib") // #include <winsock.h> // #include "Main.h" //--------------------------------------------------------------------------- #pragma resource "*.dfm" TMainForm *MainForm; //--------------------------------------------------------------------------- __fastcall TMainForm::TMainForm(TComponent* Owner) : TForm(Owner) { sock = 0 ; } //---------------------------------------------------------------------------

  • AVIファイルを読み込む方法

    C++でプログラミング中の者です。 使っているコンポーネントはanimate、MediaPlayer、Edit、Botton、OpenDialogです。 OpenDialogで選択したファイル名をEditに表示させ、Mediaplayerを使ってAnimateに表示させるプログラミングをしたいと思っています。 なかなかうまくいかないので、アドバイスお願いいたします。 次のは現在のプログラムです。 #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //OpenDialog1->DefaultExt = "AVI"; //OpenDialog1->FileName = "*.avi"; if(OpenDialog1->Execute()==true){ // ファイル名が選択されたときに実行する処理  Edit1->Text=OpenDialog1->FileName; //Edit1に選択したファイル名を表示 //Animate1->Active=LoadFromFile(OpenDialog1->FileName); } } //--------------------------------------------------------------------------- void __fastcall TForm1::Edit1Change(TObject *Sender) { MediaPlayer1->Open(); MediaPlayer1->Play(); } //---------------------------------- よろしくお願いします。

  • Borland社のコンパイラを使ったDLL

    C++BuilderでDLLファイルを使っておりますが、Vectorコンテナの値をコールバック出来ませんでした。Vectorコンテナを使ったコールバックを可能とする記述方法を教えてください。 Edit1には、思惑通りに102が返ります。Edit2には、1が、Edit3には2が返ります。この例では、201、202を返したいのです。 本体側 #include <vector> ・ ・ extern "C" __declspec(dllimport) int __stdcall test(int*,vector<int>); #pragma package(smart_init) #pragma resource "*.dfm" using namespace std; TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { vector<int> b; b.push_back(1); b.push_back(2); int *a; *a=1; Edit1->Text = IntToStr(test(a,b)); Edit2->Text = IntToStr(b[0]); Edit3->Text = IntToStr(b[1]); b.clear(); dll側 extern "C" __declspec(dllexport) int __stdcall test(int*,vector<int>*);//コンテナの引数の実験 ・ ・ //----------------------------------------------------------------------------- int __stdcall test(int *a,vector<int> &b) { //dllの引数の可能性の実験 for(unsigned int i;i<b.size();i++){ b[i] +=200; } *a+=1; return *a+100; } //-----------------------------------------------------------------------------

  • クラスのメンバ変数の宣言方法

    現在、プロジェクト内に”class PACKAGE TNumberEdit : public TEdit”というクラスを持った”NumberEdit.h”、”NumberEdit.cpp”ファイルを追加して、 Unit1.hファイル内の”class TTestForm : public TForm”このクラス内のpublicにメンバ変数として ”TNumberEdit *NumberEdit1;” このように宣言しました。 そして、 __fastcall TTestForm::TTestForm(TComponent* Owner) : TForm(Owner) { NumberEdit1 = new TNumberEdit(this); } //--------------------------------------------------------------------------- このようなプログラムを書くと次のようなエラーが出てきます。 [ILINK32 エラー] Error: 未解決の外部参照 'TNumberEdit::' が C:\MYWORK\....\CPP_BUILDER_2009\TEST_NUBEREDIT\DEBUG\UNIT1.OBJ から参照されました [ILINK32 エラー] Error: 未解決の外部参照 '__fastcall TNumberEdit::TNumberEdit(Classes::TComponent *)' が C:\MYWORK\.....\CPP_BUILDER_2009\TEST_NUBEREDIT\DEBUG\UNIT1.OBJ から参照されました このようなエラーを回避する方法はありますでしょうか?どうぞ教えて頂きますよう、お願い致します。

  • C++Builder6 での複素数計算

    C++builder6 で複素数計算が出来なくて困っています、 UNIT1.CPPのヘッダー部分に  #include <vcl.h>  #pragma hdrstop  #include <iostream>  #include <complex.h>  #include "Unit1.h" //-----------------------------  #pragma package(smart_init)  #pragma resource "*.dfm" を書いて イベントハンドラ部分に変数の宣言   complex<double> z; として緑色三角形の実行ボタンをクリックすると   「未定義のシンボル complex」 と言うエラーが発生します、 この解決方法を教えて頂ければ幸いです、宜しくお願いします。 (なお C++builder5 では何の問題もなく複素数計算のソフトが出来ていました)   

  • DLLサンプルプログラムが動きません

    Delphi XE5 starter で、 http://www39.atwiki.jp/kgh07155/pages/28.html を参考にして以下のようなプログラムを作りました。 コンパイルはできたのですが、Button1をクリックすると「TDllFormリソースが見つかりません」というエラーメッセージが出ます。 どういう風に修正すればいいのでしょうか? //***************************** //SamoleUnit2.pasの内容 unit Unit_Sample2; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} function ShowDLLForm(hOwner: HWND): TModalResult; stdcall; external 'DLLSample.dll'; procedure ShowDLLForm2; external 'DLLSample.dll'; // ここまで、DLLを呼び出すための記述。 procedure TForm1.Button1Click(Sender: TObject); begin ShowDLLForm(Application.Handle); // DLL側でフォームを作成した後、 // 通常のフォームのShowModalメソッドと同じ動作をして // 作成したフォームを破棄。 end; procedure TForm1.Button2Click(Sender: TObject); begin ShowDLLForm2; // DLL側でフォームを作成した後、 // 作成したフォームを表示。 end; end. //******************************** //DllSample.dprの内容 library DLLSample; uses System.SysUtils, System.Classes, Windows, Forms, Controls, Unit_DLLForm in 'Unit_DLLForm.pas' {Form1}, Unit_Sample2 in 'Unit_Sample2.pas' {Form2}; type TDllForm = class(TForm) end; {$R *.res} function ShowDLLForm(hOwner: HWND): TModalResult; stdcall; var DllForm:TDllForm; begin Application.Handle := hOwner; // 呼び出し元の情報をDLL側が受け取る。 DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。 // フォームに配置された各オブジェクトも、自動で作成される。 Result := DllForm.ShowModal; // 返し値を設定。 DllForm.Free; // DLL側で作成したフォームを破棄。 Application.Handle := 0; // 呼び出し元の情報を破棄。 end; procedure ShowDLLForm2; var DllForm:TDllForm; begin DllForm := TDllForm.Create(Application); // DLL側でフォームを作成する。 DllForm.Show; // 作成したフォームを表示。 end; exports ShowDLLForm, ShowDLLForm2; begin end. //******************************** //unit_DLLForm.pasの内容 unit Unit_DLLForm; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; type TForm1 = class(TForm) Button1: TButton; private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} end.

  • bmpやImageの配列を関数の引数で渡す

    C++BuilderXE2starterです。 ビットマップ(bmp)やTImage を配列で定義し、関数の引数として渡したいのですが よくわからないまま、次のようにすると、色んな不正な使い方らしきエラーとなります。 正しい使い方を教えてください。 なお配列でないbmpを渡すことはできます。ImageはIDEで定義するのではなく、プログラムから生成させる積もりです。 最終的にやりたいスタイル。 void __fastcall TForm1::onclick(TObject *Sender) { int n; Graphics::TBitmap *bmp[10]; TImage::Image *Imagenum[10]; for(n=0;n<10;n++){ bmp[n]=new Graphics::TBitmap(); Imagenum[n]=new TImage::TImage; // bmp,Imagenum のサイズ位置の設定 Imagenum[n]->Top= 値; Imagenum[n]->Left= 値; } sub(bmp,Imagenum); Free(bmp); // for でまわす要あり? Free(Image); } //--------------------------------------------------------------------------- void TForm1::sub2(Graphics::TBitmap *bmp[], TImage *Imagenum[]) { Image[0]->Canvas->Draw(0,0,bmp[0]); Image[1]->Canvas->Draw(0,0,bmp[1]); } unit.h class TForm1 : public TForm { __published: // IDE で管理されるコンポーネント TButton *Button1; void __fastcall onclick(TObject *Sender); private: // ユーザー宣言 void TForm1::sub(Graphics::TBitmap **bmp, TImage **Image); public: // ユーザー宣言 __fastcall TForm1(TComponent* Owner); };

  • VC++&グローバルフックについて質問です

    vc++2008,Windows Vistaの環境でプログラムを作成しています。 以下、aが押されたら、設定したhWndにWM_KEYDOWN,VK_LEFTのメッセージを送るプログラムのつもりで書きました。 http://www.shos.info/develop/cwin/tipswin.html#windows008 を参考にしています。 しかし、dllにしてWinMainで呼び出したのですが動作しません。 エラーも出ないのでなぜ動かないのかがわかりません。 このプログラムをちゃんと動かすにはどうしたらいいでしょうか。 どうかご指摘ください。よろしくお願いします。 //hook.h #ifdef HOOKAPI #else #define HOOKAPI extern "C" __declspec(dllimport) #endif HOOKAPI HINSTANCE _hInstance; HOOKAPI HHOOK _hHook; HOOKAPI HWND _hWnd; HOOKAPI BOOL Set(HWND hWnd); HOOKAPI void Reset(); //hook.cpp #include <windows.h> #define HOOKAPI extern "C" __declspec(dllexport) #include "hook.h" #pragma data_seg(".share") HHOOK _hHook = NULL; HWND _hWnd = NULL; HINSTANCE _hInstance; #pragma data_seg() #pragma comment(linker, "/section:.share,rws") LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) { /* ここでは 'A' が押されたら予め設定済みの _hWnd にメッセージを送る */ if (nCode >= 0 && nCode != HC_NOREMOVE && wParam == 'A') { PostMessage(_hWnd, WM_KEYDOWN, VK_LEFT, 0); CallNextHookEx(_hHook, nCode, wParam, lParam); return 1; } return CallNextHookEx(_hHook, nCode, wParam, lParam); } BOOL Set(HWND hWnd) { /* キーのフック */ _hHook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)HookProc, _hInstance, 0); /* ここで hInstance は DLL のインスタンス ハンドル */ _hWnd = hWnd; return (_hHook != NULL); } void Reset() { if (_hHook != NULL) { UnhookWindowsHookEx(_hHook); _hHook = NULL; } }

  • 子ウインドウの作成と破棄について

    CALLBACK のみを書きました。 メインウインドウを破棄したら 子ウインドウも破棄したいのですが、 うまく出来ません。 どうすればよろしいでしょうか? よろしくお願いします。 #include<windows.h> #include"ChildWindow.h" char MainWindowClassName[]="mainwindow"; LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { static HWND childWnd; switch(message) { case WM_ACTIVATEAPP: childWnd=Child_CreateWindow(hWnd,message,wParam,lParam); break; case WM_DESTROY: DestroyWindow(childWnd); PostQuitMessage(0); break; default: return DefWindowProc(hWnd,message,wParam,lParam); } } ///////////////////////////////////////////// #include<windows.h> char ChildWindowClassName[]="childwindow"; LRESULT CALLBACK ChildProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { switch(message) { case WM_LBUTTONDOWN: MessageBox(NULL,"","",MB_OK); break; default: return DefWindowProc(hWnd,message,wParam,lParam); } } ATOM Child_RegistWindow(HINSTANCE hInstance){} HWND Child_InitInstance(HWND hParentWnd,HINSTANCE hInst,int CmdShow){} HWND Child_CreateWindow(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) { int CmdShow=1; Child_RegistWindow(NULL); HWND ChildWnd=Child_InitInstance(hWnd,NULL,CmdShow); MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return ChildWnd; }