想問有關CCD的即時灰階影像 |
缺席
|
esju0000
一般會員 發表:7 回覆:9 積分:3 註冊:2007-09-01 發送簡訊給我 |
抱歉我是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 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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |