參數說明:
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();
- }