線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:967
推到 Plurk!
推到 Facebook!

關於ccd改變解析度顯示的問題

尚未結案
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-23 12:28:18 IP:218.175.xxx.xxx 未訂閱
各位大大 我本來解析度設在320*240於image上顯示時都ok沒問題~我是使用以下這個方法 但是我改成640*480時就出現出錯了~不知是那裡錯請各位大大幫幫我 這是它的錯誤訊息我把圖片放上來~它是在memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3);這一行出現反藍的不知是不是這邊錯 可是在320*240時放到image上顯示都沒問題的 #define ImageWidth 640      #define ImageHeight 480     HWND hCapWnd; LRESULT CALLBACK FrameCallBack( HWND, Longint);    LPVIDEOHDR VideoStr; unsigned char *CcdBuffer=new unsigned char[ImageWidth*ImageHeight*3]; TForm1 *Form1; //-------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)         : TForm(Owner) { } //------------------------------------------------------------------- class PasteIm {   private:         Byte *ptr2;         int x,y;   public:         Graphics::TBitmap *pBitmap1;         unsigned char *ImPasteBuf;   PasteIm()   {     pBitmap1=new Graphics::TBitmap;     ImPasteBuf=new unsigned char[ImageWidth*ImageHeight*3];   }   void PasteMake(TImage *imag)   {     pBitmap1= imag->Picture->Bitmap ;     for ( y = 0; y < ImageHeight; y++)      {        ptr2 = (Byte *)pBitmap1->ScanLine[y];        for ( x = 0; x < ImageWidth; x++)         {           ptr2[x*3]=ImPasteBuf[((ImageHeight-1-y)*ImageWidth)*3+(x*3)];           ptr2[x*3+1]=ImPasteBuf[((ImageHeight-1-y)*ImageWidth)*3+(x*3+1)];           ptr2[x*3+2]=ImPasteBuf[((ImageHeight-1-y)*ImageWidth)*3+(x*3+2)];                   }      }     imag->Picture->Assign(pBitmap1);   } }; //------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) {  //hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, ImageWidth, ImageHeight,ImProcess->Panel1->Handle, 0 );   hCapWnd = capCreateCaptureWindow("Capture Window", WS_CHILD | WS_VISIBLE, 0, 0, 1, 1, Panel1->Handle, 0);   bool a = false;   for( int i = 0; i < 10; i++ )   {     a = capDriverConnect( hCapWnd, i );     if( a ) break;   }   if( !a )   {     ShowMessage("攝影機連接失敗..");   }   capOverlay(hCapWnd, true);   capPreview(hCapWnd,true);   capPreviewScale(hCapWnd,true);   capPreviewRate(hCapWnd, 1000/30);   Timer1->Enabled =true; } //------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) {  Close(); } //------------------------------------------------------------------- LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr ) { VideoStr=LPVIDEOHDR(lpvhdr); memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3); capSetCallbackOnFrame (hCapWnd, NULL); //停止callbackonframe return(0); } //----------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) {  capSetCallbackOnFrame (hCapWnd, &FrameCallBack);    PasteIm k2;  memcpy(k2.ImPasteBuf ,CcdBuffer,ImageWidth*ImageHeight*3);  k2.PasteMake(Image1) ; } //-------------------------------------------------------------------
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-29 18:32:14 IP:218.175.xxx.xxx 未訂閱
我的CCD是支源到640*480的ㄚ~我先將ccd影像直接顯示在panel這個元件上是ok的~640*480可以顯示出來~但是我再去記憶體抓完放到image元件上就出現以上我說的錯誤了 而320*240就能在image上顯示~所以我不知到底是那有問題~希望大大能幫我找找那錯了 而我覺得是下面這段有問題但是我找不出是那錯希望各位大大能幫忙 //程式設定回傳的函式 capSetCallbackOnFrame (hCapWnd, &FrameCallBack); //某個函式把lpvhdr傳過來 LRESULT CALLBACK FrameCallBack( HWND hwnd, longint lpvhdr ) { VideoStr=LPVIDEOHDR(lpvhdr); //當它傳給我資料 //我要copy時出了錯,它的記憶體指標或者指標所指的資料造成存取違反 memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3); capSetCallbackOnFrame (hCapWnd, NULL); return(0); } 拜託各位大大幫幫我~已經好幾天了我都找不出來~
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-31 12:35:09 IP:61.218.xxx.xxx 未訂閱
首先您必須確認 目前的視訊來源的影像長寬尺寸 你可以使用 capGetVideoFormatSize  及 capGetVideoFormat   來取得 視訊來源的影像格式    如下範例:
    Boolean GetBitmapInfo(PBitmapInfo pbi)
{
 DWORD s;
 Boolean Result ;     Result=False;     s= capGetVideoFormatSize(hCapWnd);
 if (s!=0)
 {
  // getmem(pbi,s);
   pbi=(PBitmapInfo) new char[s];       if (capGetVideoFormat(hCapWnd,pbi,s)==s)  Result=True;
 }     if (Result==False)  ShowMessage("Get Vido Format fail ?");     return Result;
}        LRESULT  OnFrameCallBack( HWND caphwnd,int lpvhdr )
{
 LPVIDEOHDR VideoStr=LPVIDEOHDR(lpvhdr);
 PBitmapInfo pbi;     if ( GetBitmapInfo(pbi)==False ) return(0);     tagBITMAPINFO bi=*pbi;     if ( (bi.bmiHeader.biWidth==640) &&      // 判斷 影像寬度是否為 640
      (bi.bmiHeader.biHeight==480) &&     // 判斷 影像寬度是否為 480
      (bi.bmiHeader.biBitCount==24)       // 判斷 影像色彩是否為 24 bit
    )
 {
  memcpy(CcdBuffer,VideoStr->lpData,ImageWidth*ImageHeight*3);
 }
 else
 {
  // 請重新設定 視訊來源的影像格式
 }     delete pbi;     capSetCallbackOnFrame (hCapWnd, NULL);
 return(0);
}        --------------------------------------
See Also
第十一章 視訊回呼函式應用     
http://netbook.mm520.net
------
︿︿
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-31 18:08:51 IP:218.175.xxx.xxx 未訂閱
可是我的影像寬跟高一開始就寫死了ㄚ我想這樣 #define ImageWidth 640 #define ImageHeight 480 所以視訊應該就是640*480了~且我在panel上能顯示出640*480的影像 只是我再重記藝體把它搬到image上顯示時就錯誤了~所以想請教大大我是那錯了~不過我寫成這樣時 #define ImageWidth 320 #define ImageHeight 240 在panel上能顯示出320*240且搬到image上也能顯示出320*240 而我們ccd也確定支源到640*480~應該在panel上能顯示出640*480
cmf
尊榮會員


發表:84
回覆:918
積分:1032
註冊:2002-06-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-31 21:36:58 IP:61.70.xxx.xxx 未訂閱
我只能說  請確認 您的視訊來源的影像長寬尺寸    您所說的 #define ImageWidth 640 #define ImageHeight 480 並不代表 您的視訊來源的影像長寬尺寸 就是 640x480 ----------------------------- 假設 A 資料長度 = 10 B 資料長度 = 5 L = 10 執行 memcpy(A,B,L); 則將發生錯誤 http://netbook.mm520.net 發表人 - cmf 於 2005/01/31 21:51:30
------
︿︿
dragonhippopdc
一般會員


發表:45
回覆:51
積分:19
註冊:2005-01-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-02-01 11:26:39 IP:218.175.xxx.xxx 未訂閱
謝謝cmf大大~ 能不能請你再解釋清楚一點你貼的這個小範例呢 因為我看不太懂所以不知怎麼改~
qoo1234
版主


發表:256
回覆:1167
積分:659
註冊:2003-02-24

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-02-01 11:58:04 IP:220.131.xxx.xxx 未訂閱
觀念問題..買書或網搜比較快..例如:視訊程式設計-Delphi 講的很詳細    網海無涯,唯學是岸! 因為擁有,所以分享!
系統時間:2024-05-17 11:51:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!