#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 я уже это сделал