Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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)
- {
- jbyte* _yuv = env->GetByteArrayElements(yuv, 0);
- jint* _bgra = env->GetIntArrayElements(bgra, 0);
- Mat myuv(height + height/2, width, CV_8UC1, (unsigned char *)_yuv);
- Mat mbgra(height, width, CV_8UC4, (unsigned char *)_bgra);
- //Please make attention about BGRA byte order
- //ARGB stored in java as int array becomes BGRA at native level
- cvtColor(myuv, mbgra, CV_YUV420sp2BGR, 4);
- Mat mhsv(height, width, CV_8UC4);
- //interesuje nas mhsv
- cvtColor(mbgra, mhsv, CV_RGB2HSV);
- vector<Mat> v;
- split(mhsv, v);
- //nakładamy ograniczenia na poszczególne warstwy
- inRange(v[0], hMin, hMax, v[0]);
- inRange(v[1], sMin, 255, v[1]);
- inRange(v[2], vMin, 255, v[2]);
- //obliczamy część wspólną wyszstkich ograniczeń
- Mat tmp = v[0].mul(v[1]);
- Mat result = tmp.mul(v[2]);
- //option mówi czy robić erozję
- if (option == 1) {
- Mat eroded; // the destination image
- erode(result, eroded, Mat());
- result = eroded;
- }
- vector<vector<Point> > contours;
- vector<Vec4i> hierarchy;
- //szukamy konturów
- findContours(result, contours, hierarchy, CV_RETR_LIST, CV_CHAIN_APPROX_TC89_L1 );
- // iterate through all the top-level contours,
- // draw each connected component with white color
- int size = contours.size();
- __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "ilość wektorów: %d", size);
- //trzeba wyzerować całą macierz, nie znam lepszego sposobu jak dać niemożliwe ograniczenie
- inRange(result, 240, 240, result);
- //ratio i rozmiary
- float ratioMin = 0.6;
- float ratioMax = 1/ratioMin;
- int maxSize = result.cols/10;
- int minSize = result.cols/200;
- __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "maxSize: %d", maxSize);
- __android_log_print(ANDROID_LOG_INFO, LOG_TAG, "minSize: %d", minSize);
- //rysujemy sobie obszary do debugowania
- int idx = 0;
- for( ; idx < size; idx++)
- {
- Scalar color( 255, 255, 255 );
- drawContours( result, contours, idx, color, CV_FILLED);
- }
- v[0] = result;
- v[1] = result;
- v[2] = result;
- //mergeujemy warstwy
- merge(v, mhsv);
- //Teraz będziemy obliczać i rysować punkty
- int counter = 0;
- idx = 0;
- for( ; idx < size; idx++)
- {
- Rect rect = boundingRect(contours[idx]);
- float ratio = (float)rect.width / (float)rect.height;
- if (rect.width > minSize && rect.height > minSize && rect.width < maxSize && rect.height < maxSize && ratio > ratioMin && ratio < ratioMax) {
- counter ++;
- __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);
- circle(mhsv, Point(rect.x + rect.width/2, rect.y + rect.height/2), 4, Scalar( 255, 0, 120 ));
- }
- }
- //konwersja do rgb
- cvtColor(mhsv, mbgra, CV_RGB2RGBA);
- env->ReleaseIntArrayElements(bgra, _bgra, 0);
- env->ReleaseByteArrayElements(yuv, _yuv, 0);
- }
Add Comment
Please, Sign In to add comment