您的位置:首页 > 运维架构

opencv 图像阴影检测

2012-09-02 14:37 218 查看
源文:/article/1821012.html

参数说明:

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

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

[cpp] view
plaincopy

/*********************************************/

//阴影检测

/*********************************************/

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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: