2015-02-09 3 views
2

Я разработки андроида приложения, в котором я должен обнаружить круг на существующем Разглядеть изображение из галереи или захвата с камеры. Просмотренное/снятое изображение будет показано на ImageView. Кстати, я использую OpenCVAndroid Library, и я скомпилировал его правильно.Detect круга в изображении с помощью OpenCV в Android

Любая помощь для моего приложения для Android, я прочитал C, C++ и т. Д. В обнаружении кругов, но я не могу понять, что это связано с его разными языками для Android.

Спасибо.

Update

Хорошо ... Это, как я.

  if (requestCode == 1) { //Take Photo from Android Camera.. 

      File f = new File(Environment.getExternalStorageDirectory().toString()); 
      for (File temp : f.listFiles()) { 
       if (temp.getName().equals("temp.jpg")) { 
        f = temp; 
        break; 
       } 
      } 
      try { 
       Bitmap bitmap; 
       BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 

       bitmap = BitmapFactory.decodeFile(f.getAbsolutePath(), 
         bitmapOptions); 

       // bitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true); 



       String path = android.os.Environment 
         .getExternalStorageDirectory() 
         + File.separator 
         + "Phoenix" + File.separator + "default"; 
       f.delete(); 
       OutputStream outFile = null; 
       File file = new File(path, String.valueOf(System.currentTimeMillis()) + ".jpg"); 
       try { 
        outFile = new FileOutputStream(file); 
        bitmap.compress(Bitmap.CompressFormat.JPEG, 85, outFile); 
        outFile.flush(); 
        outFile.close(); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

            /* convert bitmap to mat */ 
       Mat mat = new Mat(bitmap.getWidth(), bitmap.getHeight(), 
         CvType.CV_8UC1); 
       Mat grayMat = new Mat(bitmap.getWidth(), bitmap.getHeight(), 
         CvType.CV_8UC1); 

       Utils.bitmapToMat(bitmap, mat); 

        /* convert to grayscale */ 
       int colorChannels = (mat.channels() == 3) ? Imgproc.COLOR_BGR2GRAY 
         : ((mat.channels() == 4) ? Imgproc.COLOR_BGRA2GRAY : 1); 

       Imgproc.cvtColor(mat, grayMat, colorChannels); 

       /* reduce the noise so we avoid false circle detection */ 
       Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 2, 2); 

       // accumulator value 
       double dp = 1.2d; 
       // minimum distance between the center coordinates of detected circles in pixels 
       double minDist = 20; 

       // min and max radii (set these values as you desire) 
       int minRadius = 0, maxRadius = 0; 

       // param1 = gradient value used to handle edge detection 
       // param2 = Accumulator threshold value for the 
       // cv2.CV_HOUGH_GRADIENT method. 
       // The smaller the threshold is, the more circles will be 
       // detected (including false circles). 
       // The larger the threshold is, the more circles will 
       // potentially be returned. 
       double param1 = 70, param2 = 72; 

       /* create a Mat object to store the circles detected */ 
       Mat circles = new Mat(bitmap.getWidth(), 
         bitmap.getHeight(), CvType.CV_8UC1); 

       /* find the circle in the image */ 
       Imgproc.HoughCircles(grayMat, circles, 
         Imgproc.CV_HOUGH_GRADIENT, dp, minDist, param1, 
         param2, minRadius, maxRadius); 

       /* get the number of circles detected */ 
       int numberOfCircles = (circles.rows() == 0) ? 0 : circles.cols(); 

       /* draw the circles found on the image */ 
       for (int i=0; i<numberOfCircles; i++) { 


       /* get the circle details, circleCoordinates[0, 1, 2] = (x,y,r) 
       * (x,y) are the coordinates of the circle's center*/ 
             double[] circleCoordinates = circles.get(0, 0); 


        int x = (int) circleCoordinates[0], y = (int) circleCoordinates[1]; 

        Point center = new Point(x, y); 

        int radius = (int) circleCoordinates[2]; 

/* circle's outline */ 
        Core.circle(mat, center, radius, new Scalar(0, 
          255, 0), 4); 

/* circle's center outline */ 
        Core.rectangle(mat, new Point(x - 5, y - 5), 
          new Point(x + 5, y + 5), 
          new Scalar(0, 128, 255), -1); 
       } 

       /* convert back to bitmap */ 
       Utils.matToBitmap(mat, bitmap); 
       viewImage.setImageBitmap(bitmap); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 

Я бегу мое приложение с кодом выше, мой Android телефон врезаться после того как я взять фото с камеры и у меня есть эти ошибки в LogCat:

  02-10 06:54:15.773 8914-8914/com.example.cloud.circle E/AndroidRuntime﹕ FATAL EXCEPTION: main 

java.lang.UnsatisfiedLinkError: n_Mat 
     at org.opencv.core.Mat.n_Mat(Native Method) 
     at org.opencv.core.Mat.<init>(Mat.java:477) 
     at com.example.cloud.circle.Image.onActivityResult(Image.java:152) 
     at android.app.Activity.dispatchActivityResult(Activity.java:3908) 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:2532) 
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:2578) 
     at android.app.ActivityThread.access$2000(ActivityThread.java:117) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:965) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:130) 
     at android.app.ActivityThread.main(ActivityThread.java:3687) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:507) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625) 
     at dalvik.system.NativeStart.main(Native Method) 

