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

如何讓 WebCam 可以設定時間差來擷取圖像

尚未結案
qemoumou
一般會員


發表:8
回覆:5
積分:2
註冊:2005-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-12 00:15:43 IP:140.121.xxx.xxx 未訂閱
我利用 capFileSaveDIB(ghCapWnd1,"picture1.bmp"); capFileSaveDIB(ghCapWnd1,"picture2.bmp"); 擷取兩張圖像,但是兩張圖像的拍攝時間差太小。 有沒有什麼辦法可以讓兩張圖像的擷取有個時間差, 卻又不會影響整個系統速度,當我改成 capFileSaveDIB(ghCapWnd1,"picture1.bmp"); Sleep(100); capFileSaveDIB(ghCapWnd1,"picture2.bmp"); 整個時間就會lag
無故障
一般會員


發表:17
回覆:69
積分:17
註冊:2004-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-12 10:09:20 IP:61.221.xxx.xxx 未訂閱
使用 TTimer (較方便,但是時間較不準確)        或是使用 thread    
    int count=0;
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   if (count < 2)
   {
        capFileSaveDIB(ghCapWnd1,"picture"  IntToStr(count) ".bmp");
   }
}    
練習! 練習! 再練習!
------
嘿嘿嘿
qemoumou
一般會員


發表:8
回覆:5
積分:2
註冊:2005-11-05

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-12-13 12:32:10 IP:140.121.xxx.xxx 未訂閱
我用了您說的程式碼出現下面的問題^^ 懇請大大幫幫忙 [C Error] Unit1.cpp(59): E2031 Cannot cast from 'AnsiString' to 'char *'
b740813
一般會員


發表:0
回覆:3
積分:0
註冊:2006-08-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-23 20:00:38 IP:210.70.xxx.xxx 未訂閱

可以試著使用兩個Timer。

第一個Timer用來儲存Picture1,第二個儲存Picture2。

只要在第一個Timer儲存完之後,緊接著觸發第二個Timer應該就可以了。

如此一來時間差就可以自己控制了。

請試試‧‧‧

brian741022
一般會員


發表:7
回覆:9
積分:3
註冊:2006-07-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-21 17:24:36 IP:140.128.xxx.xxx 未訂閱

只要用一個Timer就行了,程式如下:

void __fastcall TForm1::Timer1_Timer(TObject *Sender)
{
CapImg1->Width = Panel1->Width; //使CapImg1的寬度和Panel1一樣
CapImg1->Height = Panel1->Height; //使CapImg1的高度和Panel1一樣
CapImg1->PixelFormat=pf24bit; //???

CapImg2->Width = Panel1->Width;
CapImg2->Height = Panel1->Height;
CapImg2->PixelFormat=pf24bit;

if(frist_time == true) //給一個判斷條件式,再第一時間做以下動作
{
TCanvas *csBuf = new TCanvas;
HDC hDC = GetDC(Panel1->Handle);
csBuf->Handle = hDC;
CapImg1->Canvas->CopyRect(Rect(0, 0, CapImg1->Width, CapImg1->Height),csBuf,
Rect(0, 0, Panel1->Width, Panel1->Height));
//把Panel1所顯示的影像畫到CapImg1 TCanvas *csBuf = new TCanvas;

frist_time = false; //關閉frist_time,使下一次不會有frist_time
}
else //第一次之後都做以下動作
{
TCanvas *csBuf = new TCanvas;
HDC hDC = GetDC(Panel1->Handle);
csBuf->Handle = hDC;
CapImg2->Canvas->CopyRect(Rect(0, 0, CapImg2->Width, CapImg2->Height),csBuf,
Rect(0, 0, Panel1->Width, Panel1->Height));

for ( y = 0; y < CapImg2->Height; y ) //CapImg2-CapImg1
{
ptr1 = (Byte *)CapImg1->ScanLine[y]; //利用ScanLine掃描每一行
ptr2 = (Byte *)CapImg2->ScanLine[y];
for ( x = 0; x < CapImg2->Width; x )
{
d1 = abs(0.33*int(ptr2[x*3]) - 0.33*int(ptr1[x*3])); //把CapImg2-CapImg1丟到CapImg1
d2 = abs(0.33*int(ptr2[x*3 1]) - 0.33*int(ptr1[x*3 1]));
d3 = abs(0.33*int(ptr2[x*3 2]) - 0.33*int(ptr1[x*3 2]));
d1_ = (d1 d2 d3)/3;
if(d1_ > 10)
{
ptr1[x*3]=255;
ptr1[x*3 1]=255;
ptr1[x*3 2]=255;
}
else
{
ptr1[x*3]=abs(0.33*int(ptr2[x*3]) - 0.33*int(ptr1[x*3]));
ptr1[x*3 1]=abs(0.33*int(ptr2[x*3 1]) - 0.33*int(ptr1[x*3 1]));
ptr1[x*3 2]=abs(0.33*int(ptr2[x*3 2]) - 0.33*int(ptr1[x*3 2]));
}
}
}
Image1->Picture->Assign(CapImg1); //把CapImg1指派到Image1

CapImg1->Assign(CapImg2); //把CapImg2指派到CapImg1


}
Form1->DoubleBuffered=true;
}

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