請問各位大大有關影像擷取到Image的問題 ?? |
尚未結案
|
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
以下是小弟參考SDL大大的作品,寫出來的程式,但很奇怪,程式沒有問題,但為何影像顯現不出在Image上,還請大大指教!!
#include謝謝!! |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
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 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
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 發送簡訊給我 |
residue你好: 我是這樣寫,可以work,試試看吧。 good luck
引言: 以下是小弟參考SDL大大的作品,寫出來的程式,但很奇怪,程式沒有問題,但為何影像顯現不出在Image上,還請大大指教!!#include謝謝!! |
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
試一下 // 取得圖檔總容量
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 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
residue
中階會員 發表:90 回覆:153 積分:53 註冊:2003-07-02 發送簡訊給我 |
|
Fusheng
一般會員 發表:4 回覆:6 積分:2 註冊:2005-08-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |