2013-05-28 2 views
3

Я пытаюсь использовать адаптивное пороговое значение для изображения (растровое изображение). У меня есть андроид, который требует его изменения в Mat, а затем конвертирует его в оттенки серого.cverror android assertion failed (scn == 3) Android

Ниже приведен код, начинающийся с создания растровых изображений. Они называются культурами, потому что я просто подрезал фотографию прямо перед этим.

  Bitmap bmCrop = BitmapFactory.decodeStream(iStream); 
      Bitmap bmThreshed = null; 
      /* 
      * Initialize the Mats 
      */ 
      Mat threshed = new Mat(bmCrop.getHeight(),bmCrop.getWidth(), CvType.CV_8UC1, new Scalar(4));//, new Scalar(4) 
      //Mat crop = new Mat(); 
      Mat crop = new Mat(bmCrop.getHeight(),bmCrop.getWidth(), CvType.CV_8UC1,new Scalar(4));//, new Scalar(4) 
      /* 
      * Convert the Mats to Grayscale 
      */ 
      if(!threshed.empty()) 
       Imgproc.cvtColor(threshed, threshed, Imgproc.COLOR_RGB2GRAY,1);// CURRENTLY BREAKING HERE 
      if(!crop.empty()) 
       Imgproc.cvtColor(crop, crop, Imgproc.COLOR_BGR2GRAY,1);   


      Utils.bitmapToMat(bmCrop, crop); 

      // Mat src, Mat dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C 
      Imgproc.adaptiveThreshold(crop, threshed, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 8); 

      Utils.matToBitmap(threshed, bmThreshed); 
      bmThreshed = bmCrop; 

В настоящее время нарушения на линии "Imgproc.cvtColor (молотили, молотили, Imgproc.COLOR_RGB2GRAY, 1)", где я пытаюсь cvtColor на Мат.

Ниже приведен выход LogCat:

05-28 11:25:21.172: E/cv::error()(32505): OpenCV Error: Assertion failed (scn == 3 || scn == 4) in void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int), file /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/color.cpp, line 3414 
05-28 11:25:25.697: D/AndroidRuntime(32505): Shutting down VM 
05-28 11:25:25.707: W/dalvikvm(32505): threadid=1: thread exiting with uncaught exception (group=0x414b1930) 
05-28 11:25:25.747: E/AndroidRuntime(32505): FATAL EXCEPTION: main 
05-28 11:25:25.747: E/AndroidRuntime(32505): CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/color.cpp:3414: error: (-215) scn == 3 || scn == 4 in function void cv::cvtColor(cv::InputArray, cv::OutputArray, int, int) 
05-28 11:25:25.747: E/AndroidRuntime(32505): ] 
05-28 11:25:25.747: E/AndroidRuntime(32505): at org.opencv.imgproc.Imgproc.cvtColor_0(Native Method) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:4017) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at com.activity.IMGP_Camera$1.onManagerConnected(IMGP_Camera.java:263) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at org.opencv.android.AsyncServiceHelper$1.onServiceConnected(AsyncServiceHelper.java:318) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1118) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at android.os.Handler.handleCallback(Handler.java:725) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at android.os.Looper.loop(Looper.java:137) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at android.app.ActivityThread.main(ActivityThread.java:5226) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at java.lang.reflect.Method.invokeNative(Native Method) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at java.lang.reflect.Method.invoke(Method.java:511) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562) 
05-28 11:25:25.747: E/AndroidRuntime(32505): at dalvik.system.NativeStart.main(Native Method) 

ответ

4

Вот мой рабочий код. Проблема в том, что я не выполнял Utils.bitmapToMat() сразу после инициализации матов и перед выполнением cvtColor().

  /* 
      * Initialize the bitmaps 
      */ 
      Bitmap bmCrop = BitmapFactory.decodeStream(iStream); 
      Bitmap bmThreshed = bmCrop; 
      /* 
      * Initialize the Mats 
      */ 
      Mat threshed = new Mat(bmCrop.getWidth(),bmCrop.getHeight(), CvType.CV_8UC1); 
      Utils.bitmapToMat(bmCrop, threshed); 

      Mat crop = new Mat(bmCrop.getWidth(),bmCrop.getHeight(), CvType.CV_8UC1); 
      Utils.bitmapToMat(bmCrop, crop); 
      /* 
      * Convert the Mats to Grayscale 
      */ 
      if(!threshed.empty()) 
       Imgproc.cvtColor(threshed, threshed, Imgproc.COLOR_RGB2GRAY); 
      if(!crop.empty()) 
       Imgproc.cvtColor(crop, crop, Imgproc.COLOR_BGR2GRAY);   

      /* 
      * Use Adaptive Thresholding on the grayscaled Mats 
      * crop -> threshed 
      * Mat src, Mat dst, double maxValue, int adaptiveMethod, int thresholdType, int blockSize, double C 
      */ 
      Imgproc.adaptiveThreshold(crop, threshed, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 15, 8);//15, 8 were original tests. Casey was 75,10 

      Utils.matToBitmap(threshed, bmThreshed); 
      bmThreshed = bmCrop; 
5

Неудача утверждение означает, что входное изображение, чтобы cvtColor() не имеет или 3 или 4-х каналов. Проблема в том, что вы инициализируете threshed с типом CV_8UC1 (который является одноканальным оттенком серого), но затем вызывайте cvtColor() с кодом RGB2GRAY, который ожидает 3-канальное изображение RGB.

Вам не нужно звонить cvtColor() по телефону threshed, так как он уже находится в оттенках серого. И, предполагая, что ваша цель состоит в том, чтобы обрезанное изображение было преобразовано в оттенки серого, вам нужно выполнить преобразование цвета после, вы заполняете данные Mat. Таким образом, соответствующие части вашего кода может выглядеть следующим образом:

 Mat threshed = new Mat(bmCrop.getHeight(),bmCrop.getWidth(), CvType.CV_8UC1, new Scalar(4));//, new Scalar(4) 
     //Mat crop = new Mat(); 
     Mat crop = new Mat(bmCrop.getHeight(),bmCrop.getWidth(), CvType.CV_8UC1,new Scalar(4));//, new Scalar(4) 

     Utils.bitmapToMat(bmCrop, crop); 
     if(!crop.empty()) 
      Imgproc.cvtColor(crop, crop, Imgproc.COLOR_BGR2GRAY,1); 

ОТКАЗ: Я не знаком с Java или API OpenCV Java, так что этот код может потребоваться корректировка.

+0

Спасибо, Аврелий! –

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