Пожалуйста, помогите мне. Благодарю.

ответ

2

Подробное описание обнаружения круга можно найти here и here (хотя и не на Java).

Я включил образец фрагмента кода для определения круга ниже, полученный из 2 ссылок, приведенных выше. Код комментируется, поэтому его легко понять. Я предполагаю, что картинка изображения bitmap уже имеет изображение, которое вы хотите проанализировать.

/* convert bitmap to mat */ 
Mat mat = new Mat(bitmap.getWidth(), bitmap.getHeight(), 
     CvType.CV_8UC1); 
Mat grayMat = new Mat(bitmap.getWidth(), bitmap.getHeight(), 
     CvType.CV_8UC1); 

Utils.bitmapToMat(bitmap, mat); 

/* convert to grayscale */ 
int colorChannels = (mat.channels() == 3) ? Imgproc.COLOR_BGR2GRAY 
     : ((mat.channels() == 4) ? Imgproc.COLOR_BGRA2GRAY : 1); 

Imgproc.cvtColor(mat, grayMat, colorChannels); 

/* reduce the noise so we avoid false circle detection */ 
Imgproc.GaussianBlur(grayMat, grayMat, new Size(9, 9), 2, 2); 

// accumulator value 
double dp = 1.2d; 
// minimum distance between the center coordinates of detected circles in pixels 
double minDist = 100; 

// min and max radii (set these values as you desire) 
int minRadius = 0, maxRadius = 0; 

// param1 = gradient value used to handle edge detection 
// param2 = Accumulator threshold value for the 
// cv2.CV_HOUGH_GRADIENT method. 
// The smaller the threshold is, the more circles will be 
// detected (including false circles). 
// The larger the threshold is, the more circles will 
// potentially be returned. 
double param1 = 70, param2 = 72; 

/* create a Mat object to store the circles detected */ 
Mat circles = new Mat(bitmap.getWidth(), 
     bitmap.getHeight(), CvType.CV_8UC1); 

/* find the circle in the image */ 
Imgproc.HoughCircles(grayMat, circles, 
     Imgproc.CV_HOUGH_GRADIENT, dp, minDist, param1, 
     param2, minRadius, maxRadius); 

/* get the number of circles detected */ 
int numberOfCircles = (circles.rows() == 0) ? 0 : circles.cols(); 

/* draw the circles found on the image */ 
for (int i=0; i<numberOfCircles; i++) { 


/* get the circle details, circleCoordinates[0, 1, 2] = (x,y,r) 
* (x,y) are the coordinates of the circle's center 
*/ 
    double[] circleCoordinates = circles.get(0, i); 


    int x = (int) circleCoordinates[0], y = (int) circleCoordinates[1]; 

    Point center = new Point(x, y); 

    int radius = (int) circleCoordinates[2]; 

    /* circle's outline */ 
    Core.circle(mat, center, radius, new Scalar(0, 
      255, 0), 4); 

    /* circle's center outline */ 
    Core.rectangle(mat, new Point(x - 5, y - 5), 
      new Point(x + 5, y + 5), 
      new Scalar(0, 128, 255), -1); 
} 

/* convert back to bitmap */ 
Utils.matToBitmap(mat, bitmap); 

Update

Для того, чтобы предотвратить UnsatisfiedLinkError, перед использованием функции OpenCV библиотечные, убедитесь, что вы загрузить файлы библиотек, как я сделал ниже:

if (!OpenCVLoader.initDebug()) { 
    Log.e(TAG, "Cannot connect to OpenCV Manager"); 
} 
+0

в строке: int numberOfCircles = (круги.rows() == 0): 0? circles.cols(); theres ошибка. любезно исправление. спасибо! – cloudmorales

+0

Я исправлю ваш ** Utils.matToBitmap (bitmap, mat); ** это (мат, растровое изображение); Я думаю. – cloudmorales

+0

Я тестирую его с помощью своего кода, но он не работает. Sad :( – cloudmorales

Смежные вопросы