111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
想用capCaptureSingleFrame來抓一個Frame 到Memory之後再Show到一個Panel上,要怎麼做?用capGrabFrameNoStop();會直接Show 到Panel,是想處理之後再Show 到Panel.
請指教一下.
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
看起來應該就是.我試試.
DouSei Taishyang.
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
因初次用這個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
發送簡訊給我
|
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
請教這個函數LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )是每從CCD(WebCAM)取出一張Fram就會被硬体觸發一次?
那我們在什麼地方設定它的取樣時間及它的解析度?
CAPTUREPARMS?
3Q.
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
有試過,不是這個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
發送簡訊給我
|
您好:
// if (!capOverlay(ghCapWnd,true))
// {
//capPreviewRate(hCapWnd,66);
//capPreview(hCapWnd,true);
// }
改成
capPreviewRate(hCapWnd,66);
capPreview(hCapWnd,true); 應該就可以了
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
大俠您好,
這個是知道,這是由這2個函數在做.
capPreviewRate(hCapWnd,66);
capPreview(hCapWnd,true);
而我們的結果是要用
Form1->Image1->Picture->Bitmap->LoadFromStream( stream );
來Show到Image1上,但就是不出來.
請多多指教.
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
您好: 引言:
這個是知道,這是由這2個函數在做.
capPreviewRate(hCapWnd,66);
capPreview(hCapWnd,true);
而我們的結果是要用
Form1->Image1->Picture->Bitmap->LoadFromStream( stream );
來Show到Image1上,但就是不出來. 小弟將您的程式碼加上上述的兩行,即可以在Image1上看到畫面
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
在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
發送簡訊給我
|
您好: 引言:
在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
發送簡訊給我
|
請問Taishyang兄,您的builder在help->about 是Build 2600?
Service Pack1 or 4?
謝謝您了....
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
引言:
您的builder在help->about 是Build 2600?
Service Pack1 or 4? Build 2600 Service Pack1
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
有點搞不懂一樣的環境...我的就是Show不出.
不過也感謝Taishyang兄幫忙.
|
taishyang
站務副站長
發表:377 回覆:5490 積分:4563 註冊:2002-10-08
發送簡訊給我
|
|
111111dd
一般會員
發表:25 回覆:32 積分:11 註冊:2003-12-12
發送簡訊給我
|
試了Taishyang兄的project,果然是預料中之事,您的可以我的按button1就是會有如下的err.
把\include內的.h檔改了還是一樣.Builder重安裝也一樣.我的也是XP,看樣子
要一步一步抓Data了......
雨後的空氣總會比較清爽的..... 發表人 - 111111dd 於 2004/05/06 20:45:31
|