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

如何用capCaptureSingleFrame抓一個Frame?

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


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-04 19:22:46 IP:61.59.xxx.xxx 未訂閱
想用capCaptureSingleFrame來抓一個Frame 到Memory之後再Show到一個Panel上,要怎麼做?用capGrabFrameNoStop();會直接Show 到Panel,是想處理之後再Show 到Panel. 請指教一下.
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-04 20:42:12 IP:140.135.xxx.xxx 未訂閱
您好: 我想您要的可能是這一篇 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22263 順心
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-04 20:51:14 IP:61.59.xxx.xxx 未訂閱
看起來應該就是.我試試. DouSei Taishyang.
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-04 23:48:38 IP:61.59.xxx.xxx 未訂閱
因初次用這個CALLBACK,還不是很清楚.請幫我看這個err.順便我也把程式po上去.請賜教....    
 
//---------------------------------------------------------------------------
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include <Forms.hpp>
#include 
#include 
#include "trayicon.h"
#include 
#include "vfw.h"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TTimer *Timer1;
        TStatusBar *StatusBar1;
        TButton *Button1;
        TImage *Image1;
        void __fastcall FormCreate(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
     
private:    // User declarations
      
public:     // User declarations
        __fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif    =================================================
//---------------------------------------------------------------------------
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
LRESULT CALLBACK FrameCallBack( HWND, Longint );
TForm1 *Form1;
LPVIDEOHDR VideoStr;
HWND hCapWnd;
CAPTUREPARMS CaptureParms;
Graphics::TBitmap *ImageBuffer;
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr );
int sequence_number;
int Width=640;
int Height=480;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
/*
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled=false;
capCaptureSingleFrame(hCapWnd);
capSetCallbackOnFrame(hCapWnd, (FARPROC)FrameCallbackProc);    Timer1->Enabled=true;    }
*/
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
hCapWnd=capCreateCaptureWindow("My_Capture Window", WS_CHILD | WS_VISIBLE,0, 0, 300, 200,Form1->Handle, 0);
//capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, 400, 300,MainForm->Handle, 0); //設定CaptureWindows
capDriverConnect (hCapWnd, 0); //與驅動程式連結
capOverlay(hCapWnd, true); //使用hardware overlay使video input directly into framebuffer,使不用CPU resources.
capPreview(hCapWnd,true); //抓取影像出現在視窗中
capPreviewScale(hCapWnd,true); //使影像延伸到所設定的視窗大小
capPreviewRate(hCapWnd, 100/60); //每秒影像變化張數
ImageBuffer = new Graphics::TBitmap();
ImageBuffer->Width = Width;
ImageBuffer->Height = Height;
ImageBuffer->PixelFormat = pf24bit;
StatusBar1->SimpleText="";
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ capSetCallbackOnFrame(hCapWnd, &FrameCallBack);    }
//---------------------------------------------------------------------------
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( hCapWnd, &status, sizeof(status) ) ;
// 取得圖片格式容量大小
BIHsize=capGetVideoFormatSize( hCapWnd );
// 取得圖片格式 代入 bitmapinfohead 內
capGetVideoFormat( hCapWnd, &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 (hCapWnd, NULL); //停止callbackonframe
return(0);
}        
發表人 - 111111dd 於 2004/05/04 23:52:58
taishyang
站務副站長


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-04 23:59:26 IP:140.135.xxx.xxx 未訂閱
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-05-05 00:22:53 IP:61.59.xxx.xxx 未訂閱
請教這個函數LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )是每從CCD(WebCAM)取出一張Fram就會被硬体觸發一次? 那我們在什麼地方設定它的取樣時間及它的解析度? CAPTUREPARMS? 3Q.
taishyang
站務副站長


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-05-05 23:10:14 IP:140.135.xxx.xxx 未訂閱
111111dd您好: 相關討論參考看看 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=22856
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-05-06 00:12:29 IP:61.59.xxx.xxx 未訂閱
有試過,不是這個bug.是否有誰可以幫我看一下.. 是不是指標有指錯?
     //---------------------------------------------------------------------------    #include 
#pragma hdrstop
#include "Unit1.h"
#include "vfw.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
LRESULT CALLBACK FrameCallBack( HWND, Longint );
LPVIDEOHDR VideoStr;
HWND hCapWnd,vc1;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Button1Click(TObject *Sender)
{
capSetCallbackOnFrame (hCapWnd, &FrameCallBack);    }
//---------------------------------------------------------------------------
//建立callbackonframe函式,底下為未經壓縮模式24bit沒有調色盤資料
LRESULT CALLBACK FrameCallBack( HWND hCapWnd, 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( hCapWnd, &status, sizeof(status) ) ;
// 取得圖片格式容量大小
BIHsize=capGetVideoFormatSize( hCapWnd );
// 取得圖片格式 代入 bitmapinfohead 內
capGetVideoFormat( hCapWnd, &BitmapHead, BIHsize);
// 設定 BITMAPINFO
BitmapInfo.bmiHeader=BitmapHead;    // 取得圖檔總容量
stream->Size=sizeof(BitmapFileHead)   sizeof(BitmapHead)   BitmapHead.biSizeImage-2;
//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大小
//BitmapFileHead.bfOffBits=sizeof(BitmapFileHead)   sizeof(BitmapHead); // 偏移至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 );
//Form1->Panel1-> ->Picture->Bitmap->LoadFromStream( stream );
delete( stream );
capSetCallbackOnFrame (hCapWnd, NULL); //停止callbackonframe
return(0);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Form1->DoubleBuffered=true;
 hCapWnd = 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(hCapWnd,i);
  if( a ) break;
 }
  if( !a )
   ShowMessage("攝影機連接失敗..");
// if (!capOverlay(ghCapWnd,true))
// {
    //capPreviewRate(hCapWnd,66);
    //capPreview(hCapWnd,true);
// }    }
//---------------------------------------------------------------------------    
taishyang
站務副站長


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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-05-06 00:36:01 IP:140.135.xxx.xxx 未訂閱
您好:  
// if (!capOverlay(ghCapWnd,true))
// {
    //capPreviewRate(hCapWnd,66);
    //capPreview(hCapWnd,true);
// }
 
 改成 
  capPreviewRate(hCapWnd,66);
  capPreview(hCapWnd,true);
應該就可以了
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-05-06 01:26:32 IP:61.59.xxx.xxx 未訂閱
大俠您好, 這個是知道,這是由這2個函數在做. capPreviewRate(hCapWnd,66); capPreview(hCapWnd,true); 而我們的結果是要用 Form1->Image1->Picture->Bitmap->LoadFromStream( stream ); 來Show到Image1上,但就是不出來. 請多多指教.
taishyang
站務副站長


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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-05-06 13:49:29 IP:140.135.xxx.xxx 未訂閱
您好:
引言: 這個是知道,這是由這2個函數在做. capPreviewRate(hCapWnd,66); capPreview(hCapWnd,true); 而我們的結果是要用 Form1->Image1->Picture->Bitmap->LoadFromStream( stream ); 來Show到Image1上,但就是不出來.
小弟將您的程式碼加上上述的兩行,即可以在Image1上看到畫面
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2004-05-06 16:31:48 IP:61.59.xxx.xxx 未訂閱
在Update Service Pack4之後也一樣,有err.(只是奇怪help->about還是Build 2600 Service Pack1,找錯了?) 可能要抓一下bmp資訊,比對之後才知道. Taishyang兄可否把Project程式寄來讓我參考?好比較是那個地方弄錯. 順便一問,Form1->Image1->Picture->Bitmap->LoadFromStream( stream ); 這個不就是在丟圖到Image1上了嗎? 怎麼還要capPreviewRate(hCapWnd,66); capPreview(hCapWnd,true); 莫非丟圖到Image1上每秒的張數是由這兩個函數來決定? 好像是,請指教. 感謝... 發表人 - 111111dd 於 2004/05/06 16:42:20
taishyang
站務副站長


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2004-05-06 16:56:51 IP:140.135.xxx.xxx 未訂閱
您好:
引言: 在Update Service Pack4之後也一樣,有err.(只是奇怪help->about還是Build 2600 Service Pack1,找錯了?) 可能要抓一下bmp資訊,比對之後才知道. Taishyang兄可否把Project程式寄來讓我參考?好比較是那個地方弄錯.
小弟是原封不動的Copy您的程式碼, 只是多上述兩行程式碼
引言: 順便一問,Form1->Image1->Picture->Bitmap->LoadFromStream( stream ); 這個不就是在丟圖到Image1上了嗎? 怎麼還要capPreviewRate(hCapWnd,66); capPreview(hCapWnd,true); 莫非丟圖到Image1上每秒的張數是由這兩個函數來決定? 好像是,請指教. 您漏看了SDL前輩的第一句話[前面的connect部分不再敘述]
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2004-05-06 17:28:00 IP:61.59.xxx.xxx 未訂閱
請問Taishyang兄,您的builder在help->about 是Build 2600? Service Pack1 or 4? 謝謝您了....
taishyang
站務副站長


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2004-05-06 17:39:56 IP:140.135.xxx.xxx 未訂閱
引言: 您的builder在help->about 是Build 2600? Service Pack1 or 4?
Build 2600 Service Pack1
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2004-05-06 17:53:21 IP:61.59.xxx.xxx 未訂閱
有點搞不懂一樣的環境...我的就是Show不出. 不過也感謝Taishyang兄幫忙.
taishyang
站務副站長


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2004-05-06 18:41:37 IP:140.135.xxx.xxx 未訂閱
您好: 我將專案放到 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=49651 您再試看看囉
111111dd
一般會員


發表:25
回覆:32
積分:11
註冊:2003-12-12

發送簡訊給我
#18 引用回覆 回覆 發表時間:2004-05-06 20:28:43 IP:61.59.xxx.xxx 未訂閱
試了Taishyang兄的project,果然是預料中之事,您的可以我的按button1就是會有如下的err. 把\include內的.h檔改了還是一樣.Builder重安裝也一樣.我的也是XP,看樣子 要一步一步抓Data了......     雨後的空氣總會比較清爽的..... 發表人 - 111111dd 於 2004/05/06 20:45:31
系統時間:2024-11-24 7:44:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!