歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV 圖像陰影檢測

OpenCV 圖像陰影檢測

日期:2017/3/1 10:26:37   编辑:Linux編程

參數說明:

IplImage *workImg-當前全局變量,表示正在顯示的圖片。

downleft, upright- 檢測出的陰影部分矩形框的兩個對角頂點。

  1. /*********************************************/
  2. //陰影檢測
  3. /*********************************************/
  4. CvPoint downleft,upright;
  5. int cnt;
  6. int dir[8][2]={-1,-1,-1,0,-1,1,0,1,0,-1,1,1,1,0,1,-1};
  7. #define SHADOW 170
  8. #define Thres_KindNumber 20
  9. bool InRange(CvPoint point,IplImage* pi)
  10. {
  11. int w=pi->width;
  12. int h=pi->height;
  13. if(point.x>=0&&point.x<w&&point.y>=0&&point.y<h)
  14. {
  15. float v[3];
  16. for(i=0;i<3;i++)
  17. {
  18. v[i]=((uchar*)(pi->imageData + pi->widthStep*point.y))[point.x*3+i];
  19. if(v[i]<=SHADOW)
  20. return true;
  21. }
  22. }
  23. return false;
  24. }
  25. void Dye(IplImage** curimg,CvPoint s)
  26. {
  27. int i;
  28. queue<CvPoint>Q;
  29. Q.push(s);
  30. for(i=0;i<3;i++)
  31. ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*s.y))[s.x*3+i]=SHADOW+10;
  32. while(!Q.empty())
  33. {
  34. s=Q.front();
  35. Q.pop();
  36. if(s.x<downleft.x) downleft.x=s.x;
  37. if(s.y<downleft.y) downleft.y=s.y;
  38. if(s.x>upright.x) upright.x=s.x;
  39. if(s.y>upright.y) upright.y=s.y;
  40. //dye around
  41. for(i=0;i<8;i++)
  42. {
  43. CvPoint now=cvPoint(s.x+dir[i][0],s.y+dir[i][1]);
  44. if(InRange(now,*curimg))
  45. {
  46. Q.push(now);
  47. cnt++;
  48. for(i=0;i<3;i++)
  49. ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*now.y))[now.x*3+i]=SHADOW+10;
  50. }
  51. }
  52. }
  53. }
  54. void CCVMFCView::OnShadowDetect()
  55. {
  56. //detect shadows,find the region with highest pixel value
  57. int x,y;
  58. srcimg=workImg;
  59. for(y=0;y<srcimg->height;y++)
  60. for(x=0;x<srcimg->width;x++)
  61. {
  62. CvPoint curp=cvPoint(x,y);
  63. downleft.x=srcimg->width;downleft.y=srcimg->height;
  64. upright.x=upright.y=0;
  65. cnt=0;
  66. if(InRange(curp,srcimg))
  67. Dye(&srcimg,curp);
  68. if(cnt>Thres_KindNumber)
  69. cvRectangle(workImg , downleft,upright,CV_RGB(0,255,0),1,CV_AA,0);
  70. }
  71. Invalidate();
  72. }
Copyright © Linux教程網 All Rights Reserved