【问题标题】:android, applying Sepia filter in opencvandroid,在opencv中应用棕褐色过滤器
【发布时间】:2018-05-25 21:42:04
【问题描述】:

我是 Android OpenCV 的新手,我正在尝试使用 Mat 内核应用棕褐色效果。我有一个过滤器类,用于在源 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);

最后一步是从 Mat 中获取 Bitmap:

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

应用滤镜后,图像部分或几乎全部为白色,而不是棕褐色。我想知道我做错了什么。 我猜它可能是 Sepia KernelCore.transformation。我也试过 Imgproc.COLOR_BGR2RGBA

我一直在检查以获取想法的一些链接

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

Here mSepiaKernel

【问题讨论】:

  • 您缺少的链接是:transform
  • 感谢您的链接

标签: android c++ opencv opencv3.0 opencv4android


【解决方案1】:

我认为您在创建内核 mat 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 行

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2020-04-05
    • 2013-07-13
    相关资源
    最近更新 更多