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

請教影像直接於記憶體處理之問題

尚未結案
swindler
一般會員


發表:13
回覆:22
積分:17
註冊:2003-01-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-10-23 16:18:06 IP:140.122.xxx.xxx 未訂閱
有感於存取影像檔在進行編碼處理的速度太慢 參考各位大大之前的文章 進行修改成記憶體直接處理 目前已可進行編碼動作  不過 編碼有時會有錯誤訊息出現 及速度並沒有提升很多  有幾個問題想請教各位大大    
.......
HWND hWndC;
CAPTUREPARMS USB_CCD;
LPVIDEOHDR VideoStr;
Byte *FrameBuf;
int FrameSize;
int FrameWidth,FrameHeight,FrameNColor;
int frame_count = 1002 ;
int new_frame = 1001 ;
char s[20];    LRESULT CALLBACK FrameCallBack( HWND hwnd, Longint lpvhdr)
{
 static BITMAPINFOHEADER BitmapHead;
 static BITMAPINFO BitmapInfo;
 static BITMAPFILEHEADER BitmapFileHead;
 CAPSTATUS status;
 int BIHsize;     //取得圖片資料
 VideoStr=LPVIDEOHDR(lpvhdr);
 //取得CAP訊息
 capGetStatus(hWndC, &status, sizeof(status) ) ;
 //取得圖片格式容量大小
 BIHsize=capGetVideoFormatSize(hWndC);
 //取得圖片格式 代入 bitmapinfohead 內
 capGetVideoFormat(hWndC, &BitmapHead, BIHsize);
 // 編碼影像資料設定  
 FrameWidth=BitmapHead.biWidth;
 FrameHeight=BitmapHead.biHeight;
 FrameNColor=BitmapHead.biBitCount; 
// 將資料存入 
int cnt;
if(FrameBuf==0)
  {
   FrameSize=VideoStr->dwBufferLength;
   FrameBuf=new Byte[FrameSize];
  }
  for( cnt=0;cnt<FrameSize;cnt  )
  {
    FrameBuf[cnt]= VideoStr->lpData[cnt];
  }
  capSetCallbackOnFrame(hWndC,NULL);
  return (0);
}
//---------------------------------------------
void __fastcall TForm1::N2Click(TObject *Sender)
{
  hWndC = capCreateCaptureWindow("USB_CCD",WS_CHILD | WS_VISIBLE,
                                   0,0, 320,240,Panel2->Handle,0);
  capDriverConnect(hWndC,0);
  capOverlay(hWndC, true); 
  capPreview(hWndC,true); //抓取影像出現在視窗中
  capPreviewRate(hWndC, 1000/20); //每秒影像變化張數
  USB_CCD.dwRequestMicroSecPerFrame = 1000000/20;
  Timer1->Enabled=true;//設成50ms 啟動一次
}
//----------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  sprintf(s,"C:\\temp\\%d.cod",frame_count);
  capSetCallbackOnFrame(hWndC, &FrameCallBack);
  LoadFromBuf(FrameBuf,FrameWidth,FrameHeight,FrameNColor);
  //自寫之編碼函數,測試結果只需30ms左右
  frame_count   ;
} 
..............................
小弟剛寫程式 有些程式排程上不甚瞭解,希望各位大大賜教 問題1: 有時會出現[Access violation at address 0640A928 in module "server.exe" read of address] 但編碼動作依然執行 請問這是處理速度不夠快造成的嗎 如何改善 程式執行動作 因為我對320*240影像編碼只需30ms 理論上應該可以 處理20張/秒以上 事實卻不然 問題2:若這裡 capPreviewRate(hWndC, 1000/20); USB_CCD.dwRequestMicroSecPerFrame = 1000000/20; 是如此設定 但硬體速度未達此更新速率(如使用WEBCAM),請問我執行 capSetCallbackOnFrame(hWndC, &FrameCallBack); 速度會拖慢編碼嗎 發表人 - taishyang 於 2003/10/23 17:14:39
taishyang
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-10-23 17:13:35 IP:140.135.xxx.xxx 未訂閱
swindler您好: 您的問題與我的問題相當類似 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=39134 處理速度似乎就取決於您攝影機的擷取速度了
系統時間:2024-04-30 20:06:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!