/autopnp_scenario/ros/src/obsolete/myBWlabel.cpp

https://github.com/ipa320/autopnp · C++ · 164 lines · 127 code · 26 blank · 11 comment · 27 complexity · 4cd1c9ddfc15df1544471f3411068587 MD5 · raw file

  1. #include <stdio.h>
  2. #include <opencv/cv.h>
  3. #include <opencv/highgui.h>
  4. #include <ctime>
  5. #include <vector>
  6. #include <map>
  7. using namespace std;
  8. int myLabel(IplImage* I,vector<CvPoint>* regions);
  9. int main(){
  10. IplImage* I = cvLoadImage("boxes2.jpg",0);
  11. IplImage* labelled_img=cvCreateImage(cvSize(I->width,I->height),8,3);
  12. double diff;
  13. clock_t start;
  14. vector<CvPoint>* R=new vector<CvPoint>[20];
  15. int numOfLabels;
  16. uchar* Lpixel;
  17. cvThreshold(I,I,127,255,CV_THRESH_BINARY);
  18. start = std::clock(); //TIMING START
  19. numOfLabels=myLabel(I,R);
  20. diff = ( clock() - start ) / (double)CLOCKS_PER_SEC; //STOP TIMING
  21. printf("TIME: %f\n",diff);
  22. //Example of use: randomly color on each region
  23. int i,l,h,w,r,g,b;
  24. Lpixel=(uchar*)labelled_img->imageData;
  25. for(l=0;l<numOfLabels;l++){
  26. r=rand();
  27. g=rand();
  28. b=rand();
  29. for(i=0;i<R[l].size();i++){
  30. h=R[l].at(i).x;
  31. w=R[l].at(i).y;
  32. Lpixel[h*labelled_img->widthStep +w*3 +0]=b;
  33. Lpixel[h*labelled_img->widthStep +w*3 +1]=g;
  34. Lpixel[h*labelled_img->widthStep +w*3 +2]=r;
  35. }
  36. }
  37. cvNamedWindow( "Labels", 1 );
  38. cvShowImage( "Labels", labelled_img );
  39. cvNamedWindow( "bin img", 1 );
  40. cvShowImage( "bin img", I );
  41. cvWaitKey(0);
  42. }
  43. int myLabel(IplImage* I,vector<CvPoint>* regions){
  44. int height = I->height;
  45. int width = I->width;
  46. int i,j;
  47. uchar *pixel;
  48. CvMat* L=cvCreateMat(height,width,CV_32FC1);
  49. int up,left;
  50. int label=1;
  51. int count=0;
  52. map<int,int> eqvTable;
  53. pixel=(uchar*)I->imageData;
  54. int lowest=-1;
  55. //-----------------LABEL THE PIXELS
  56. for(i=0;i<height;i++){
  57. for(j=0;j<width;j++){
  58. if(pixel[i*I->widthStep+j]==255){
  59. up=(i==0)?0:cvmGet(L,i-1,j); //avoiding array out of bound indexing error
  60. left=(j==0)?0:cvmGet(L,i,j-1);
  61. //printf("(%d,%d) -> %d , %d\n",i,j,up,left);
  62. if(up==0 && left!=0){
  63. cvmSet(L,i,j,left);
  64. }
  65. if(up!=0 && left==0){
  66. cvmSet(L,i,j,up);
  67. }
  68. if(up!=0 && left!=0){
  69. cvmSet(L,i,j,up);
  70. if(up!=left){
  71. eqvTable.insert(make_pair(left,up));
  72. }
  73. }
  74. else if(up==0 && left==0){
  75. label++;
  76. cvmSet(L,i,j,label);
  77. }
  78. }
  79. }
  80. }
  81. //-----------------
  82. //-----------------FIX THE TABLE
  83. int last;
  84. int prev_last,label_count=0;
  85. map<int,int> unique_labels;
  86. map<int,int>::iterator ul_iter;
  87. map<int,int>::iterator sec_iter;
  88. for( map<int,int>::iterator iter = eqvTable.begin(); iter != eqvTable.end(); ++iter ) {
  89. //printf("%d -> %d\n",(*iter).first,(*iter).second);
  90. last=(*iter).second;
  91. sec_iter=eqvTable.find((*iter).second);
  92. while(sec_iter!=eqvTable.end()){
  93. last=(*sec_iter).second;
  94. //printf("____ %d -> %d\n",(*sec_iter).first,(*sec_iter).second);
  95. sec_iter=eqvTable.find((*sec_iter).second);
  96. }
  97. if(prev_last!=last){
  98. prev_last=last;
  99. ul_iter=unique_labels.find(last);
  100. if(ul_iter==unique_labels.end()){
  101. label_count++;
  102. unique_labels.insert(make_pair(last,label_count));
  103. }
  104. }
  105. (*iter).second=last;
  106. }
  107. //-----------------
  108. //-----------------UPDATE THE LABEL MATRIX
  109. int temp;
  110. CvPoint pt;
  111. vector<CvPoint> blobs[label_count];
  112. for(i=0;i<L->height;i++){
  113. for(j=0;j<L->width;j++){
  114. temp=cvmGet(L,i,j);
  115. if(temp!=0){
  116. sec_iter=eqvTable.find(temp);
  117. if(sec_iter!=eqvTable.end()){
  118. //ul_iter=unique_labels.find((*sec_iter).second);
  119. cvmSet(L,i,j,(*sec_iter).second);
  120. }
  121. }
  122. }
  123. }
  124. //----------------STORE info to "regions"
  125. for(i=0;i<height;i++){
  126. for(j=0;j<width;j++){
  127. temp=cvmGet(L,i,j);
  128. if(temp!=0){
  129. pt.x=i;
  130. pt.y=j;
  131. ul_iter=unique_labels.find(temp); //[2,17,15] -map-> [1,2,3]
  132. temp=(*ul_iter).second;
  133. regions[temp-1].push_back(pt);
  134. }
  135. }
  136. }
  137. return label_count;
  138. }