線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:4266
推到 Plurk!
推到 Facebook!

關於WEBCAM的幾個小問題??

答題得分者是:taishyang
KGB
一般會員


發表:6
回覆:7
積分:2
註冊:2003-07-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-24 03:45:52 IP:211.76.xxx.xxx 未訂閱
小弟最近剛碰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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-24 14:57:46 IP:140.135.xxx.xxx 未訂閱
KGB您好:  
引言:我看了之前好多討論,還有自己TRY了好久,都不行
方便將您的程式碼貼上來嗎?? 好方便大家幫您看看問題在哪邊 < > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 - taishyang 於 2003/07/24 15:08:05
KGB
一般會員


發表:6
回覆:7
積分:2
註冊:2003-07-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-25 01:58:07 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-25 23:09:31 IP:140.135.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-26 00:53:43 IP:211.76.xxx.xxx 未訂閱
先謝謝版大的協助....真的很感謝~~ 你的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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-26 01:06:45 IP:61.231.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-26 02:52:37 IP:211.76.xxx.xxx 未訂閱
引言: 您自己可以寫一小段程式[由驅動程式判斷是何種硬體]再顯示到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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-07-26 14:41:06 IP:140.135.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-07-26 15:51:36 IP:211.76.xxx.xxx 未訂閱
引言: KGB您好: 如下面兩張圖所示
if (capGetDriverDescription( i,name[i],80,ver[i],80))
的目的是將已經抓到的驅動程式顯示出來,我的有SPY Camera(USB),羅技(USB),影像擷取卡,一共有三個,但是我只有裝其中兩支(羅技的沒有裝),所以當我選擇第一隻和第三隻都會用preview擷取畫面,第二隻為黑色畫面... 我好奇的是CamMY-CAM USB CCD和Logitech Quick Cam用的是同一個驅動程式嗎??
taishyang您好: Pic1:下圖是我跑出的畫面 我的確是裝了2台而且2台都可WORK(同時的),可是用
 if (capGetDriverDescription( i,name[i],80,ver[i],80))
卻只抓到一個驅動,這樣算是用同一個驅動程式嗎?? Pic2:下圖示我想要表達的樣式 這是買CAM送的一套軟體,它可以在程式產生時, 就抓明確的抓出是哪一廠牌什麼型號的DEVICCE?? 請問這是怎麼做到的?? 是要去抓系統裡的登入檔嗎?? 可以請各位高手教教我嗎??
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-07-26 17:15:49 IP:140.135.xxx.xxx 未訂閱
KGB您好:      我沒有您那樣的情況,每個攝影機用的都是不同的驅動程式   也沒有設備幫您測試,抱歉幫不上忙< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-07-26 17:37:29 IP:140.135.xxx.xxx 未訂閱
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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-07-27 00:45:37 IP:211.76.xxx.xxx 未訂閱
引言: taishyang 您好 很不幸的連編號都一樣... 不過真的很謝謝你的協助..^^
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-07-30 15:49:26 IP:210.68.xxx.xxx 未訂閱
我也碰到和KGB一樣的情形,不管使用capGetDriverDescription()或是 capDriverGetName(),抓到的CCD名稱都是 Microsoft WDM Image Capture (Win32) 而不是我的
系統時間:2024-04-29 21:46:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!