void CPatternrecognitionDlg::SharpAngle(IplImage *pImage)//, CvPoint AnglePointPosition[])
{
SharpAngle_Num=0;
int lWidth,lHeight;
unsigned char *lpimage,*lpSrc;
int i,j,m;
//边界扫描的方向数目计数
int DirectSum1;
int DirectSum2;
//扫描中的临时宽(从左往右)
int tempW;
//扫描中的临时高(从上往下)
int tempH;
//扫描到的连续目标白点计数
int Count=0;
//用于尖角顶点判定条件(起始扫描点设为左、右两个边界点,左右可以重合为一个点)
//条件一:首先必须是顶点(尖或广义平尖角,即该点上方无目标白点)
int FindTopPoint1=0;
//条件二:如果是广义平尖角即同一行有几个连续的目标白点,则这个连续目标白点个数必须小于阈值
int FindTopPoint2=0;
//尖角顶点的起始点和结束点下标
int TopPointFirst=0, TopPointEnd=0;
//左右边界点下标(横坐标)及其相隔点数
int ColumnL, ColumnR, BounderSpaceNum;
//尖角左右边界交点的纵坐标,及尖角高度(用这两个条件判断尖角)
int RowSumL,RowSumR;//左右边界方向,扫描的行数
//用标记法跟踪扫描的5个方向//注意扫描图像时从上往下进行
int Direction1[2][2]={{1,-1},{1,0}};
int Direction2[2][2]={{1,0},{1,1}};
//(指向排列的图像数据)
lpimage=(uchar *)pImage->imageData;
lWidth=pImage->width;
lHeight=pImage->height;
//平尖角阈值,现在设为整幅图宽度的5%
int PlainAngleThreshold=16;
for(j=0;j<lHeight;j++)
{
i=0;
while(i<lWidth)
{
Count=1;
lpSrc=lpimage+(j*lWidth+i);
//当前点为目标白点
if(*lpSrc==255.0)
{
if(j>0)
{
//看当前目标白点上方小区域是否也为目标白点
for(m=-4;m<=4;m++)
{
//防止地址越界
if((0<=(i+m)) && ((i+m)<lWidth))
{
//lpSrc为目标白点的上一行左右m个点,判断是否有白点存在
lpSrc=lpimage+((j-1)*lWidth+i+m);
//若当前检测点上方小区域有目标白点,则非尖角顶点,退出顶点检测
if(*lpSrc==255.0)
break;
}
}
if(m<=4)
FindTopPoint1=0;//尖角顶点判定条件1为非
else
{
FindTopPoint1=1;
//找到一个尖角顶点,起始点
TopPointFirst=i;
}
}
else
FindTopPoint1=1;//end of if(j>0)
}
else
FindTopPoint1=0;// end of if(*lpSrc==255.0)
//若尖角顶点判定条件1为真(即找到顶点起始点),则进行条件2判断
if(FindTopPoint1)
{
while(1)
{
//防止地址越界
if((0<=(i+Count)) && ((i+Count)<lWidth))
{
lpSrc=lpimage+(j*lWidth+i+Count);
if(*lpSrc!=0)
Count++;//count统计同行连续白点数目
else
break;
}
else
break;
}
//若当前检测点同行的连续目标白点个数<阈值8时,则判定该处是:广义平尖角
if(Count<PlainAngleThreshold)
{
//反之,尖角顶点判定条件2为非
FindTopPoint2=1;
//尖角顶点的右端点
TopPointEnd=TopPointFirst+Count-1;
}
else
FindTopPoint2=0;
}// end of if(FindTopPoint1)
/*****************************以上为尖角顶点检测***************************/
//若找到尖角顶点(狭义或广义平尖角:多个连续目标白点且个数和<8),则进行左下和右下边界扫描
if(FindTopPoint1 && FindTopPoint2)
{
//左右向下扫描的列起始点坐标
ColumnL=TopPointFirst;
ColumnR=TopPointEnd;
//从ColumnL开始进行左下边界扫描
//尖角左右边界交点的纵坐标
RowSumL=0;//总共检查5行
//向下扫描,检测0,1,2,3,4共5行(实质是设定尖角的高度为5)
while(RowSumL<=4)
{
//每行扫描时扫描起始方向数置0
DirectSum1=0;
while(1)
{
//向下搜索时像素的临时高(离上的像素个数)
tempH=j+RowSumL+Direction1[DirectSum1][0];
//向下搜索时像素的临时宽(离左的像素个数)
tempW=ColumnL+Direction1[DirectSum1][1];
if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight)))//地址有效
{
//五个方向的周围点
lpSrc=lpimage+(tempH*lWidth+tempW);
//尖角周围有目标白点
if(*lpSrc==255.0)
{
//则RowSumL++,以扫描下一行
RowSumL++;
//记录下一行扫描时左边界起始点列坐标
ColumnL=tempW;
//表示若本次扫描找到隔行边界点,则退出本行扫描以进入下一行扫描
break;
}
else
DirectSum1++;//进行下一个方向扫描
}//end of if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight)))
//地址无效,直接进入到下一个方向扫描
else
{
//进行下一个方向扫描,注意原扫描点的行列坐标不变
DirectSum1++;
}//end of if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight)))
//若跟踪扫描的2个方向全部扫描完还没有找到边界白点,则认为该处轮廓不规则,
//不存在尖角,退出小循环,并置ColumnL=0以用于后续尖角判断(左右边界距离)
if(DirectSum1>1)
{
ColumnL=0;
break;//退出while(1)
}
} //while(1)结束
if(DirectSum1>1)
break;//退出大循环
}//end of while(RowSumL<4)
/*****************以上为从左顶点向左下扫描进行边界检测*******************/
//从ColumnR开始进行右下边界扫描,向下扫描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);
//此方向点为目标白点
if(*lpSrc==255.0)
{
//则RowSumR++,以扫描下一行
RowSumR++;
//记录下一行扫描时右边界起始点列坐标
ColumnR=tempW;
//表示若本次扫描找到隔行边界点,则退出本行扫描以进入下一行扫描
break;
}
else
{
//进行下一个方向扫描,注意原扫描点的行列坐标不变
DirectSum2--;
}//end of if(*lpSrc==255.0)
}
else
{
//地址无效,直接进行下一方向扫描
DirectSum2--;//end of if(((0<=tempW) && (tempW<lWidth)) && ((0<=tempH) && (tempH<lHeight)))
}
//若跟踪扫描的5个方向全部扫描完还没有找到边界白点,则认为该处轮廓不规则,
//不存在尖角,退出小循环,并置ColumnL=0以用于后续尖角判断(左右边界距离)
if(DirectSum2<0)
{
ColumnR=0;
break;//退出while(1)
}
} //while(1)结束
if(DirectSum2<0)
break;//退出大循环
}//end of while(RowSumR<=4)
/******************以上为从右顶点向右下扫描进行边界检测*********************/
// 计算左右边界点之间的象素个数,即距离
BounderSpaceNum=ColumnR-ColumnL-1;
// 尖角判断和数目统计
if((BounderSpaceNum>=0 && BounderSpaceNum<32) && (RowSumL==5) && (RowSumR==5))
{
SharpAngle_Num++;
}
}//end of if(FindTopPoint1 && FindTopPoint2)
//转当前行的下一象素点检测
i=i+Count;//cout设置为1,若找到连续多点,一下子加,若没找到则一个个加
}//当前行的所有象素点检测完毕(while(i))
}//整个目标矩形区域的所有行均检测完毕(while(j))
}
python代码传统方法火焰检测 opencv火焰识别
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Python OpenCV #2 - OpenCV中的GUI功能
本文介绍了OpenCV的基本方发,包括图像读取、显示和写入。
python ide OpenCV -
Python/C++ OpenCV火焰检测Python开发 Python教程
-
火焰识别,火灾检测 数据集
火焰识别,火灾检测 数据集
火焰识别 火灾检测 数据集 数据集 -
python 火焰检测 opencv火焰识别
/***************************************************************************** *
python 火焰检测 opencv 火焰识别 颜色聚类 聚类