全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3205
推到 Plurk!
推到 Facebook!

請問各位大大有關影像擷取到Image的問題 ??

尚未結案
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-01 17:30:24 IP:203.64.xxx.xxx 未訂閱
以下是小弟參考SDL大大的作品,寫出來的程式,但很奇怪,程式沒有問題,但為何影像顯現不出在Image上,還請大大指教!!  
 
 #include 
#pragma hdrstop
#include "Unit1.h"
#include "vfw.h"
LRESULT CALLBACK FrameCallBack( HWND, Longint );
LPVIDEOHDR VideoStr;    HWND vc1,vc2;    //-------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
capSetCallbackOnFrame (vc1, &FrameCallBack);
}    //建立callbackonframe函式,底下為未經壓縮模式24bit沒有調色盤資料
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )
{
static BITMAPINFOHEADER BitmapHead;
static BITMAPINFO BitmapInfo;
static BITMAPFILEHEADER BitmapFileHead;
CAPSTATUS status;
int BIHsize, byte;
Byte *ptr;
TMemoryStream *stream = new TMemoryStream;    // 取得圖片資料
VideoStr=LPVIDEOHDR(lpvhdr);
// 取得CAP訊息
capGetStatus( vc1, &status, sizeof(status) ) ;
// 取得圖片格式容量大小
BIHsize=capGetVideoFormatSize( vc1 );
// 取得圖片格式 代入 bitmapinfohead 內
capGetVideoFormat( vc1, &BitmapHead, BIHsize);
// 設定 BITMAPINFO
BitmapInfo.bmiHeader=BitmapHead;    // 取得圖檔總容量
stream->Size=sizeof(BitmapFileHead)   sizeof(BitmapHead)   BitmapHead.biSizeImage;    // 設定 BITMAPFILEHEAD
BitmapFileHead.bfType=0x4D42; //總是 BM
BitmapFileHead.bfSize=stream->Size; //該圖檔總大小
BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)   sizeof(BitmapHead); // 偏移至imagedata大小
// 將資料存入 memorystream
stream->Position=0;
stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) );
stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) );
(void*)ptr=stream->Memory;
ptr  = BitmapFileHead.bfOffBits;
Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage);
// 存入完成    stream->Position=0;
// 
Form1->Image1->Picture->Bitmap->LoadFromStream( stream );
delete( stream );
capSetCallbackOnFrame (vc1, NULL); //停止callbackonframe
return(0);
}
謝謝!!
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-01 18:34:11 IP:140.135.xxx.xxx 未訂閱
residue您好:  您的BCB版本是?  下面的code您試試,BCB6.0 Update4 WinXP
TForm1 *Form1;
HWND ghCapWnd;
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr );
//---------------------------------------------------------------------------
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )
{
 LPVIDEOHDR VideoStr;
 static BITMAPINFOHEADER BitmapHead;
 static BITMAPINFO BitmapInfo;
 static BITMAPFILEHEADER BitmapFileHead;
 CAPSTATUS status;
 int BIHsize, byte;
 Byte *ptr;
 TMemoryStream *stream = new TMemoryStream;
 VideoStr=LPVIDEOHDR(lpvhdr);                        // 取得圖片資料
 capGetStatus( ghCapWnd, &status, sizeof(status) ) ; // 取得CAP訊息
 BIHsize=capGetVideoFormatSize( ghCapWnd );          // 取得圖片格式容量大小
 capGetVideoFormat( ghCapWnd, &BitmapHead, BIHsize); // 取得圖片格式 代入 bitmapinfohead 內
 BitmapInfo.bmiHeader=BitmapHead;                    // 設定 BITMAPINFO
 stream->Size=sizeof(BitmapFileHead)   sizeof(BitmapHead)   BitmapHead.biSizeImage; // 取得圖檔總容量
 // 設定 BITMAPFILEHEAD
 BitmapFileHead.bfType=0x4D42; //總是 BM
 BitmapFileHead.bfSize=stream->Size; //該圖檔總大小
 BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)   sizeof(BitmapHead); // 偏移至imagedata大小
 // 將資料存入 memorystream
 stream->Position=0;
 stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) );
 stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) );
 (void*)ptr=stream->Memory;
 ptr  = BitmapFileHead.bfOffBits;
 Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage);
 // 存入完成
 stream->Position=0;     Form1->Image1->Picture->Bitmap->LoadFromStream(stream);
 delete stream ;
 capSetCallbackOnFrame (ghCapWnd, NULL); //停止callbackonframe
 return(0);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 Form1->DoubleBuffered=true;
 ghCapWnd = capCreateCaptureWindow ( "Capture Window",
 WS_CHILD | WS_VISIBLE ,0,0,Panel1->Width,Panel1->Height,Panel1->Handle, 0);  
 bool a = false;
 for(int i=0;i<10;i  )
 {
  a=capDriverConnect(ghCapWnd,i);
  if( a ) break;
 }
  if( !a )
   ShowMessage("攝影機連接失敗..");
