Android, применяя фильтр сепия в OpenCV

Я новичок в Android OpenCV и пытаюсь применить эффект сепии, используя ядро ​​Mat. У меня есть класс фильтра, реализованный для применения фильтра в исходном мат.

Это класс SepiaFilter, который реализует интерфейсный фильтр:

public class SepiaFilter implements Filter {

Mat mSepiaKernel;

public SepiaFilter() {

mSepiaKernel = new Mat(4, 4, CvType.CV_32F);
mSepiaKernel.put(0, 0, /* R */0.189f, 0.769f, 0.393f, 0f);
mSepiaKernel.put(1, 0, /* G */0.168f, 0.686f, 0.349f, 0f);
mSepiaKernel.put(2, 0, /* B */0.131f, 0.534f, 0.272f, 0f);
mSepiaKernel.put(3, 0, /* A */0.000f, 0.000f, 0.000f, 1f);
}

@Override
public void apply(Mat src, Mat dest) {

Mat tmpMat = src.clone();

Core.transform(tmpMat, dest, mSepiaKernel);
// Imgproc.filter2D(tmpMat, dest, -1, mSepiaKernel); not used
}
}

Это статический метод для получения Mat из файла.
Я использую этот статический метод, чтобы открыть все изображения одним и тем же процессом.
Я еще не уверен на 100% насчет цвета, на который мне следует подать заявку Imgproc.COLOR_BGR2RGBA.

 public static Mat getMatFromFile(File file){
Mat rgbLoadedImage = null;

Mat image = Imgcodecs.imread(file.getAbsolutePath());

if (image.width() > 0) {

rgbLoadedImage = new Mat(image.size(), image.type());

Imgproc.cvtColor(image, rgbLoadedImage, Imgproc.COLOR_BGR2RGBA);

LOGD(TAG, "loadedImage: " + "chans: " + image.channels()
+ ", (" + image.width() + ", " + image.height() + ")");

image.release();
}

return rgbLoadedImage;
}

И это призыв к классу:

mCurrentImgMat = getMatFromFile(fileImage);
Mat sepiaMat = new Mat(mCurrentImgMat.size(), mCurrentImgMat.type());

new SepiaFilter().apply(mCurrentImgMat, sepiaMat);

Последний шаг — получить растровое изображение из мата:

 Bitmap bitmap = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(src, bitmap);

Как только я применяю фильтр, он частично или почти полностью белый, а не цвет сепии. Я хотел бы знать, что я делаю неправильно.
Я думаю, это может быть Сепия ядро или Core.transformation. Я также пытался с Imgproc.COLOR_BGR2RGBA.

Некоторые ссылки, которые я проверял, чтобы получить идею

http://answers.opencv.org/question/30328/how-to-implement-filters/

Здесь mSepiaKernel

0

Решение

Я думаю, что вы получили ошибку при создании ядра mSepiaKernel, mSepiaKernel 4×4, и вы просто устанавливаете значение в (0,0), (1,0), (2,0), (3,0), но в этой позиции находится только одно значение, а не массив (это мат 1×1), запомните ваше ядро имеет один канал.
Вам необходимо изменить код с помощью ниже:

mSepiaKernel.put(0, 0, 0.189f);
mSepiaKernel.put(0, 1, 0.769f);
mSepiaKernel.put(0, 2, 0.393f);
mSepiaKernel.put(0, 3, 0.0);

и так далее с другими позициями в строках 1,2 и 3

0

Другие решения


По вопросам рекламы [email protected]