基于OpenCV的火焰檢測尖角特征代碼_第1頁
基于OpenCV的火焰檢測尖角特征代碼_第2頁
基于OpenCV的火焰檢測尖角特征代碼_第3頁
基于OpenCV的火焰檢測尖角特征代碼_第4頁
基于OpenCV的火焰檢測尖角特征代碼_第5頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

基于OpenCV的火焰檢測尖角特征代碼voidCPatternrecognitionDlg::SharpAngle(IplImage*pImage)//,CvPointAnglePointPosition[])

{

SharpAngle_Num=0;

intlWidth,lHeight;

unsignedchar*lpimage,*lpSrc;

inti,j,m;

//邊界掃描的方向數(shù)目計(jì)數(shù)

intDirectSum1;

intDirectSum2;

//掃描中的臨時寬(從左往右)

inttempW;

//掃描中的臨時高(從上往下)

inttempH;

//掃描到的連續(xù)目標(biāo)白點(diǎn)計(jì)數(shù)

intCount=0;

//用于尖角頂點(diǎn)判定條件(起始掃描點(diǎn)設(shè)為左、右兩個邊界點(diǎn),左右可以重合為一個點(diǎn))

//條件一:首先必須是頂點(diǎn)(尖或廣義平尖角,即該點(diǎn)上方無目標(biāo)白點(diǎn))

intFindTopPoint1=0;

//條件二:如果是廣義平尖角即同一行有幾個連續(xù)的目標(biāo)白點(diǎn),則這個連續(xù)目標(biāo)白點(diǎn)個數(shù)必須小于閾值

intFindTopPoint2=0;

//尖角頂點(diǎn)的起始點(diǎn)和結(jié)束點(diǎn)下標(biāo)

intTopPointFirst=0,TopPointEnd=0;

//左右邊界點(diǎn)下標(biāo)(橫坐標(biāo))及其相隔點(diǎn)數(shù)

intColumnL,ColumnR,BounderSpaceNum;

//尖角左右邊界交點(diǎn)的縱坐標(biāo),及尖角高度(用這兩個條件判斷尖角)

intRowSumL,RowSumR;//左右邊界方向,掃描的行數(shù)

//用標(biāo)記法跟蹤掃描的5個方向//注意掃描圖像時從上往下進(jìn)行

intDirection1[2][2]={{1,-1},{1,0}};

intDirection2[2][2]={{1,0},{1,1}};

//(指向排列的圖像數(shù)據(jù))

lpimage=(uchar*)pImage->imageData;

lWidth=pImage->width;

lHeight=pImage->height;

//平尖角閾值,現(xiàn)在設(shè)為整幅圖寬度的5%

intPlainAngleThreshold=16;

for(j=0;j<lHeight;j++)

{

i=0;

while(i<lWidth)

{

Count=1;

lpSrc=lpimage+(j*lWidth+i);

//當(dāng)前點(diǎn)為目標(biāo)白點(diǎn)

if(*lpSrc==255.0)

{

if(j>0)

{

//看當(dāng)前目標(biāo)白點(diǎn)上方小區(qū)域是否也為目標(biāo)白點(diǎn)

for(m=-4;m<=4;m++)

{

//防止地址越界

if((0<=(i+m))&&((i+m)<lWidth))

{

//lpSrc為目標(biāo)白點(diǎn)的上一行左右m個點(diǎn),判斷是否有白點(diǎn)存在

lpSrc=lpimage+((j-1)*lWidth+i+m);

//若當(dāng)前檢測點(diǎn)上方小區(qū)域有目標(biāo)白點(diǎn),則非尖角頂點(diǎn),退出頂點(diǎn)檢測

if(*lpSrc==255.0)

break;

}

}

if(m<=4)

FindTopPoint1=0;//尖角頂點(diǎn)判定條件1為非

else

{

FindTopPoint1=1;

//找到一個尖角頂點(diǎn),起始點(diǎn)

TopPointFirst=i;

}

}

else

FindTopPoint1=1;//endofif(j>0)

}

else

FindTopPoint1=0;//endofif(*lpSrc==255.0)

//若尖角頂點(diǎn)判定條件1為真(即找到頂點(diǎn)起始點(diǎn)),則進(jìn)行條件2判斷

if(FindTopPoint1)

{

while(1)

{

//防止地址越界

if((0<=(i+Count))&&((i+Count)<lWidth))

{

lpSrc=lpimage+(j*lWidth+i+Count);

if(*lpSrc!=0)

Count++;//count統(tǒng)計(jì)同行連續(xù)白點(diǎn)數(shù)目

else

break;

}

else

break;

}

//若當(dāng)前檢測點(diǎn)同行的連續(xù)目標(biāo)白點(diǎn)個數(shù)<閾值8時,則判定該處是:廣義平尖角

if(Count<PlainAngleThreshold)

{

//反之,尖角頂點(diǎn)判定條件2為非

FindTopPoint2=1;

//尖角頂點(diǎn)的右端點(diǎn)

TopPointEnd=TopPointFirst+Count-1;

}

else

FindTopPoint2=0;

}//endofif(FindTopPoint1)

/*****************************以上為尖角頂點(diǎn)檢測***************************/

//若找到尖角頂點(diǎn)(狹義或廣義平尖角:多個連續(xù)目標(biāo)白點(diǎn)且個數(shù)和<8),則進(jìn)行左下和右下邊界掃描

if(FindTopPoint1&&FindTopPoint2)

{

//左右向下掃描的列起始點(diǎn)坐標(biāo)

ColumnL=TopPointFirst;

ColumnR=TopPointEnd;

//從ColumnL開始進(jìn)行左下邊界掃描

//尖角左右邊界交點(diǎn)的縱坐標(biāo)

RowSumL=0;//總共檢查5行

//向下掃描,檢測0,1,2,3,4共5行(實(shí)質(zhì)是設(shè)定尖角的高度為5)

while(RowSumL<=4)

{

//每行掃描時掃描起始方向數(shù)置0

DirectSum1=0;

while(1)

{

//向下搜索時像素的臨時高(離上的像素個數(shù))

tempH=j+RowSumL+Direction1[DirectSum1][0];

//向下搜索時像素的臨時寬(離左的像素個數(shù))

tempW=ColumnL+Direction1[DirectSum1][1];

if(((0<=tempW)&&(tempW<lWidth))&&((0<=tempH)&&(tempH<lHeight)))//地址有效

{

//五個方向的周圍點(diǎn)

lpSrc=lpimage+(tempH*lWidth+tempW);

//尖角周圍有目標(biāo)白點(diǎn)

if(*lpSrc==255.0)

{

//則RowSumL++,以掃描下一行

RowSumL++;

//記錄下一行掃描時左邊界起始點(diǎn)列坐標(biāo)

ColumnL=tempW;

//表示若本次掃描找到隔行邊界點(diǎn),則退出本行掃描以進(jìn)入下一行掃描

break;

}

else

DirectSum1++;//進(jìn)行下一個方向掃描

}//endofif(((0<=tempW)&&(tempW<lWidth))&&((0<=tempH)&&(tempH<lHeight)))

//地址無效,直接進(jìn)入到下一個方向掃描

else

{

//進(jìn)行下一個方向掃描,注意原掃描點(diǎn)的行列坐標(biāo)不變

DirectSum1++;

}//endofif(((0<=tempW)&&(tempW<lWidth))&&((0<=tempH)&&(tempH<lHeight)))

//若跟蹤掃描的2個方向全部掃描完還沒有找到邊界白點(diǎn),則認(rèn)為該處輪廓不規(guī)則,

//不存在尖角,退出小循環(huán),并置ColumnL=0以用于后續(xù)尖角判斷(左右邊界距離)

if(DirectSum1>1)

{

ColumnL=0;

break;//退出while(1)

}

}//while(1)結(jié)束

if(DirectSum1>1)

break;//退出大循環(huán)

}//endofwhile(RowSumL<4)

/*****************以上為從左頂點(diǎn)向左下掃描進(jìn)行邊界檢測*******************/

//從ColumnR開始進(jìn)行右下邊界掃描,向下掃描5行

RowSumR=0;

//向下掃描,檢測0,1,2,3,4共5行

while(RowSumR<=4)

{

DirectSum2=1;

while(1)

{

tempH=j+RowSumR+Direction2[DirectSum2][0];

tempW=ColumnR+Direction2[DirectSum2][1];

//地址有效

if(((0<=tempW)&&(tempW<lWidth))&&((0<=tempH)&&(tempH<lHeight)))

{

lpSrc=lpimage+(tempH*lWidth+tempW);

//此方向點(diǎn)為目標(biāo)白點(diǎn)

if(*lpSrc==255.0)

{

//則RowSumR++,以掃描下一行

RowSumR++;

//記錄下一行掃描時右邊界起始點(diǎn)列坐標(biāo)

ColumnR=tempW;

//表示若本次掃描找到隔行邊界點(diǎn),則退出本行掃描以進(jìn)入下一行掃描

break;

}

else

{

//進(jìn)行下一個方向掃描,注意原掃描點(diǎn)的行列坐標(biāo)不變

DirectSum2--;

}//endofif(*lpSrc==255.0)

}

else

{

//地址無效,直接進(jìn)行下一方向掃描

DirectSum2--;//endofif(((0<=tempW)&&(tempW<lWidth))&&((0<=tempH)&&(tempH<lHeight)))

}

//若跟蹤掃描的5個方向全部掃描完還沒有找到邊界白點(diǎn),則認(rèn)為該處輪廓不規(guī)則,

//不存在尖角,退出小循環(huán),并置ColumnL=0以用于后續(xù)尖角判斷(左右邊界距離)

if(DirectSum2<0)

{

ColumnR=0;

break;//退出while(1)

}

}//while(1)結(jié)束

if(DirectSum2<0)

break;//退出大循環(huán)

}//endofwhile(RowSumR<=4)

/******************以上為從右頂點(diǎn)向右下掃描進(jìn)行邊界檢測*********************/

//計(jì)算左右邊界點(diǎn)之間的象素個數(shù),即距離

BounderSpaceNum=ColumnR-ColumnL-1;

//尖角判斷和數(shù)目統(tǒng)計(jì)

if((Bound

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論