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

關於使用VFW擷取影像造成記憶體越吃越多的問題

尚未結案
Aoe
一般會員


發表:1
回覆:2
積分:0
註冊:2004-05-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-19 17:10:10 IP:203.67.xxx.xxx 未訂閱
各位先進大家好 小弟日前根據板面上文章使用vfw完成了webcam的攝影程式 (無影像擷取卡) 但是發覺當錄影的時間越長 程式就會吃掉更多的記憶體.. 到最後整台電腦會幾乎當掉.. 請問是否有辦法改善..? 謝謝大家^^
fnk
高階會員


發表:40
回覆:149
積分:102
註冊:2004-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-22 11:00:38 IP:140.124.xxx.xxx 未訂閱
可否附上你的程式碼..    存檔會造成問題, 可能是你程式撰寫時有些小細節沒考慮到..    據我所知, 應該是使用USB類的攝影機..會比較吃CPU的資源...    所以..若要降低CPU的負擔..或許可以考慮買張影像擷取卡...    市面上有幾家販售影像擷取卡的公司...價格從幾千到幾萬塊不等...    登昌恆 http://www.upmost.com.tw/ 泰洛 http://www.nowa.com.tw/ 你可以參考看看 !! =========== 有興趣,就能進步 ===========
Aoe
一般會員