// if (!capOverlay(ghCapWnd,true))
// {
    capPreviewRate(ghCapWnd,66);
    capPreview(ghCapWnd,true);
// }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 capSetCallbackOnFrame (ghCapWnd, &FrameCallBack);
}
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-10-01 23:33:24 IP:218.164.xxx.xxx 未訂閱
感謝大大的指導!!    但小弟我試了很久!!還是沒有影像!!  小弟的作業系統是BCB6.0 WinMe                      不知道為何連Panel1上都沒有影像,不知是哪較易忽略的地方還請大大提點,謝謝!!        順道一提一定號透過Panel1元件才能映射到Image上嗎?? 
taishyang
站務副站長


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-10-02 00:18:42 IP:140.135.xxx.xxx 未訂閱
residue您好:
引言: 但小弟我試了很久!!還是沒有影像!! 小弟的作業系統是BCB6.0 WinMe 不知道為何連Panel1上都沒有影像,不知是哪較易忽略的地方還請大大提點,謝謝!!
連Panel1上都沒有畫面? 不會吧... 請檢查您的影像擷取卡是否安裝正常... 請更新BCB6.0到UpDate4.0 因為好像BMP的檔頭會有問題(沒更新的話) 不曉得是不是OS的關係,但我確定上面的程式碼是可以WORK的
引言:順道一提一定號透過Panel1元件才能映射到Image上嗎??
應該是說攝影機的畫面沒有辦法直接映射到Image上 因為Image元件不是視窗元件,沒有Handle... 所以才用版上討論的各種方式映射到Image上 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
JerryKuo
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-10-02 10:12:57 IP:210.68.xxx.xxx 未訂閱
residue你好:    我是這樣寫,可以work,試試看吧。 good luck    
引言: 以下是小弟參考SDL大大的作品,寫出來的程式,但很奇怪,程式沒有問題,但為何影像顯現不出在Image上,還請大大指教!!
 
#include 
#pragma hdrstop
#include "Unit1.h"
#include "vfw.h"
LRESULT CALLBACK FrameCallBack( HWND, Longint );
LPVIDEOHDR VideoStr;    HWND vc1,vc2;    //-------------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{
capSetCallbackOnFrame (vc1, &FrameCallBack);
}    //建立callbackonframe函式,底下為未經壓縮模式24bit沒有調色盤資料
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )
{
static BITMAPINFOHEADER BitmapHead;
static BITMAPINFO BitmapInfo;
static BITMAPFILEHEADER BitmapFileHead;
CAPSTATUS status;
int BIHsize, byte;
Byte *ptr;
TMemoryStream *stream = new TMemoryStream;    // 取得圖片資料
VideoStr=LPVIDEOHDR(lpvhdr);
// 取得CAP訊息
capGetStatus( vc1, &status, sizeof(status) ) ;
// 取得圖片格式容量大小
BIHsize=capGetVideoFormatSize( vc1 );
// 取得圖片格式 代入 bitmapinfohead 內
capGetVideoFormat( vc1, &BitmapHead, BIHsize);
// 設定 BITMAPINFO
BitmapInfo.bmiHeader=BitmapHead;    // 取得圖檔總容量
stream->Size=sizeof(BitmapFileHead)   sizeof(BitmapHead)   BitmapHead.biSizeImage;    // 設定 BITMAPFILEHEAD
BitmapFileHead.bfType=0x4D42; //總是 BM
BitmapFileHead.bfSize=stream->Size; //該圖檔總大小
//BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)   sizeof(BitmapHead); // 偏移至imagedata大小
BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)   sizeof(BitmapHead)-2; // 偏移至imagedata大小
// 將資料存入 memorystream
stream->Position=0;
stream->WriteBuffer( &BitmapFileHead, sizeof(BitmapFileHead) );
stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) );
stream->WriteBuffer( &BitmapFileHead.bfReserved1, sizeof(BitmapFileHead.bfReserved1) );
stream->WriteBuffer( &BitmapFileHead.bfReserved2, sizeof(BitmapFileHead.bfReserved2) );
stream->WriteBuffer( &BitmapFileHead.bfOffBits, sizeof(BitmapFileHead.bfOffBits) );
stream->WriteBuffer( &BitmapInfo, sizeof(BitmapInfo) );
(void*)ptr=stream->Memory;
ptr  = BitmapFileHead.bfOffBits;
Move( VideoStr->lpData, ptr, BitmapHead.biSizeImage);
// 存入完成    stream->Position=0;
// 
Form1->Image1->Picture->Bitmap->LoadFromStream( stream );
delete( stream );
capSetCallbackOnFrame (vc1, NULL); //停止callbackonframe
return(0);
}
謝謝!!
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-10-02 13:05:18 IP:203.64.xxx.xxx 未訂閱
感謝大大們的指導!! 小弟現在可以把影像, 擷取到Panel1上,但是程式會出現會有錯誤發生,應是要更新BCB6.0到UpDate4.0版吧!!但是好像是要正版軟體才能更新,那請問一下不是正版能夠更新嗎??
JerryKuo
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-10-02 14:11:11 IP:210.68.xxx.xxx 未訂閱
引言: 感謝大大們的指導!! 小弟現在可以把影像, 擷取到Panel1上,但是程式會出現會有錯誤發生,應是要更新BCB6.0到UpDate4.0版吧!!但是好像是要正版軟體才能更新,那請問一下不是正版能夠更新嗎??
我完全沒更新
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-10-02 17:50:21 IP:203.64.xxx.xxx 未訂閱
引言:
引言: 感謝大大們的指導!! 小弟現在可以把影像, 擷取到Panel1上,但是程式會出現會有錯誤發生,應是要更新BCB6.0到UpDate4.0版吧!!但是好像是要正版軟體才能更新,那請問一下不是正版能夠更新嗎??
我完全沒更新
感謝大大的指導!! 但小弟還是會發生問題!! 而出現的錯誤如下,那是哪裡發生錯誤呢?? 感謝!!
JerryKuo
版主


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-10-02 19:20:26 IP:210.68.xxx.xxx 未訂閱
試一下    // 取得圖檔總容量 stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage; 改成stream->Size=sizeof(BitmapFileHead) sizeof(BitmapHead) BitmapHead.biSizeImage - 2; // 設定 BITMAPFILEHEAD BitmapFileHead.bfType=0x4D42; //總是 BM BitmapFileHead.bfSize=stream->Size; //該圖檔總大小 //BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead); // 偏移至imagedata大小 改成 BitmapFileHead.bfOffBits=sizeof(BitmapFileHead) sizeof(BitmapHead)-2;
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-10-02 19:57:50 IP:203.64.xxx.xxx 未訂閱
真的非常感謝大大!! 唉~~~真的實在做不出來,出現的錯誤還是一樣!! 因為小弟要用兩張卡捉同時捉兩個不同的影像,所以一定要用此方法來決解延遲的問題!! 小弟冒昧請求大大,請問大大有無
taishyang
站務副站長


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-10-02 20:30:51 IP:140.135.xxx.xxx 未訂閱
residue您好: 插花一下,您所謂的延遲指的是什麼呢? 除非您使用Overlay功能 不然畫面更新速度都會讓您感覺到延遲的現象(320*240以上) 而且您一但用了Overlay功能 用HDC或FrameCallBack的方式都沒有辦法擷取到畫面(個人測試經驗)    P.S不知是否有這方面經驗的高手願意解說一下< > 順心< > ~我也是在學習的階段,回答的不好請您多多見諒與指教~
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-10-03 01:08:12 IP:218.164.xxx.xxx 未訂閱
引言: residue您好: 插花一下,您所謂的延遲指的是什麼呢?
小弟所謂的延遲是,小地用了兩張擷取卡後,擷取到的影像會變的很慢,以下是小弟參考版大所寫的程式
 
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 vcHWND = capCreateCaptureWindow ( "Capture Window",
    WS_CHILD | WS_VISIBLE ,0,0,1,1,Form1->Handle, 0);  //設定視窗大小
    vcHWND1 = capCreateCaptureWindow ( "Capture Window",
    WS_CHILD | WS_VISIBLE ,0,0,1,1,Form1->Handle, 0);  //設定視窗大小
    bool a = false;
    for( int i = 0; i < 10; i   )
     {
      a = capDriverConnect( vcHWND, i );
      if( a ) break;
     }
    if( !a )
     {
      ShowMessage("攝影機連接失敗..");
     }          bool b= false;
    for( int i = 0; i < 10; i   )
     {
      b = capDriverConnect( vcHWND1, i );
      if( b ) break;
     }
    if( !b )
     {
      ShowMessage("攝影機1連接失敗..");
     }    capPreviewRate(vcHWND,33);
capPreview(vcHWND,true);
capPreviewRate(vcHWND1,33);
capPreview(vcHWND1,true);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
 capGrabFrameNoStop(vcHWND);
  capEditCopy(vcHWND);
  if(Clipboard()->HasFormat(CF_DIB))
  {
   Image1->Picture->Bitmap->Assign(Clipboard());         }    void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
 capGrabFrameNoStop(vcHWND1);
  capEditCopy(vcHWND1);
  if(Clipboard()->HasFormat(CF_DIB))
  {
   Image2->Picture->Bitmap->Assign(Clipboard());         }
因為上面的程式會變慢,所以小弟才想用SDL大大的程式看看會不會增加速度!! 沒想到如何試,還是會發生錯誤!! 還請大大指導!!
taishyang
站務副站長


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-10-03 01:19:24 IP:140.135.xxx.xxx 未訂閱
residue您好: 您處理的畫面是多大呢??
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-10-03 11:25:11 IP:203.64.xxx.xxx 未訂閱
感謝大大的回應!! 小弟處理的畫面為320*240 謝謝!!!
taishyang
站務副站長


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-10-03 13:24:31 IP:140.135.xxx.xxx 未訂閱
residue您好: 請您先用原廠附贈的軟體,看看Preview與Overlay的差異 再看看你程式顯示的效果是否一樣    順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-10-03 15:13:16 IP:203.64.xxx.xxx 未訂閱
引言: residue您好: 請您先用原廠附贈的軟體,看看Preview與Overlay的差異 再看看你程式顯示的效果是否一樣
感謝大大的回應!! 若適用廠商提供的軟體,跑的滿順暢的,只不過Preview比Overlay跑的較好一點 但自己寫的程式就有點差了,若只用一台CCD函不會那麼明顯但兩台就會了有延遲的現象發生!! 謝謝請大大指教!!!
taishyang
站務副站長


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-10-03 15:30:05 IP:140.135.xxx.xxx 未訂閱
residue您好:
引言: 若適用廠商提供的軟體,跑的滿順暢的,只不過Preview比Overlay跑的較好一點 但自己寫的程式就有點差了,若只用一台CCD函不會那麼明顯但兩台就會了有延遲的現象發生!!
不會吧,畫面更新速度照理說應該是Overlay優於Preview 您改用HDC的方式試看看吧(之前給您的連結有範例) 因為我現在只有一片影像擷取卡,所以幫不上忙 sorry... 順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~
residue
中階會員


發表:90
回覆:153
積分:53
註冊:2003-07-02

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-10-03 15:39:13 IP:203.64.xxx.xxx 未訂閱
感謝大大不厭其煩的回覆!!      剩下的小弟自己來吧!!  謝謝您!!
Fusheng
一般會員


發表:4
回覆:6
積分:2
註冊:2005-08-03

發送簡訊給我
#19 引用回覆 回覆 發表時間:2005-08-04 01:02:29 IP:59.115.xxx.xxx 未訂閱
我引用taishyang 大大的寫法(二樓) 是不是在 //存入完成 之後就可以對VideoStr->lpData做處理了呢? lpData的內容應該是bgrbgrbgr.....這樣吧? (我是BCB的超級新手,希望能解釋的基礎一點....萬分感謝!!) 發表人 - Fusheng 於 2005/08/04 12:05:50 發表人 - Fusheng 於 2005/08/04 12:42:28
系統時間:2024-05-09 5:44:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!