請問如何在CCD擷取的畫面中畫線~~ |
尚未結案
|
danielkelly
初階會員 發表:36 回覆:108 積分:28 註冊:2003-05-11 發送簡訊給我 |
|
mkbobo
一般會員 發表:4 回覆:68 積分:19 註冊:2003-04-10 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
danielkelly你好: 我不會直接畫在ccd擷取影像上面,但我是先利用FrameCallBack的方法
以33Hz速度得到單張影像,並貼於TImage上,再畫上直線,以下是我的片
段程式碼,參考看看
//33Hz擷取單張影像,並畫上直線; void __fastcall TForm1::Timer1Timer(TObject *Sender) { capSetCallbackOnFrame(hWndC, &FrameCallBack); Image1->Canvas->Pen->Style = psDot; Image1->Canvas->Pen->Mode = pmXor; Image1->Canvas->MoveTo((int)Image1->Width/2,0); Image1->Canvas->LineTo((int)Image1->Width/2,Image1->Height);; Image1->Canvas->MoveTo(0,(int)Image1->Height/2); Image1->Canvas->LineTo(Image1->Width,(int)Image1->Height/2); } //啟動按鈕; void __fastcall TForm1::Button8Click(TObject *Sender) { if(Timer1->Enabled) { Form1->DoubleBuffered = false; Timer1->Enabled = false; Button8->Caption = "Start Copy"; } else { Form1->DoubleBuffered = true; Timer1->Enabled = true; Button8->Caption = "Stop Copy"; } }capSetCallbackOnFrame()是參考之前的文章 http://delphi.ktop.com.tw/topic.php?topic_id=22263 發表人 - jerrykuo 於 2003/12/05 16:25:55 |
mkbobo
一般會員 發表:4 回覆:68 積分:19 註冊:2003-04-10 發送簡訊給我 |
JerryKuo版主說的是預先處理
就是在影像有的時候它會先呼叫
這個capSetCallbackOnFrame(hWndC, &FrameCallBack);
設定的callback func. FrameCallBack <<-- 以下提供你另一種方法你試看看提供你參考
這個是在影像處理完會 呼叫capYieldCallback
< class="code">
LRESULT CALLBACK capYieldCallback( HWND hWnd )
{
MoveToEx(hWnd,0,0,NULL);
LineTo(hWnd,00,10);
LineTo(hWnd,10,10);
LineTo(hWnd,10,0);
LineTo(hWnd,00,0);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
HWND vfwapi=NULL;
vfwapi =capCreateCaptureWindow(
"test",
WS_CHILD | WS_VISIBLE,
0,
0,
50,
50,
Panel1->Handle,
0
); capSetCallbackOnYield(
vfwapi,
&capYieldCallback
);
}
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
mkbobo您好:
我按照您的程式測試但是FormCreate時並沒有效果,畫面正常但Panel上框框並沒有出現
是不是哪邊疏忽了?
< class="code">
//---------------------------------------------------------------------------
LRESULT CALLBACK capYieldCallback( HWND hWnd )
{
MoveToEx(hWnd,0,0,NULL);
LineTo(hWnd,0,10);
LineTo(hWnd,10,10);
LineTo(hWnd,10,0);
LineTo(hWnd,0,0);
}
//--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender)
{
vfwapi =capCreateCaptureWindow("test",WS_CHILD | WS_VISIBLE,
0,0,160,120,Panel1->Handle,0);
capDriverConnect(vfwapi,2);
capPreviewRate(vfwapi,33);
capPreview(vfwapi,true);
capSetCallbackOnYield(vfwapi,&capYieldCallback);
}
//--------------------------------------------------------------------------- 順心 發表人 -
|
MilesWamg
一般會員 發表:18 回覆:37 積分:11 註冊:2003-02-07 發送簡訊給我 |
以圖層的觀念來說的話
Canvas只算單一圖層
所以只要CCD有更新自然就會被覆蓋過去
我提供兩種做法
一在影像蓋過去時 在重新在Canvas上畫線
二另做一個圖層在他之上這時候你要怎麼做便很容易,但是會有一個問題透明怎麼做 這個我目前還不知道 我用的方法是方法一 希望會有高手提供方法二 透明阿
用小畫家劃一張全黑的圖bmp打底(如畫於TPaintBox)
再放於canvas上,很神奇的他是透明的歐
即擷取影像物件上又覆蓋另一個物件
如玻璃一般可以在此(如TPaintBox上作畫)
|
danielkelly
初階會員 發表:36 回覆:108 積分:28 註冊:2003-05-11 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
danielkelly
初階會員 發表:36 回覆:108 積分:28 註冊:2003-05-11 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
影像放在TImage上, 因為不斷的更新畫面, 所以畫框就會被洗掉。
建議你在TImage上加一個TPaintBox, 並將框線畫在TPaintBox上,
這樣會比較明顯, 也比較不容易當掉(例如偵測Motion Detection時需要時常更新畫框顏色, 這個時候, 多channel motion 觸發時容易當掉(<--不明原因))。 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D
[url="http://anpino.begin.8d8d.com"]Programmers Guide[/url] 發表人 - anpino 於 2003/12/15 14:41:19
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
試了許多方法,但都不能video視窗畫出線,不過小弟有一些心得分享給大家 1.之所以不能畫出線原因,是因為這個視窗是Form的最上層,不管怎麼畫線
都會畫在video視窗的下面,並不是因為畫面不斷更新的原因。試試把video
視窗放在Form上,或是Panel上,video視窗都是在最上方,沒有任何元件會
蓋過它。
2.因此假設要畫出線,必需有函數直接畫線在video視窗上,現在還找不到。
3.我們可以發現:只有新的Form才能蓋過video視窗。那是不是建立一透明的
Form放在video視窗上,在這透明Form上畫線就可以達到我們想要的結果呢?
會不會太異想天開。 給大家參考
|
mkbobo
一般會員 發表:4 回覆:68 積分:19 註冊:2003-04-10 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
引言: 有看這個討論串的前輩先進們 在此先說聲抱歉 我上面的回覆是無法正常工作的 本想看個 > 首先 >_< >>< face="Verdana, Arial, Helvetica"> 我原本的意思是, 使用原本可以正常執行的方法一, 只是多加上一個TPaintBox, 並將框線畫在TPaintBox上,而已。 (當然TPaintBox跟顯示範圍一樣大) 數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖VS東方不敗:D [url="http://anpino.begin.8d8d.com"]Programmers Guide[/url] 發表人 - anpino 於 2003/12/18 16:00:58 |
danielkelly
初階會員 發表:36 回覆:108 積分:28 註冊:2003-05-11 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |