OpenCV实现正片叠底

搞OpenGL的时候就接触过正片叠底,实现也简单就A乘以B,最近在搞OpenCV,发现相乘的结果不对

A图

OpenCV实现正片叠底_第1张图片

B图

OpenCV实现正片叠底_第2张图片

使用Core.multiply后的图片是这样的

OpenCV实现正片叠底_第3张图片

照成这样是因为OpenCV的默认取值范围在0~255,而OpenGL的取值范围在0~1,所以OpenCV的图片相乘会出现大于255的情况,而OpenGL相乘永远都不会大于1。这是我在android开发时遇到的情况,其他环境没测试过,不太清楚。

解决方式很简单,把OpenCV的取值范围转成0~1再相乘

public static Mat cvMultiply(Mat base, Mat src){
        if(base.channels() != src.channels()){
            return null;
        }
        int baseType = base.type();
        int srcType = base.type();
        base.convertTo(base, CvType.CV_64FC4, 1.0 / 255);
        src.convertTo(src, CvType.CV_64FC4, 1.0 / 255);
        Mat dst = new Mat();
        Core.multiply(base,src,dst);
        dst.convertTo(dst, baseType, 255);
        base.convertTo(base, baseType, 255);
        src.convertTo(src, srcType, 255);
        return dst;
    }

结果

OpenCV实现正片叠底_第4张图片

Github

 

 

你可能感兴趣的:(android,opencv)