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

畫面閃爍

答題得分者是:taishyang
kkk1225
一般會員


發表:7
回覆:14
積分:4
註冊:2010-03-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2010-06-02 21:13:33 IP:140.120.xxx.xxx 訂閱
請教各位一下,當擷取攝影機畫面到Image1上(1秒30張),再另外擷取攝影機畫面到Image2上(1秒20張),
之後再把2個畫面相減,找出移動物體的部份顯示在Image3上,都是即時動態方式呈現,
但是執行完後,找出移動物體部分會一直閃爍,請問有什麼方式可以不讓畫面一直閃爍。
我參考過文章是加上
Form1->DoubleBuffered=true ;
Panel1->DoubleBuffered=true ;
但是加上之後,還是會一直閃爍。
ps: 擷取攝影機畫面到Image是用Timer元件的方式。
多多指導一下,謝謝
------
多多指教
kkk1225
一般會員


發表:7
回覆:14
積分:4
註冊:2010-03-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2010-06-08 15:46:04 IP:140.120.xxx.xxx 訂閱
不好意思,假如改成連續影像畫面上一張減掉下一張的方法,例如第2張減第1張,第3張減第2張,以此類推。 
當程式執行後,影像畫面有白點閃爍。請問有什麼方法可以使它消失。
感謝各位指導一下,謝謝
[code cpp]
#include
#pragma hdrstop
#include //宣告影像處理標頭檔
#include //宣告影像剪接和複製
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HWND cap1; //設定攝影機名稱
int count=0; //畫面計數
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N6Click(TObject *Sender)
{
cap1=capCreateCaptureWindow( "My cap",
WS_CHILD | WS_VISIBLE,
0,0,Panel1->Width,
Panel1->Height,
Panel1->Handle,
0); //建立視訊擷取視窗

capDriverConnect( cap1,0 ); //連接攝影機
capPreview(cap1,true); //擷取影像出現在視窗中
capPreviewScale(cap1,true); //使影像延伸到所設定的視窗大小
capPreviewRate(cap1, 1000/30); //影像張數變化速率
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N7Click(TObject *Sender)
{
capDriverDisconnect(cap1); //停止攝影機
}
//---------------------------------------------------------------------------

void __fastcall TForm1::N9Click(TObject *Sender) //擷取攝影機視窗到影像 1
{

Timer2->Interval=1000/30;
Timer2->Enabled =true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::binaryClick(TObject *Sender) //二值化
{

Timer1->Interval=1000/15;
Timer1->Enabled =true;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Timer1Timer(TObject *Sender) //由Timer1控制影像相減
{
count ;
Graphics::TBitmap* BMP1 =new Graphics::TBitmap();
BMP1->Assign(Image1->Picture->Bitmap);
BMP1->PixelFormat=pf24bit;
int i,j,d;
byte *ptr;
int frame_now[256][337];
int frame_next[256][337];

for(j=0;jHeight;j )
{
ptr = (Byte *)BMP1->ScanLine[j];
for(i=0;iWidth;i )
{
if ((count%2)==0)
frame_now[j][i] = (77*ptr[i*3 2] 151*ptr[i*3 1] 28*ptr[i*3])/256;
else
frame_next[j][i] = (77*ptr[i*3 2] 151*ptr[i*3 1] 28*ptr[i*3])/256;
}
}

for(j=0;jHeight;j )
{
ptr = (Byte *)BMP1->ScanLine[j];
for(i=0;iWidth;i )
{
d = abs(frame_now[j][i]-frame_next[j][i]);
if(d<30)
{
ptr[i*3]=0;
ptr[i*3 1]=0;
ptr[i*3 2]=0;
}
else
{
ptr[i*3]=255;
ptr[i*3 1]=255;
ptr[i*3 2]=255;
}
}
}

Image2->Picture->Bitmap->Assign(BMP1);
delete BMP1;
Form1->DoubleBuffered=true ; //讓畫面不再閃爍

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender) //由Timer2控制連續擷取影像
{
Graphics::TBitmap *Bmp=new Graphics::TBitmap();
Bmp->PixelFormat=pf24bit;
capEditCopy(cap1);

if(Clipboard()->HasFormat(CF_DIB))
{

Bmp->Assign(Clipboard());
Image1->Picture->Assign(Bmp);

delete Bmp;

}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->DoubleBuffered=true ; //讓畫面不再閃爍

}
//---------------------------------------------------------------------------


[/code]

------
多多指教
taishyang
站務副站長


發表:377
回覆:5485
積分:4552
註冊:2002-10-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2010-06-08 15:55:22 IP:122.116.xxx.xxx 訂閱
 DoubleBuffered只需設定一次就可以了 ^^
kkk1225
一般會員


發表:7
回覆:14
積分:4
註冊:2010-03-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2010-06-08 19:43:43 IP:140.120.xxx.xxx 訂閱
感謝taishyang你的回答,已經改成一次,但是結果還是一樣沒變。
影像畫面還是有幾條白點的線條一直閃爍。
------
多多指教
kkk1225
一般會員


發表:7
回覆:14
積分:4
註冊:2010-03-02

發送簡訊給我
#5 引用回覆 回覆 發表時間:2010-06-09 13:50:13 IP:140.120.xxx.xxx 訂閱
問題已解決。
資料型態錯誤,把int改成double即可。
畫面就不會在閃爍了。
------
多多指教
wgbird
一般會員


發表:0
回覆:4
積分:0
註冊:2010-07-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2010-07-01 13:44:06 IP:114.137.xxx.xxx 訂閱
我也有這樣的問題請問你是如何解決的,
"資料型態錯誤,把int改成double即可" <---------我實在找不到
可否指點一下迷津?
kkk1225
一般會員


發表:7
回覆:14
積分:4
註冊:2010-03-02

發送簡訊給我
#7 引用回覆 回覆 發表時間:2010-07-01 15:40:31 IP:140.120.xxx.xxx 訂閱
請問是影像畫面有幾條白點的線條在閃爍嗎
我的是這種情形。
你的部份是什麼情形。

------
多多指教
wgbird
一般會員


發表:0
回覆:4
積分:0
註冊:2010-07-01

發送簡訊給我
#8 引用回覆 回覆 發表時間:2010-07-03 17:27:44 IP:116.59.xxx.xxx 訂閱
我是背景閃動的很嚴重,Application則是小閃動
我有打開DoubleBuffered
kkk1225
一般會員


發表:7
回覆:14
積分:4
註冊:2010-03-02

發送簡訊給我
#9 引用回覆 回覆 發表時間:2010-07-05 09:57:28 IP:140.120.xxx.xxx 訂閱
我是把int frame_now[256][337]; int frame_next[256][337];修改成double
或是放在全域區域,就不會有白點閃爍了,這是我用的方法。


------
多多指教
系統時間:2017-10-17 17:34:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!