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


你可能感兴趣的:(float)