Как решить проблему выхода индекса за пределы?

#android #opencv

#Android #opencv

Вопрос:

Я пытаюсь следовать руководству из opencv, разница в том, что я использую Android. Это ссылка.

Я получил ошибку out of bounds в строке, когда он пытается получить новое значение для new Mat

 newImageData[(y * mRgba.cols()   x) * mRgba.channels()   c] = saturate(alpha * pixelValue   beta);
  

Итак, вот весь кодовый метод, который я использовал.

 public Bitmap brightAndContrast(Bitmap bitmap){
    double alpha = 2.0;
    int beta = 50;

    Mat mRgba = new Mat();
    Mat mResult = Mat.zeros(mRgba.size(), mRgba.type());

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

    Bitmap resultBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Utils.bitmapToMat(bitmap, mRgba);

    byte[] imageData = new byte[(int) (mRgba.total()*mRgba.channels())];
    mRgba.get(0, 0, imageData);
    byte[] newImageData = new byte[(int) (mResult.total()*mResult.channels())];
    for (int y = 0; y < mRgba.rows(); y  ) {
        for (int x = 0; x < mRgba.cols(); x  ) {
            for (int c = 0; c < mRgba.channels(); c  ) {
                double pixelValue = imageData[(y * mRgba.cols()   x) * mRgba.channels()   c];
                pixelValue = pixelValue < 0 ? pixelValue   256 : pixelValue;
                newImageData[(y * mRgba.cols()   x) * mRgba.channels()   c] = saturate(alpha * pixelValue   beta); // this is where the line 101
            }
        }
    }
    mResult.put(0, 0, newImageData);


    Utils.matToBitmap(mResult, resultBitmap);

    return resultBitmap;
}
 private byte saturate(double val) {
    int iVal = (int) Math.round(val);
    iVal = iVal > 255 ? 255 : (iVal < 0 ? 0 : iVal);
    return (byte) iVal;
}
  

Итак, почему это выходит за рамки?
И это ошибка, которую я получаю

  java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
    at com.wannatry.tryapps.OpenCVConverter.brightAndContrast(OpenCVConverter.java:101)
    at com.wannatry.tryapps.MainActivity$15.onClick(MainActivity.java:232)
    at android.view.View.performClick(View.java:5740)
    at android.view.View$PerformClick.run(View.java:22947)
  

ОТРЕДАКТИРОВАНО
это код C из руководства

 new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*image.at<Vec3b>(y,x)[c]   beta ); 
  

и это переводится как этот код

 double pixelValue = imageData[(y * image.cols()   x) * image.channels()   c]; pixelValue = pixelValue < 0 ? pixelValue   256 : pixelValue; newImageData[(y * image.cols()   x) * image.channels()   c] = saturate(alpha * pixelValue   beta);
  

Комментарии:

1. это означает, что в вашем массиве ничего нет, и вы получаете из него значения .. длина массива равна 0!

2. @MustufaAnsari где именно? я не знаю, потому что я пытаюсь следовать руководству, и когда я пытаюсь обработать свой sleft, нет ничего плохого, потому что я пытаюсь ввести новые байтовые данные в свое новое изображение, используя значение пикселя. y и x в основном являются строками и столбцами из матрицы mat, а c — для канала, который я использовал для изображения.

3. @SenDjasni я уже это сделал