Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Typical good candidates for the NDK are self-contained, CPU-intensive operations that don't allocate much memory, such as signal processing, physics simulation, and so on.
public static boolean ColorDodgeGray(Mat mat, Mat top){
Log.i(TAG,"ColorDodgeGray BEGIN");
NativeUtils.nativeColorDodgeGray(mat.getNativeObjAddr(), top.getNativeObjAddr());
/*for (int i=0; i<mat.rows(); i++){
for (int j=0; j<mat.cols(); j++) {
double[] matPix = mat.get(i, j);
double[] topPix = top.get(i, j);
if (matPix[0]+topPix[0]>255){
matPix[0] = 255.;
} else {
matPix[0] = (255. * matPix[0]) / (256. - topPix[0]);
}
mat.put(i, j, matPix);
}
}*/
Log.i(TAG,"ColorDodgeGray END");
return true;
}
Я так понял что аналог нейтивному коду — это закоментированный код?
Если же нужно обработать именно Mat, тогда очевидно лучшим решением будет использовать предоставляемые методы, или сконвертировать его в Bitmap и использовать упомянутые методы
uchar matPix = mat.at<uchar>(i, j);
mat.at<uchar>(i, j) = matPix;double[] matPix = mat.get(i, j);
судя по возвращаемому массиву по-любому делает копирование массива (rows*cols раз!), из которого потом используется ровно один элемент…Вот, например, существенно более быстрый способ: ровно одно копирование.
double[] matPix = mat.get(i, j);double[] buff = new double[size];
mat.get(0, 0, buff);int size = mat.cols();
for (int i=0; i<mat.rows(); i++){
byte[] matPix = new byte[size];
byte[] topPix = new byte[size];
mat.get(i, 0, matPix);
top.get(i, 0, topPix);
for (int j=0; j<size; j++) {
if (matPix[j]+topPix[j]>255){
matPix[j] = (byte) 255;
} else {
matPix[j] = (byte) ((255 * matPix[j]) / (256 - topPix[j]));
}
}
mat.put(i, 0, matPix);
}int mp = (matPix[j] & 0xFF);
int tp = (topPix[j] & 0xFF);
И, кстати, спасибо за тест. :)
Android SDK vs NDK — сравнение производительности однотипных участков кода