從CCD擷取影像比對 |
尚未結案
|
chensillin
一般會員 發表:9 回覆:22 積分:6 註冊:2002-08-19 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
chensillin
一般會員 發表:9 回覆:22 積分:6 註冊:2002-08-19 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
|
chensillin
一般會員 發表:9 回覆:22 積分:6 註冊:2002-08-19 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
引言: 在現在ccd每秒抓擷30張畫面 若做比對的話! 預先抓了一張! 之後要是有變化的話比對! 若載入image再從image中和立即抓的影像 先做二元化處理之後與再抓到的影像比對! 但變成抓到的影像也都需先二元化! 那不就覺比對就很耗時,會有某段時間影像跑掉! 不知沒有較快的方法實際上我們在業界,若要做影像比對,是很少採用連續畫面的, 連續畫面只有在保全業裡記錄監視器時使用 CCD 是採被動的模式,通常是利用紅外線感測,再啟動抓取影像 如果在記憶體事先就以儲存影像的編碼值,則僅需計算一次。 這是用在生物辨識領域的做法 但如果你是以走動的人為影像主體的話,辦識會更難比對 除非能"定位",不然沒有基準點要如何比對? 噓~~~~~~沉思中… |
chensillin
一般會員 發表:9 回覆:22 積分:6 註冊:2002-08-19 發送簡訊給我 |
|
ufstep
一般會員 發表:8 回覆:11 積分:3 註冊:2002-04-14 發送簡訊給我 |
引言: 只是現在我論文要做的東西 就是有關影像移動中去判斷他的移動軌跡! 嗯!謝了!提供一些意見: 當你把CCD靜止不動的放著,並且對著純白色的牆壁他還是會抓取畫面的 除非你做了些判斷,你可將畫面切割成多個小塊狀,並且判斷比對每個小塊是否變化 若有則抓取並更新畫面,若無則保持原靜止畫面. 當然就如我剛才所說的,就算是對著一面白牆他還是會不停的 更新畫面,所以在抓取之前你要預設一個Threshold值來作限制 例: const int ThreshHold=2048; 若每一小塊的Pixel變化大於2048時(好比有人在畫面前走動),則進行抓取並更新畫面. 若小於2048(好比光線微量的變化)則不進行後續動作. *在進行任何判斷前將所擷取到的畫面二值化是必要的. 發表人 - ufstep 於 2002/08/21 04:24:13 |
chensillin
一般會員 發表:9 回覆:22 積分:6 註冊:2002-08-19 發送簡訊給我 |
謝謝您!
只是執行有時間問題每秒抓三十張畫面,不是拖太長!
所以每比對一張時間1/30=0.033秒=33毫秒就要結束!
以下是個人的測試
//==========測試執行的時間以毫秒計算
DWORD BTime;
BTime=timeGetTime();
bmpfilename=ridcommon()+".bmp";
capFileSaveDIB(hCapWnd,bmpfilename.c_str() ); //存成bmp檔
Image1->Picture->LoadFromFile(bmpfilename.c_str()); Caption = IntToStr(timeGetTime()-BTime)+" msec.";
//上面程式ridcommon()是我自己寫的函數抓時間命名可把2002/8/21 22:34:22
變成20020821223422,中間若月分小於十會自動補0,這樣所存檔的圖片就可
依時間存檔,下列附上我寫的函數希望對大家有幫助!
String TMainForm::ridcommon(void)
{ String systime;
char *strs;
systime=Now();
strs=systime.c_str(); int i,numberflag=0,monthmonth=0,dayday=0;
String numberyear,numbermonth,numberday,timefilename; for(i=0;i<22;i )
{
if(strs[i]=='/') { numberflag=numberflag 1; continue;} if(numberflag==1) { numbermonth=numbermonth strs[i]; continue; } //numberflag=2 和strs[i]= ' '字元時開始判斷日期是否為個位數,若是前面加0
if(numberflag==2 && strs[i]==' ')
{ numberflag=0;
if(dayday==0)
{ dayday=1;
if ( StrToInt(numberday)< 10 ) {numberday="0" numberday;}
timefilename=timefilename numberday;
}
continue;} //numberflag=2時開始抓日期位置並且判斷月份是否小於十月,小於前面加0
if(numberflag==2)
{ numberday=numberday strs[i];
if(monthmonth==0)
{ monthmonth=1;
if ( StrToInt(numbermonth)< 10 ) {numbermonth="0" numbermonth;}
timefilename=timefilename numbermonth;
}
continue;} if(strs[i]<'0' || strs[i]>'9') continue;
timefilename=timefilename strs[i];
} return(timefilename); }
//============================================================ 這樣就耗了18毫秒左右,第一次執行約100毫秒,之後就是平均約18毫秒!
但是功能完成把測試時間拿掉應可更短,若直接給檔名的話,約9毫秒!
當然這個過程中從CCD立刻抓當時影像存成320*240; 和載入Image中!
只是這個時間可以不管,因為這是開始監控時的第一張圖片! 以下開始說比對!
ufstep 兄台所說使用const int ThreshHold=2048;
測試程式如下:
void __fastcall TMainForm::Timer1Timer(TObject *Sender)
{
HDC currentdc=GetDC(hCapWnd);//擷取CCD立即畫面影像
Memo1->Text= Image1->Canvas->Pixels[1][1];//預取圖片點值
Memo2->Text=TColor(GetPixel(currentdc,1,1));//目前畫面點值
}
只是我的ccd取單點比對測試結果同一點因光線變化量約6000上下!
我想是我的日光燈和ccd較差吧!但是使用特別使用Power Guard軟體
在同樣的設備下只要靜止不動還真的比對不動,完全不受光線影像!
當外在影像真的有動才開始監控!所以是在程式方面做了一定的處置! 現在我準備改為灰階來比對來測試看看!結果在給大家看!
在這個過程中,希望大家能陸續給意見一下!
因為第一張預取不管灰階或二元值處理時間不是問題!
但是緊樣是取立即影像從BMP再經灰階、二元值處理有時間.....?
當然二個FOR迴圈 320*240變成灰階.....直接做比對
當然也可給一個光量變化的適當量當作閥值!
或是變成二元值,之後做比值!
當然我不會完全比對每一點數值,應該採用抽樣來節省時間! 大家幫幫忙吧!謝謝大家!看各位是否有更好的意見!
我只要有最新進展一定POST告訴大家 發表人 - chensillin 於 2002/08/22 04:39:45
|
yita529
一般會員 發表:4 回覆:10 積分:2 註冊:2003-10-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |