Использовать адаптивный порог на android - PullRequest
0 голосов
/ 23 февраля 2020

Я хочу использовать адаптивный порог на моем изображении, когда я нажимаю на кнопку (onclick), но не уверен, почему всегда есть ошибка

Вот моя основная деятельность

    public void convertToGray(View v) {
    Mat Rgba = new Mat();
    Mat grayMat = new Mat();
    Mat dst = new Mat();

    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inDither = false;
    o.inSampleSize = 4;

    int width = imageBitmap.getWidth();
    int height = imageBitmap.getHeight();

    grayBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);

    //Bitmap to MAT

    Utils.bitmapToMat(imageBitmap, Rgba);

    Imgproc.cvtColor(Rgba, grayMat, Imgproc.COLOR_RGB2GRAY);

    conBitmap = Bitmap.createBitmap(width, height, CvType.CV_8UC1);

    //Bitmap to MAT

    Utils.bitmapToMat(imageBitmap, Rgba);


    Imgproc.adaptiveThreshold(Rgba, dst, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 11, 2);

    Utils.matToBitmap(dst, conBitmap);

    imageView.setImageBitmap(conBitmap);


}

И вот ошибка

2020-02-23 22:16:18.631 30200-30200/com.example.myapplication E/cv::error(): OpenCV(3.4.1) Error: Assertion failed (src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3))) in void cv::adaptiveThreshold(cv::InputArray, cv::OutputArray, double, int, int, int, double), file /build/master_pack-android/opencv/modules/imgproc/src/thresh.cpp, line 1524
2020-02-23 22:16:18.633 30200-30200/com.example.myapplication E/org.opencv.imgproc: imgproc::adaptiveThreshold_10() caught cv::Exception: OpenCV(3.4.1) /build/master_pack-android/opencv/modules/imgproc/src/thresh.cpp:1524: error: (-215) src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function void cv::adaptiveThreshold(cv::InputArray, cv::OutputArray, double, int, int, int, double)
2020-02-23 22:16:18.633 30200-30200/com.example.myapplication D/AndroidRuntime: Shutting down VM
2020-02-23 22:16:18.634 30200-30200/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 30200
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
        at android.view.View.performClick(View.java:7125)
        at android.view.View.performClickInternal(View.java:7102)
        at android.view.View.access$3500(View.java:801)
        at android.view.View$PerformClick.run(View.java:27336)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
        at android.view.View.performClick(View.java:7125) 
        at android.view.View.performClickInternal(View.java:7102) 
        at android.view.View.access$3500(View.java:801) 
        at android.view.View$PerformClick.run(View.java:27336) 
        at android.os.Handler.handleCallback(Handler.java:883) 
        at android.os.Handler.dispatchMessage(Handler.java:100) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7356) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930) 
     Caused by: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.1) /build/master_pack-android/opencv/modules/imgproc/src/thresh.cpp:1524: error: (-215) src.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) in function void cv::adaptiveThreshold(cv::InputArray, cv::OutputArray, double, int, int, int, double)
    ]
        at org.opencv.imgproc.Imgproc.adaptiveThreshold_0(Native Method)
        at org.opencv.imgproc.Imgproc.adaptiveThreshold(Imgproc.java:1459)
        at com.example.myapplication.MainActivity.convertToGray(MainActivity.java:124)
            ... 13 more

а это мой activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.myapplication.MainActivity">


<Button
    android:id="@+id/button"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Gallery"
    android:onClick="openGallery"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"/>

<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:onClick="convertToGray"
    android:layout_marginStart="45dp"
    android:layout_toEndOf="@+id/button"
    android:text="Grayscale" />

<ImageView
    android:id="@+id/imageView"
    android:layout_width="match_parent"
    android:layout_height="605dp"
    app:srcCompat="@mipmap/ic_launcher" />
</RelativeLayout>

1 Ответ

0 голосов
/ 24 февраля 2020

Пожалуйста, ознакомьтесь с руководством по OpenCV: adaptiveThreshold

Кажется, что adaptiveThreshold принимает только одноканальные изображения, однако, похоже, что вы подаете цветное изображение. Либо преобразуйте входное изображение в серое изображение levekl, либо примените thersholding к каждому каналу отдельно.

Удачи

Andreas

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...