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

想問有關CCD的即時灰階影像

缺席
esju0000
一般會員


發表:7
回覆:9
積分:3
註冊:2007-09-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-24 10:54:19 IP:140.121.xxx.xxx 訂閱
抱歉我是BCB新手
爬過文知道有很多文章都有提到怎麼做
不過就是做不出來QQ
我是抄用http://delphi.ktop.com.tw/board.php?cid=168&fid=921&tid=42651這篇
但是她灰階的部份沒PO好
以下是我程式碼

[code cpp]
//---------------------------------------------------------------------------
#include
#pragma hdrstop
#include "Unit1.h"
#include
#pragma package(smart_init)
#pragma resource "*.dfm"

//---------------------------------------------------------------------------
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
HWND hCapWnd,vc1;
LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr )
{

LPVIDEOHDR VideoStr;
Graphics::TBitmap *TempBitmap;
TempBitmap=new Graphics::TBitmap();

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;
//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; // 偏移至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 );
delete TempBitmap;
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(hCapWnd,true))
//{
capPreviewRate(hCapWnd,66);
capPreview(hCapWnd,true);
capPreviewScale(hCapWnd,true); //使影像延伸到所設定的視窗大小
//}
}
//---------------------------------------------------------------------------

LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus,dfFreq,dfTim;
int x,y;
void __fastcall TForm1::Timer1Timer(TObject *Sender) //我把拷貝的程式碼放在Timer裡
{
QueryPerformanceFrequency(&litmp);//獲得計時器計時頻率
dfFreq=(double)litmp.QuadPart;
QueryPerformanceCounter(&litmp); //獲得初始值
QPart1=litmp.QuadPart;
capSetCallbackOnFrame (hCapWnd, &FrameCallBack);
Graphics::TBitmap *TempBitmap,*TheBitmap;
int i,j;
Byte *ptr1,*ptr2,Gray,r,g,b;
TempBitmap=new Graphics::TBitmap();
TheBitmap=Image1->Picture->Bitmap;
TempBitmap->Assign(TheBitmap);
WORD H=Image1->Picture->Bitmap->Height;
WORD W=Image1->Picture->Bitmap->Width;
for( j=0 ; j//就是這裡不會改QQ
{
ptr1 = (Byte *)TheBitmap->ScanLine[j];
ptr2 = (Byte *)TempBitmap->ScanLine[j];
for( i=0 ; i//還有這裡
{
b=ptr1[i*3];
g=ptr1[i*3 1];
r=ptr1[i*3 2];
Gray=0.299*r 0.587*g 0.114*b;
ptr2[i*3]=ptr2[i*3 1]=ptr2[i*3 2]=Gray;
}
}
Image2->Picture->Assign(TempBitmap);
delete TempBitmap;
QueryPerformanceCounter(&litmp);// 獲得終止值
QPart2 = litmp.QuadPart;
dfMinus = (double)(QPart2 - QPart1);
dfTim = dfMinus / dfFreq;// 獲得對應的時間值
int T = 1000*dfTim;
Label1-> Caption= T;
}
//---------------------------------------------------------------------------
int k=-1;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
k=-1*k;
if (k==1)
{
Timer1->Enabled=true;
Button1->Caption="暫停";
}
else
{
Timer1->Enabled=false;
Button1->Caption="繼續擷取";
}

}
[/code]
會有錯誤訊息如下
http://www.wretch.cc/album/show.php?i=esju&b=1&f=1518590716&p=0
麻煩大大了~~~
編輯記錄
esju0000 重新編輯於 2007-09-25 15:31:08, 註解 無‧
系統時間:2024-05-04 11:04:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!