Guest User

Untitled

a guest
Feb 21st, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.55 KB | None | 0 0
  1. JNIEXPORT void JNICALL Java_pl_jercik_STAR_view_CameraView_BlobErosion(JNIEnv* env, jobject thiz, jint width, jint height, jint hMin, jint hMax, jint sMin, jint vMin, jbyteArray yuv, jintArray bgra, jint option)
  2.     {
  3.          jbyte* _yuv  = env->GetByteArrayElements(yuv, 0);
  4.         jint*  _bgra = env->GetIntArrayElements(bgra, 0);
  5.  
  6.         Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
  7.         Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
  8.  
  9.         //Please make attention about BGRA byte order
  10.         //ARGB stored in java as int array becomes BGRA at native level
  11.         cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
  12.  
  13.         Mat mhsv(height, width, CV_8UC4);
  14.    
  15.     //interesuje nas mhsv
  16.         cvtColor(mbgra, mhsv, CV_RGB2HSV);
  17.  
  18.         vector<Mat> v;
  19.  
  20.         split(mhsv, v);
  21.  
  22.     //nakładamy ograniczenia na poszczególne warstwy
  23.         inRange(v[0], hMin, hMax, v[0]);
  24.         inRange(v[1], sMin, 255, v[1]);
  25.         inRange(v[2], vMin, 255, v[2]);
  26.  
  27.     //obliczamy część wspólną wyszstkich ograniczeń
  28.         Mat tmp = v[0].mul(v[1]);
  29.         Mat result = tmp.mul(v[2]);
  30.  
  31.     //option mówi czy robić erozję
  32.         if (option == 1) {
  33.             Mat eroded; // the destination image
  34.             erode(result, eroded, Mat());
  35.             result = eroded;
  36.  
  37.         }
  38.  
  39.  
  40.         vector<vector<Point> > contours;
  41.         vector<Vec4i> hierarchy;
  42.  
  43.     //szukamy konturów
  44.         findContours(result, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_TC89_L1 );
  45.  
  46.  
  47.  
  48.  
  49.         // iterate through all the top-level contours,
  50.         // draw each connected component with white color
  51.  
  52.         int size = contours.size();
  53.  
  54.         __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "ilość wektorów: %d", size);
  55.  
  56.     //trzeba wyzerować całą macierz, nie znam lepszego sposobu jak dać niemożliwe ograniczenie
  57.         inRange(result, 240, 240, result);
  58.  
  59.  
  60.     //ratio i rozmiary
  61.         float ratioMin = 0.6;
  62.         float ratioMax = 1/ratioMin;
  63.  
  64.         int maxSize = result.cols/10;
  65.         int minSize = result.cols/200;
  66.  
  67.         __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "maxSize: %d", maxSize);
  68.         __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "minSize: %d", minSize);
  69.  
  70.  
  71.     //rysujemy sobie obszary do debugowania
  72.         int idx = 0;
  73.         for( ; idx < size; idx++)
  74.         {
  75.                 Scalar color( 255, 255, 255 );
  76.  
  77.                 drawContours( result, contours, idx, color, CV_FILLED);
  78.         }
  79.  
  80.    
  81.         v[0] = result;
  82.         v[1] = result;
  83.         v[2] = result;
  84.  
  85.     //mergeujemy warstwy
  86.         merge(v, mhsv);
  87.  
  88.  
  89.     //Teraz będziemy obliczać i rysować punkty
  90.         int counter = 0;
  91.         idx = 0;
  92.         for( ; idx < size; idx++)
  93.         {
  94.             Rect rect = boundingRect(contours[idx]);
  95.  
  96.             float ratio = (float)rect.width / (float)rect.height;
  97.             if (rect.width > minSize && rect.height > minSize && rect.width < maxSize && rect.height < maxSize && ratio > ratioMin && ratio < ratioMax) {
  98.                 counter ++;
  99.  
  100.                 __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "Punkt nr: %d x: %d y: %d" ,counter,  rect.x + rect.width/2, rect.y + rect.height/2);
  101.  
  102.                 circle(mhsv, Point(rect.x + rect.width/2, rect.y + rect.height/2), 4, Scalar( 255, 0, 120 ));
  103.             }
  104.         }
  105.  
  106.     //konwersja do rgb
  107.         cvtColor(mhsv, mbgra, CV_RGB2RGBA);
  108.  
  109.        
  110.         env->ReleaseIntArrayElements(bgra, _bgra, 0);
  111.         env->ReleaseByteArrayElements(yuv, _yuv, 0);
  112.  
  113.     }
Add Comment
Please, Sign In to add comment