發表:1
回覆:2
積分:0
註冊:2004-05-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-02-15 04:00:52 IP:211.74.xxx.xxx 未訂閱
引言: 可否附上你的程式碼.. 存檔會造成問題, 可能是你程式撰寫時有些小細節沒考慮到.. 據我所知, 應該是使用USB類的攝影機..會比較吃CPU的資源... 所以..若要降低CPU的負擔..或許可以考慮買張影像擷取卡... 市面上有幾家販售影像擷取卡的公司...價格從幾千到幾萬塊不等... 登昌恆 http://www.upmost.com.tw/ 泰洛 http://www.nowa.com.tw/ 你可以參考看看 !! =========== 有興趣,就能進步 ===========
//---------------------------------------------------------------------------    #include 
#pragma hdrstop
#include 
#include "Unit1.h"    #include "vfw.h"
#include "jpeg.hpp"
#include     //---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "trayicon"
#pragma resource "*.dfm"
TForm1 *Form1;
HWND hCapWnd;
BITMAPINFO bmi;
CAPTUREPARMS CaptureParms;
int y,part,dd,hh,mm,ss,width,height,part_y,a,hh_add;
AnsiString time_file;    //---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------    void __fastcall TForm1::FormCreate(TObject *Sender)
{
  width=320;
  height=240;
  Form1->Width=width 38;
  Form1->Height=height 104;
  img1->Top=height 50;
  CaptureParms.fYield = true;
  hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, width, height,Form1->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); //使用hardware overlay使video input directly into framebuffer,使不用CPU resources.
  capPreview(hCapWnd,true);
  capPreviewScale(hCapWnd,true);
  capPreviewRate(hCapWnd, 1000/30);
  capGetVideoFormat(hCapWnd, &bmi, sizeof(BITMAPINFO));
  bmi.bmiHeader.biWidth=width;
  bmi.bmiHeader.biHeight=height;
  SetWindowPos(hCapWnd, 0, 0, 0, bmi.bmiHeader.biWidth,bmi.bmiHeader.biHeight,0);
  Form1->Panel1->ClientHeight=bmi.bmiHeader.biHeight;
  Form1->Panel1->ClientWidth=bmi.bmiHeader.biWidth;
  capDlgVideoCompression(hCapWnd);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N3Click(TObject *Sender)
{
  hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, width, height,Form1->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);
  capGetVideoFormat(hCapWnd, &bmi, sizeof(BITMAPINFO));
  bmi.bmiHeader.biWidth=width;
  bmi.bmiHeader.biHeight=height;
  SetWindowPos(hCapWnd, 0, 0, 0, bmi.bmiHeader.biWidth,bmi.bmiHeader.biHeight,0);
  Form1->Panel1->ClientHeight=bmi.bmiHeader.biHeight;
  Form1->Panel1->ClientWidth=bmi.bmiHeader.biWidth;
  N3->Enabled=false;
  N4->Enabled=true;
  Btn1->Enabled=true;
  Btn3->Enabled=true;
}
void __fastcall TForm1::N9Click(TObject *Sender)
{
  Form1->FormStyle=fsStayOnTop;
  N9->Enabled=false;
  N10->Enabled=true;
  if(N3->Enabled==false)
  {
    hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, width, height,Form1->Panel1->Handle, 0 );
    bool a = false;
    for( int i = 0; i < 10; i   )
    {
      a = capDriverConnect( hCapWnd, i );
      if( a ) break;
    }
    if( !a )
    {
      ShowMessage("攝影機連接失敗..");
    }
    capPreview(hCapWnd,true);
    capPreviewRate(hCapWnd, 1000/30);
    capPreviewScale(hCapWnd,true);
    capOverlay(hCapWnd, true);
    BITMAPINFO bmi;
    capGetVideoFormat(hCapWnd, &bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biWidth=width;
    bmi.bmiHeader.biHeight=height;
    SetWindowPos(hCapWnd, 0, 0, 0, bmi.bmiHeader.biWidth,bmi.bmiHeader.biHeight,0);
    Form1->Panel1->ClientHeight=bmi.bmiHeader.biHeight;
    Form1->Panel1->ClientWidth=bmi.bmiHeader.biWidth;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N10Click(TObject *Sender)
{
  Form1->FormStyle=fsNormal;
  N10->Enabled=false;
  N9->Enabled=true;
  if(N3->Enabled==false)
  {
    hCapWnd = capCreateCaptureWindow("My Capture Window", WS_CHILD | WS_VISIBLE,0, 0, width, height,Form1->Panel1->Handle, 0 );
    bool a = false;
    for( int i = 0; i < 10; i   )
    {
      a = capDriverConnect( hCapWnd, i );
      if( a ) break;
    }
    if( !a )
    {
      ShowMessage("攝影機連接失敗..");
    }
    capPreview(hCapWnd,true);
    capPreviewRate(hCapWnd, 1000/30);
    capPreviewScale(hCapWnd,true);
    capOverlay(hCapWnd, true);
    BITMAPINFO bmi;
    capGetVideoFormat(hCapWnd, &bmi, sizeof(BITMAPINFO));
    bmi.bmiHeader.biWidth=width;
    bmi.bmiHeader.biHeight=height;
    SetWindowPos(hCapWnd, 0, 0, 0, bmi.bmiHeader.biWidth,bmi.bmiHeader.biHeight,0);
    Form1->Panel1->ClientHeight=bmi.bmiHeader.biHeight;
    Form1->Panel1->ClientWidth=bmi.bmiHeader.biWidth;
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  if(Btn3->Caption=="開始錄影")
  {
    Form1->Caption="攝影機--現在時間: " Time();
  }
  if(Btn3->Caption=="停止錄影")
  {
    if(ss==60)
    {
      ss=0;
      mm  ;
      if(part==4)part = 0;
      else part =1;
      a=0;
      Timer3->Enabled=true;
      Timer4->Enabled=true;
      capCaptureStop(hCapWnd);
    }
    if(mm==60)
    {
      mm=0;
      hh  ;
      hh_add  ;
      if(hh_add==2147483647) hh_add=0;
    }
    if(hh==24)
    {
      hh=0;
      dd  ;
      if(dd==2147483647) dd=0;
    }
    Form1->Caption="攝影機--錄影中: " IntToStr(dd) " 天" IntToStr(hh) " 時" IntToStr(mm) " 分" IntToStr(ss) " 秒";
    ss  ;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Btn3Click(TObject *Sender)
{
    if(Btn3->Caption=="開始錄影")
    {
      part=0;          SaveDialog1->FileName=Now().FormatString("yymmddhhnnss");
      if(SaveDialog1->Execute())
      {
        Application->Minimize();
        ShowWindow(Application->Handle, SW_HIDE);
        capCaptureGetSetup(hCapWnd,&CaptureParms,sizeof(CAPTUREPARMS));
        CaptureParms.fYield = true;
        CaptureParms.vKeyAbort = VK_F1;
        CaptureParms.fAbortLeftMouse = false;
        CaptureParms.fAbortRightMouse = false;
        CaptureParms.dwIndexSize = 324000;
        capCaptureSetSetup(hCapWnd,&CaptureParms,sizeof(CAPTUREPARMS));
        capFileSetCaptureFile(hCapWnd,(SaveDialog1->FileName "_time" part ".avi").c_str());
        capCaptureSequence(hCapWnd);
        FILE *file;
        file=fopen("state.dat","w");
        fprintf(file,"%d",part);
        fclose(file);
        dd=0;
        hh=0;
        mm=0;
        ss=0;
        part_y=0;
        hh_add=0;
        Btn3->Caption="停止錄影";
        N1->Enabled=false;
        N2->Enabled=false;
        N8->Enabled=false;
        N11->Enabled=false;
        if(Btn2->Enabled==true)
        {
          Btn2->Enabled=false;
          y=1;
        }
        Btn1->Enabled=false;
      }
    }
    else
    {
      capCaptureStop(hCapWnd);
      Timer3->Enabled=false;
      Timer4->Enabled=false;
      N1->Enabled=true;
      N2->Enabled=true;
      N8->Enabled=true;
      N11->Enabled=true;
      if(y==1)
      {
        Btn2->Enabled=true;
        y=0;
      }
      Btn1->Enabled=true;
      Btn3->Caption="開始錄影";
    }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
   if(a==0)
   {
     a=1;
   }
   else
   {
     Timer4->Enabled=false;
     Timer3->Enabled=false;
   }
}
//---------------------------------------------------------------------------    void __fastcall TForm1::Timer4Timer(TObject *Sender)
{
        FILE *file;
        file=fopen("state.dat","w");
        fprintf(file,"%d",part);
        fclose(file);
        capCaptureSetSetup(hCapWnd,&CaptureParms,sizeof(CAPTUREPARMS));
        capFileSetCaptureFile(hCapWnd,(SaveDialog1->FileName "_time" part ".avi").c_str());
        capCaptureSequence(hCapWnd);
}
//---------------------------------------------------------------------------
發表人 - jerrykuo 於 2005/02/15 12:43:41
Aoe
一般會員


發表:1
回覆:2
積分:0
註冊:2004-05-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-02-15 04:02:40 IP:211.74.xxx.xxx 未訂閱
引言: 可否附上你的程式碼.. 存檔會造成問題, 可能是你程式撰寫時有些小細節沒考慮到.. 據我所知, 應該是使用USB類的攝影機..會比較吃CPU的資源... 所以..若要降低CPU的負擔..或許可以考慮買張影像擷取卡... 市面上有幾家販售影像擷取卡的公司...價格從幾千到幾萬塊不等... 登昌恆 http://www.upmost.com.tw/ 泰洛 http://www.nowa.com.tw/ 你可以參考看看 !! =========== 有興趣,就能進步 ===========
上面那篇為我的部分程式碼 是否無法從程式中取得改善 非得要使用硬體擷取卡才會獲得改善呢? 謝謝^^
系統時間:2024-05-17 14:59:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!