關於WEBCAM的幾個小問題?? |
答題得分者是:taishyang
|
KGB
一般會員 發表:6 回覆:7 積分:2 註冊:2003-07-18 發送簡訊給我 |
小弟最近剛碰vfw.h的函式碰到了幾個問題
希望各位高手能幫小弟指點迷津..... 1.要如何在Form產生出來後,就可以先抓到這台電腦裝了幾隻WEBCAM的資訊,
我是希望先抓到這些資訊,然後再show在 Mainmenu裡面,讓USER先選好裝置,
然後再產生preview?? 2.要如何讓兩個以上的Panel,都顯示同一隻WEBCAM的影像呢??
因為我裝了兩隻WEBCAM,假如有10個Panel,我想讓其中任五支都顯示同一隻WEBCAM,
而剩下五支都顯示另一隻webcam,而且每一個Panel還可以個別切換視訊來源??
我看了之前好多討論,還有自己TRY了好久,都不行~~~
小弟不才,希望各位高手能幫小弟這個忙....謝謝...
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
KGB
一般會員 發表:6 回覆:7 積分:2 註冊:2003-07-18 發送簡訊給我 |
void __fastcall TForm1::Button1Click(TObject *Sender)
{
capDriverDisconnect(capw);
capDriverDisconnect(capw2);
capDriverDisconnect(capw3);
capw=capCreateCaptureWindow( "My cap",
WS_CHILD | WS_VISIBLE,
0,0,Form1->Panel1->Width,
Form1->Panel1->Height,
Form1->Panel1->Handle,
0); capw2=capCreateCaptureWindow( "My cap2",
WS_CHILD | WS_VISIBLE,
0,0,Form1->Panel2->Width,
Form1->Panel2->Height,
Form1->Panel2->Handle,
0);
capw3=capCreateCaptureWindow( "My cap3",
WS_CHILD | WS_VISIBLE,
0,0,Form1->Panel3->Width,
Form1->Panel3->Height,
Form1->Panel3->Handle,
0); bool a = false;
for( int i = 0; i < 10; i )
{
a = capDriverConnect( capw, i );
if( a ) break;
}
if( !a )
{
ShowMessage("攝影機連接失敗^^..");
} bool b = false;
for( int i = 0; i < 10; i )
{
b = capDriverConnect( capw2, i );
if( b ) break;
}
if( !b )
{
ShowMessage("攝影機連接失敗**..");
} bool c = false;
for( int i = 0; i < 10; i )
{
c = capDriverConnect( capw3, i );
if( c ) break;
}
if( !c )
{
ShowMessage("攝影機連接失敗**3..");
} capOverlay(capw,true);
capPreview(capw,true);
capPreviewScale(capw,true);
capPreviewRate(capw, 1000/30); capOverlay(capw2,true);
capPreview(capw2,true);
capPreviewScale(capw2,true);
capPreviewRate(capw2, 1000/30); capOverlay(capw3,true);
capPreview(capw3,true);
capPreviewScale(capw3,true);
capPreviewRate(capw3, 1000/30);
}
//-------------------------------------------------------------------
上面的程式---有3個Panel,程式執行時Panel1會自己任選一台ccd連線
(Q1.有什麼方法可以讓我先選擇要哪一台裝置,然後再連線嗎??),
然後會跳出 選擇裝置的方塊,這時Panel2只能夠選擇另一台ccd,如果選了另一台就會連線失敗,
再來就是Panel3,不管選哪一台都會連線失敗,
(Q2有什麼方法可以讓Panel3也可以同時顯示其中一隻ccd的畫面?? ) 希望各位大哥可以幫小弟解解答...謝謝... 發表人 - KGB 於 2003/07/25 02:03:19
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
KGB您好:
引言: (Q1.有什麼方法可以讓我先選擇要哪一台裝置,然後再連線嗎??), 然後會跳出 選擇裝置的方塊,這時Panel2只能夠選擇另一台ccd,如果選了另一台就會連線失敗, 再來就是Panel3,不管選哪一台都會連線失敗, (Q2有什麼方法可以讓Panel3也可以同時顯示其中一隻ccd的畫面?? )A1:請參考下面的code與下圖的設定 void __fastcall TForm1::FormCreate(TObject *Sender) { TMenuItem*NewItem; char name[10][80],ver[10][80]; AnsiString Device,Ver; for (int i=0;i<=9;i++) { if ( capGetDriverDescription( i,name[i],80,ver[i],80) ) { NewItem = new TMenuItem(this); Device=name[i]; Ver=ver[i]; NewItem->Caption = "裝置:"+Device+"__"+"版本:"+Ver; NewItem->Tag=i; NewItem->SelectCCD; Option->Add(NewItem); } } } //--------------------------------------------------------------------------- void __fastcall TForm1::SelectCCD(TObject *Sender) { int i=((TMenuItem*)Sender)->Tag; vcHWND = capCreateCaptureWindow ( "Capture Window", WS_CHILD | WS_VISIBLE ,0,0,160,120,((TPanel*)FindComponent("Panel"+IntToStr(i+1)))->Handle, 0); capDriverConnect( vcHWND,i); capPreviewRate(vcHWND,33); capPreview(vcHWND,true); } //---------------------------------------------------------------------------A2.個人經驗,要用兩個Panel顯示同一隻CCD畫面不行 可能可以,要請其他高手幫忙了,假如用 > <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 - |
KGB
一般會員 發表:6 回覆:7 積分:2 註冊:2003-07-18 發送簡訊給我 |
先謝謝版大的協助....真的很感謝~~
你的CODE執行完後 MainMenu中的Option出現的是驅動程式的版本~~~
我想你誤會我的意思了,
我想的是,假如我有一隻羅技的CCD,另一隻是MY-CAM USB CCD,
可以讓程式一產生時就抓到這兩的硬體,在MainMenu中,
就顯示有兩個Item,分別是
Logitech Quick Cam
MY-CAM USB CCD
可讓USER選要哪一個,然後再開啟Preview . 對不起^^
可能是我之前講的不清楚,
要怎麼才能達到這種效果呢??
有什麼API函式可以用嗎??
==>謝謝版大的協助..感謝..
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
KGB您好:
引言:你的CODE執行完後 MainMenu中的Option出現的是驅動程式的版本~~~ 我想你誤會我的意思了,我想的是,假如我有一隻羅技的CCD,另一隻是MY-CAM USB CCD,可以讓程式一產生時就抓到這兩的硬體,在MainMenu中,就顯示有兩個Item,分別是Logitech Quick CamMY-CAM USB CCD可讓USER選要哪一個,然後再開啟Preview您自己可以寫一小段程式[由驅動程式判斷是何種硬體]再顯示到MainMenu上 而您選了其中一個選項,就會開啟Preview(在SelectCCD事件中) 假如您的硬體沒有裝上去的話,Panel的畫面會是黑色的 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 - |
KGB
一般會員 發表:6 回覆:7 積分:2 註冊:2003-07-18 發送簡訊給我 |
引言: 您自己可以寫一小段程式[由驅動程式判斷是何種硬體]再顯示到MainMenu上 ^^^^^^^^^^^^^^^^^^^^^^^^有點不懂... 你的意思是說用capGetDriverDescription( i,name[i],80,ver[i],80) 這個函式來抓驅動程式嗎?? 如果是這樣我試過我兩台都是用 Microsoft WDM Image Capture (Win32)Version: 5.1.2600.1106 這個驅動程式,我要如何從上面這一排字判斷 一隻cam是 Logitech Quick Cam 另一隻cam是 CamMY-CAM USB CCD 還是你說的小程式不是這個意思???? 謝謝版大的指教^^ |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
KGB您好:
如下面兩張圖所示
用
if (capGetDriverDescription( i,name[i],80,ver[i],80))的目的是將已經抓到的驅動程式顯示出來,我的有SPY Camera(USB),羅技(USB),影像擷取卡,一共有三個,但是我只有裝其中兩支(羅技的沒有裝),所以當我選擇第一隻和第三隻都會用preview擷取畫面,第二隻為黑色畫面... 我好奇的是CamMY-CAM USB CCD和Logitech Quick Cam用的是同一個驅動程式嗎?? 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 - |
KGB
一般會員 發表:6 回覆:7 積分:2 註冊:2003-07-18 發送簡訊給我 |
引言: KGB您好: 如下面兩張圖所示 用taishyang您好: Pic1:下圖是我跑出的畫面 我的確是裝了2台而且2台都可WORK(同時的),可是用if (capGetDriverDescription( i,name[i],80,ver[i],80))的目的是將已經抓到的驅動程式顯示出來,我的有SPY Camera(USB),羅技(USB),影像擷取卡,一共有三個,但是我只有裝其中兩支(羅技的沒有裝),所以當我選擇第一隻和第三隻都會用preview擷取畫面,第二隻為黑色畫面... 我好奇的是CamMY-CAM USB CCD和Logitech Quick Cam用的是同一個驅動程式嗎?? if (capGetDriverDescription( i,name[i],80,ver[i],80))卻只抓到一個驅動,這樣算是用同一個驅動程式嗎?? Pic2:下圖示我想要表達的樣式 這是買CAM送的一套軟體,它可以在程式產生時, 就抓明確的抓出是哪一廠牌什麼型號的DEVICCE?? 請問這是怎麼做到的?? 是要去抓系統裡的登入檔嗎?? 可以請各位高手教教我嗎?? |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
KGB您好:
麻煩您幫我測試下面的程式,並描述Memo上的內容如圖所示
[程式碼]
void __fastcall TForm1::Button1Click(TObject *Sender) { HWND vc1,vc2; char Device1[10][100],Device2[10][100]; AnsiString CCD1,CCD2; vc1=capCreateCaptureWindow ( "Capture Window", WS_CHILD | WS_VISIBLE ,0,0,160,120,Panel1->Handle, 0); //設定視窗大小 bool a=false; for( int i=0;i<10;i++) { a=capDriverConnect(vc1,i); if(a) { if (capDriverGetName(vc1,Device1[i],100)) { CCD1=Device1[i]; Memo1->Lines->Add(CCD1+"__編號:"+IntToStr(i)); } break; } } if(!a) { ShowMessage("攝影機1連接失敗"); } capPreview(vc1,true); capPreviewRate(vc1,33); vc2=capCreateCaptureWindow ( "Capture Window", WS_CHILD | WS_VISIBLE ,0,0,160,120,Panel2->Handle, 0); //設定視窗大小 bool b=false; for( int i=0;i<10;i++) { b=capDriverConnect(vc2,i); if(b) { if(capDriverGetName(vc2,Device2[i],100)) { CCD2=Device2[i]; Memo1->Lines->Add(CCD2+"__編號:"+IntToStr(i)); } break; } } if(!b) { ShowMessage("攝影機2連接失敗"); } capPreview(vc2,true); capPreviewRate(vc2,33); }依照您之前程式的方式,再加上capDriverGetName()應該可以判斷驅動程式的名稱以及編號,目的是要看看編號是否是唯一的,假如連編號都是一樣的話,那我真的愛莫能助了< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2003/07/26 18:00:49 |
KGB
一般會員 發表:6 回覆:7 積分:2 註冊:2003-07-18 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |