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 20bool InRange(CvPoint point,IplImage* pi) int w=pi->width; int h=pi->height; if(point.x>=0&&point.x=0&&point.yfloat  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; queueQ; Q.push(s); for(i=0;i<3;i++)  ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*s.y))[s.x*3+i]=SHADOW+10while(!Q.empty()) {  s=Q.front();  Q.pop();  if(s.xif(s.yif(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;yheight;y++)  for(x=0;xwidth;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();}


           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

你可能感兴趣的:(opencv 图像阴影检测)