zoukankan      html  css  js  c++  java
  • opencv 图像阴影检测

    参数说明:

    IplImage *workImg-当前全局变量,表示正在显示的图片。

    downleft, upright- 检测出的阴影部分矩形框的两个对角顶点。

    /*********************************************/
     //阴影检测
    /*********************************************/
    
    CvPoint downleft,upright;
    int cnt;
    int dir[8][2]={-1,-1,-1,0,-1,1,0,1,0,-1,1,1,1,0,1,-1};
    #define SHADOW 170
    #define Thres_KindNumber 20
    
    bool InRange(CvPoint point,IplImage* pi) 
    {
        int w=pi->width;
        int h=pi->height;
        if(point.x>=0&&point.x<w&&point.y>=0&&point.y<h)
        {
            float  v[3];
            for(i=0;i<3;i++)
            {
                v[i]=((uchar*)(pi->imageData + pi->widthStep*point.y))[point.x*3+i];
                if(v[i]<=SHADOW)
                    return true;
            }
        }
        return false;
    }
    
    void Dye(IplImage** curimg,CvPoint s)
    {
        int i;
        queue<CvPoint>Q;
        Q.push(s);
    
        for(i=0;i<3;i++)
            ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*s.y))[s.x*3+i]=SHADOW+10;
    
        while(!Q.empty())
        {
            s=Q.front();
            Q.pop();
    
            if(s.x<downleft.x)    downleft.x=s.x;
            if(s.y<downleft.y)    downleft.y=s.y;
            if(s.x>upright.x)    upright.x=s.x;
            if(s.y>upright.y)    upright.y=s.y;
    
            //dye around
            for(i=0;i<8;i++)
            {
                CvPoint now=cvPoint(s.x+dir[i][0],s.y+dir[i][1]);
                if(InRange(now,*curimg))
                {
                    Q.push(now);
                    cnt++;
                    for(i=0;i<3;i++)
                        ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*now.y))[now.x*3+i]=SHADOW+10;
                }
            }
        }
    }
    
    void CCVMFCView::OnShadowDetect()
    {
        //detect shadows,find the region with highest pixel value
        int x,y;
        srcimg=workImg;
        for(y=0;y<srcimg->height;y++)
            for(x=0;x<srcimg->width;x++)
            {
                CvPoint curp=cvPoint(x,y);
                downleft.x=srcimg->width;downleft.y=srcimg->height;
                upright.x=upright.y=0;
                cnt=0;
    
                if(InRange(curp,srcimg))
                    Dye(&srcimg,curp);
                if(cnt>Thres_KindNumber)
                    cvRectangle(workImg , downleft,upright,CV_RGB(0,255,0),1,CV_AA,0);
            }
            Invalidate();
    }

    from: http://blog.csdn.net/abcjennifer/article/details/7334043

  • 相关阅读:
    多变的鸭子策略模式
    反序列化和序列化
    UBUNTU eclipse必须是 jdk5.0以上
    Ubuntu Linux:MySQL安装指南
    phpMyAdmin下载、安装和使用入门
    读者-写者问题
    wget用法2
    在linux下安装mysql
    linux下数字转成字符串
    [SQLServer]必须知道的SQL
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5374046.html
Copyright © 2011-2022 走看看