opencv 火焰识别

转载 2013年09月20日 21:30:31

转载: http://blog.163.com/wufei_8888@126/blog/static/4869046620115127552220/


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))
}

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

OpenCV学习记录之视频中的火焰检测识别

主要完成两个视频中火焰的检测,主要结合RGB判据和HIS判据,设定合适的阈值条件,检测出火焰对应像素的区域,将原图二值化,经过中值滤波以及数学形态学的膨胀运算等图像处理,消除一些噪声及离散点,连通一些...

OpenCV小例程——火焰检测(完整代码)

火焰检测小程序 前几天,偶然看到了An Early Fire-Detection Method Based on Image Processing ,The Author is:Thou-Ho (Ch...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

基于OpenCV的火焰检测(三)——HSI颜色判据

上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据——HSI判据。 为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型: ...

基于OpenCV的火焰检测(一)——图像预处理

博主最近在做一个基于OpenCV的火焰检测的项目,不仅可以检测图片中的火焰,还可以检测视频中的火焰,最后在视频检测的基础上推广到摄像头实时检测。在做这个项目的时候,博主参考了很多相关的文献,用了很多种...

opencv 火焰提取

在网上找了写代码  凑了凑 好歹实现了把火焰提取出来,算法主要是ostu算法,网上关于ostu的解释很多,大家可以看看,我就直接贴图了代码了,图大了点,希望对大家有用 代码如下 #include ...

基于OpenCV的火焰检测(二)——RGB颜色判据

上文跟大家分享了在做火焰检测中常用到的图像预处理方法,从这一篇博文开始,我将向大家介绍如何一步一步地检测出火焰区域。火焰提取要用 到很多判据,今天我要向大家介绍的是最简单的但是很有效的判据——RGB判...

基于ARM9的OpenCV火焰图像处理系统

  • 2015年02月03日 15:54
  • 1.57MB
  • 下载

基于OpenCV的火焰检测(三)——HSI颜色判据

上文向大家介绍了如何用最简单的RGB判据来初步提取火焰区域,现在我要给大家分享的是一种更加直观的判据——HSI判据。 为什么说HSI判据是更加直观的判据呢?老规矩,先介绍一下HSI色彩模型: ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:opencv 火焰识别
举报原因:
原因补充:

(最多只允许输入30个字)