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

利用HDC連續擷取圖之問題~~

缺席
hilton1233
一般會員


發表:7
回覆:1
積分:1
註冊:2007-07-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-09-14 13:17:24 IP:140.124.xxx.xxx 訂閱
以下程式主要是利用HDC連續擷取3張圖片,在這之前有先開啟視訊,想取每張即時圖片之每一固定行像素值,要作成資料庫,但是程式執行時,3張圖片所取下來的像素值都一模一樣(利用MEMO來觀察),並且開始擷取時,視訊畫面會停下來,我猜可能是畫面停下來的關係,所以才都一樣,想問的是如何才能取圖片時,視訊畫面保持動作呢!?? <textarea class="cpp" rows="10" cols="90" name="code">視訊已開啟,接著是下面取圖當資料庫程式~~ for(int i=0;i<3;i ) //動態取一到三十張圖 { AnsiString bmpFileName; Byte *ptr1; Graphics::TBitmap *Bitmap1=new Graphics::TBitmap(); Bitmap1->Width=Panel1->Width; Bitmap1->Height=Panel1->Height; Bitmap1->PixelFormat=pf24bit;//有可能要改這邊 //capGrabFrameNoStop(FVideoCapWinH); TCanvas *csBuf=new TCanvas; HDC hDC=GetDC(Panel1->Handle); csBuf->Handle=hDC; Bitmap1->Canvas->CopyRect(Rect(0, 0, Bitmap1->Width, Bitmap1->Height), csBuf, Rect(0, 0, Panel1->Width, Panel1->Height)); //把Panel1所顯示的影像畫到Bitmap1 TCanvas *csBuf = new TCanvas; //Graphics::TBitmap *Bitmap2=new Graphics::TBitmap(); //Bitmap2->PixelFormat=pf24bit;//有可能要改這邊 //Bitmap2->Assign(Bitmap1); switch(i) { case 0: for(int j=0;jHeight;j ) { ptr1=(Byte*)Bitmap1->ScanLine[j]; for(int i=0;iWidth;i ) { if(i==0)//所訂第0行 { Memo1->Lines->Add(int(ptr1[3*i]));//先看看第0張圖片他的第0行的所有像素質,像素值應該在0~255間,應該有240個值 } } } delete Bitmap1; //delete Bitmap2; ReleaseDC(0,hDC); delete csBuf; Form1->DoubleBuffered=true; //若上面可以也要試看看定住某一列,看那一列所有像素值,是否在0~255間,應該有320值 break; case 1: for(int j=0;jHeight;j ) { ptr1=(Byte*)Bitmap1->ScanLine[j]; for(int i=0;iWidth;i ) { if(i==0)//所訂第0行 { Memo2->Lines->Add(int(ptr1[3*i]));//先看看第0張圖片他的第0行的所有像素質,像素值應該在0~255間,應該有240個值 } } } delete Bitmap1; //delete Bitmap2; ReleaseDC(0,hDC); delete csBuf; Form1->DoubleBuffered=true; //若上面可以也要試看看定住某一列,看那一列所有像素值,是否在0~255間,應該有320值 break; case 2: for(int j=0;jHeight;j ) { ptr1=(Byte*)Bitmap1->ScanLine[j]; for(int i=0;iWidth;i ) { if(i==0)//所訂第0行 { Memo3->Lines->Add(int(ptr1[3*i]));//先看看第0張圖片他的第0行的所有像素質,像素值應該在0~255間,應該有240個值 } } } delete Bitmap1; //delete Bitmap2; ReleaseDC(0,hDC); delete csBuf; Form1->DoubleBuffered=true; //若上面可以也要試看看定住某一列,看那一列所有像素值,是否在0~255間,應該有320值 break; case 3: for(int j=0;jHeight;j ) { ptr1=(Byte*)Bitmap1->ScanLine[j]; for(int i=0;iWidth;i ) { if(i==0)//所訂第0行 { Memo4->Lines->Add(int(ptr1[3*i]));//先看看第0張圖片他的第0行的所有像素質,像素值應該在0~255間,應該有240個值 } } } delete Bitmap1; //delete Bitmap2; ReleaseDC(0,hDC); delete csBuf; Form1->DoubleBuffered=true; //若上面可以也要試看看定住某一列,看那一列所有像素值,是否在0~255間,應該有320值 break; } } </textarea>
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-09-14 14:01:19 IP:220.134.xxx.xxx 訂閱
試試看在主要的 for loop 前加上 Application->ProcessMessages() 如

<textarea class="cpp" rows="10" cols="90" name="code">for(int j=0;jHeight;j ) { Application->ProcessMessages(); // 讓程式其他訊息可繼續運作及處理 // ... </textarea>

因為在迴圈內,處理控制權沒有釋出,一定要等它作完才會換別人作。

強力推薦 ShareMe 免費網路硬碟 VMASK VMIO-Server/SECS/GEM dllee's blog dllee's StatPlus
------
http://www.ViewMove.com
編輯記錄
dllee 重新編輯於 2007-09-14 14:03:13, 註解 無‧
dllee 重新編輯於 2007-09-14 14:06:03, 註解 使用 FireFox 似乎貼程式碼有問題, 改用 IE 試試看‧
hilton1233
一般會員


發表:7
回覆:1
積分:1
註冊:2007-07-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-09-14 16:34:40 IP:140.124.xxx.xxx 訂閱
謝謝大大的回覆,影像確實有動作了~但整個程式執行變很緩慢,不知道還有其它方法可以使用嗎!??
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-09-14 17:07:12 IP:59.105.xxx.xxx 訂閱
減少 Application->ProcessMessages() 的次數,

例如 if(j0==0)Application->ProcessMessages(); // 比之前來說,每100次才作 1 次

其他的方法,可以使用不同的執行緒處理,或是其他可以分工或多工的方式都行。

強力推薦 ShareMe 免費網路硬碟 VMASK VMIO-Server/SECS/GEM dllee's blog dllee's StatPlus
------
http://www.ViewMove.com
johnpage
初階會員


發表:0
回覆:79
積分:40
註冊:2004-08-07

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-09-14 23:59:16 IP:218.175.xxx.xxx 訂閱
注意 軟體處理時, 影像一直在變動, 有可能同一筆有好幾種時間資料,
建議由DSP處理 或是改用更快的架構 不要一直把控制權讓出來
會造成資料不同步
licheer
一般會員


發表:23
回覆:20
積分:8
註冊:2007-08-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-09-15 13:57:21 IP:122.127.xxx.xxx 訂閱
寫個 function 
然後在 loop 裡 call 它
也能有一樣的效果
呵呵~ 不過我還沒搞懂為何要這樣寫


[code cpp]
void DoEvents(int nCount) //nCount:doevent 多少次
{
MSG msg;
for (int i = 0; i < nCount; i )
{
while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
[/code]
系統時間:2024-11-24 7:11:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!