我是Android OpenCV的新手,我正在尝试使用Mat内核来应用Sepia效果。我有一个过滤器类,用于在源Mat中应用过滤器。
这是实现接口Filter:
的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);
最后一步是将Matmap的Bitmap格式化:
Bitmap bitmap = Bitmap.createBitmap(src.cols(), src.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(src, bitmap);
一旦我应用过滤器,它部分或几乎全部是白色而不是棕褐色。我想知道我做错了什么。 我想它可以是 Sepia Kernel 或 Core.transformation 。我也尝试过使用 Imgproc.COLOR_BGR2RGBA 。
我一直在检查的一些链接
http://answers.opencv.org/question/30328/how-to-implement-filters/
答案 0 :(得分:0)
我认为在创建内核垫mSepiaKernel
时出现了一些错误。 mSepiaKernel
是4x4,您只需将值设置为(0,0),(1,0),(2,0),(3,0),但在此位置只有一个值而不是数组(它是1x1 mat),记得你的内核有一个频道。
您需要使用以下代码更改代码:
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行中的位置