Изменить значения пикселей объекта Mat с помощью OpenCV - PullRequest
0 голосов
/ 08 февраля 2019

Я новичок в программировании Android. Я создаю приложение для Android для Image Steganography. Я уже разработал это приложение для настольных компьютеров с использованием Java и OpenCV, которое работает отлично. Я пытаюсь повторно использовать код,который у меня есть.

Я создал объект Mat и передал его в класс Java (который у меня уже есть). Я могу читать Пиксельные интенсивности в Mat Объекте, но когдаЯ пытаюсь изменить эти значения (с помощью put()), мое приложение падает.

Было сгенерировано исключение

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.hari.imagesteganography, PID: 8850
    java.lang.UnsupportedOperationException: Provided data element number (3) should be multiple of the Mat channels count (4)
        at org.opencv.core.Mat.put(Mat.java:954)
        at com.example.hari.imagesteganography.LSBImageStego.encodeOriginalMessageBinaryLength(LSBImageStego.java:101)
        at com.example.hari.imagesteganography.LSBImageStego.encodeImage(LSBImageStego.java:239)
        at com.example.hari.imagesteganography.EncodeActivity$1.onClick(EncodeActivity.java:98)
        at android.view.View.performClick(View.java:6302)
        at android.view.View$PerformClick.run(View.java:24782)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6518)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Тот же метод (put()) работаетотлично работает на рабочем столе.

Ниже приведен мой код в приложении Android.

private void encodeOriginalMessageBinaryLength(){

// LOGGING THIS,SHOWS THAT THE FUNCTION EXECUTION STARTED
        Log.i("URI" , "encodeOriginalMessageBinaryLength()");

        String binary_of_originalMessageBinaryLength = Integer.toBinaryString(this.originalMessageBinaryLength);
        if(binary_of_originalMessageBinaryLength.length()%2 !=0){
            binary_of_originalMessageBinaryLength = "0" + binary_of_originalMessageBinaryLength;
        }
        int remaining = binary_of_originalMessageBinaryLength.length();
        String newLsbBits;

        for(int col = this.coverImage_cols -1 ; col >=0 ; col--){
            if(remaining > 0){
                newLsbBits = binary_of_originalMessageBinaryLength.substring( remaining - NUMBER_OF_BITS_REPLACING , remaining );
                remaining -= NUMBER_OF_BITS_REPLACING;

            }else{
                newLsbBits = String.join("", Collections.nCopies(NUMBER_OF_BITS_REPLACING, "0"));
            }

            Log.i("URI","newLsbBits"+newLsbBits);
            String modifiedBinaryString = this.getBeautifiedBinaryString(this.coverImage.get( this.coverImage_rows -1,col )[0]).substring(0 , this.getBeautifiedBinaryString(this.coverImage.get( this.coverImage_rows -1,col )[0]).length() - NUMBER_OF_BITS_REPLACING) + newLsbBits;

            Log.i("URI","modifiedBianryString"+modifiedBinaryString);
            double[] data = new double[3];
            data[0] = Integer.parseInt(modifiedBinaryString , 2);
            data[1] = this.coverImage.get( this.coverImage_rows -1,col )[1];
            data[2] = this.coverImage.get( this.coverImage_rows -1,col )[2];
this.coverImage_rows -1,col )[0]);

//   LOGGING THE DIMENSIONS OF THE IMAGE CORRECTLY,SHOWS THAT THE Mat Object 
//   IS INITIALIZED CORRECTLY
            Log.i("URI" , new Integer(this.coverImage_rows).toString());
            Log.i("URI" , new Integer(this.coverImage_cols).toString());

//  EXECUTING BELOW LINE CAUSES THE APP TO CRASH
            this.coverImage.put( this.coverImage_rows -1,col  , data);


// BELOW MESSAGE IS NOT BEING LOGGED
           Log.i("URI" , "encodeOriginalMessageBinaryLength() END");

        }
}

Соответствующий журнал Logcat выглядит следующим образом.

2019-02-08 12:30:37.019 1230-1230/com.example.hari.imagesteganography I/URI: encodeOriginalMessageBinaryLength()
2019-02-08 12:30:37.019 1230-1230/com.example.hari.imagesteganography I/URI: newLsbBits10
2019-02-08 12:30:37.019 1230-1230/com.example.hari.imagesteganography I/URI: modifiedBianryString10010110
2019-02-08 12:30:37.019 1230-1230/com.example.hari.imagesteganography I/URI: 1440
2019-02-08 12:30:37.019 1230-1230/com.example.hari.imagesteganography I/URI: 2560

Mat Объект и другие атрибуты устанавливаются следующим образом

public LSBImageStego(Mat coverImage){
        this.coverImage = coverImage;
        this.coverImage_rows = (int)coverImage.size().height;
        this.coverImage_cols = (int)coverImage.size().width;
}

Мой код неверен? Как изменить значения пиксельной интенсивности Mat Объект, использующий OpenCV и Java в Android?

Я считаю,что этот вопрос не является дубликатом Использование гet () и put () для доступа к значениям пикселей в OpenCV для Java ИЛИ opencv java изменяют значения пикселей , так как они не предназначены для Android, и метод put(), описанный в этих вопросах,отлично работает даже у меня на рабочем столе.

...