OpenCV for Android (2)——反色

反色又叫补色,红的补色是绿色,蓝的补色是橙色,黄的补色是紫色,由这三种对比关系可引出很多对比的反色。

1. 关于ARGB_8888、ALPHA_8、ARGB_4444、RGB_565的理解

1.1 相关信息

A:透明度
R:红色
G:绿
B:蓝

1.2 区别

这四种类型为bitmap在内存中存在的四种色彩的存储模式,他们本质区别体现在每种模式下的bitmap内部的每个像素点,在内存中的大小和组成成分的区别。

名称定义
Bitmap.Config ARGB_4444每个像素占四位,即A=4,R=4,G=4,B=4,那么一个像素点占4+4+4+4=16位=2byte
Bitmap.Config ARGB_8888每个像素占四位,即A=8,R=8,G=8,B=8,那么一个像素点占8+8+8+8=32位=8byte
Bitmap.Config RGB_565每个像素占四位,即R=5,G=6,B=5,没有透明度,那么一个像素点占5+6+5=16位=2byte
Bitmap.Config ALPHA_8每个像素占四位,只有透明度,没有颜色,那么一个像素总共占一个字节,8=8bit=1byte

此处设置图片为:
options.inPreferredConfig = Bitmap.Config.ARGB_8888;

2. Mat下的反色操作

其原理是遍历所有的像素点,转换对应像素点并放回。

bgra[sIndex] = (byte) (255 - bgra[sIndex] & 0xff);

public static Bitmap invertMat(Bitmap bitmap) {

        org.opencv.android.Utils.bitmapToMat(bitmap, sSrc);

        //pixel operation
        //宽
        sWidth = sSrc.cols();
        //高
        sHeight = sSrc.rows();
        int cnum = sSrc.channels();//获取通道

        byte[] bgra = new byte[cnum];//ARGB(Bitmap)-->BGRA(mat)

        for (sRow = 0; sRow < sHeight; sRow++) {
            for (sCol = 0; sCol < sWidth; sCol++) {
                sSrc.get(sRow, sCol, bgra);
                for (sIndex = 0; sIndex < cnum; sIndex++) {
                    bgra[sIndex] = (byte) (255 - bgra[sIndex] & 0xff);
                }
                sSrc.put(sRow, sCol, bgra);
            }
        }
        org.opencv.android.Utils.matToBitmap(sSrc, bitmap);
        sSrc.release();

        return bitmap;
    }

这个方法原理简单,但是由于三层for循环,其操作效率低下,需要等待很长时间才能将图片反色显示出来。

3. Bitmap下的反色操作

public static Bitmap invertBitmap(Bitmap bitmap) {
        sWidth = bitmap.getWidth();
        sHeight = bitmap.getHeight();
        sPixels = new int[sWidth * sHeight];
        bitmap.getPixels(sPixels, 0, sWidth, 0, 0, sWidth, sHeight);

        sIndex = 0;
        for (sRow = 0; sRow < sHeight; sRow++) {
            sIndex = sRow * sWidth;
            for (sCol = 0; sCol < sWidth; sCol++) {
                sPixel = sPixels[sIndex];
                sA = (sPixel >> 24) & 0xff;
                sR = (sPixel >> 16) & 0xff;
                sG = (sPixel >> 8) & 0xff;
                sB = sPixel & 0xff;

                sR = 255 - sR;
                sG = 255 - sG;
                sB = 255 - sB;

                sPixel = ((sA & 0xff) << 24 | (sR & 0xff) << 16 | (sG & 0xff) << 8 | sB & 0xff);

                sPixels[sIndex] = sPixel;

                sIndex++;
            }
        }
        bitmap.setPixels(sPixels, 0, sWidth, 0, 0, sWidth, sHeight);
        return bitmap;
    }

相对使用Mat的操作,Bitmap转换的速度将会相对快一些,但遇到大图片时依旧不够快。


Demo: learnOpenCV

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV for Android 是一个开源的计算机视觉库,它提供了一系列用于计算机视觉应用的高效算法。OpenCV 是一个流行的计算机视觉库,它提供了许多用于图像和视频处理的功能。如果你想在 Android 应用程序中使用 OpenCV,你可以使用 OpenCV for Android。 在使用 OpenCV for Android 之前,你需要先安装 Android Studio 和 OpenCV for Android。安装完成后,你可以创建一个新的 Android 应用程序项目,并将 OpenCV for Android 添加到你的项目中。 要使用 OpenCV for Android,你需要在你的代码中添加 OpenCV 库的引用。你可以使用 OpenCV 提供的 Java API,或者使用 JNI 将 C++ 代码嵌入到你的应用程序中。 在使用 OpenCV for Android 时,你需要确保你的应用程序具有足够的权限,以便访问设备上的相机或图库等资源。你还需要测试你的应用程序,以确保它可以正确地使用 OpenCV 库来处理图像和视频数据。 总的来说,OpenCV for Android 是一个强大的工具,可以帮助你快速开发出高质量的 Android 应用程序,从而实现各种计算机视觉任务。 ### 回答2: OpenCV for Android是一个专门设计用于移动平台的图像处理库,它给Android系统提供了处理数字图像和视频的丰富功能和工具。OpenCV for Android可以作为一个Android应用中的库(.so文件),也可以通过Java API直接调用。它可以完成图像预处理、特征提取、物体检测、视频分析等多种图像处理功能。 OpenCV for Android用C++语言开发,但也提供了Java API,这使得开发者可以使用Java语言调用C++函数,而避免了直接使用NDK编写Native代码的复杂性。它的Java API设计良好,比较容易理解和使用。与此同时,OpenCV for Android提供了一个完整的示例应用程序,方便开发者学习和使用。 OpenCV for Android还具有高度的可裁剪性。开发者可以根据自己的需求,选择只使用OpenCV for Android库中的特定模块,而不必将整个库作为一个整体引入项目。这使得OpenCV for Android在应用中的集成更为灵活和轻量。 OpenCV for Android有一些特性,使其在处理大规模的图像和视频上更为高效和可靠。它使用了Java虚拟机 (JVM) 来缓存和管理内存,而OpenCV核心库会自动进行并行优化,以使程序在Android设备上运行得更快。此外,OpenCV for Android支持多种图像和视频格式,如JPG、PNG、BMP、AVI、MP4等。 总之,OpenCV for AndroidAndroid平台上提供了强大的图像和视频处理能力,为开发者带来了巨大的方便,并且可以快速集成到Android应用程序中。作为一个开源库,它的源代码和详细的文档也是公开可用的,这使得学习和使用OpenCV for Android更为容易和方便。 ### 回答3: OpenCV for Android是一款开源的计算机视觉库,它可以轻松地在Android平台上进行图像和视频处理。这个库具有广泛的功能,包括图像处理、目标识别、运动跟踪、面部识别和机器学习等等。 OpenCV for Android的使用非常简单和直接。可供选择的API包括Java API和C++ API。你可以使用Java API来编写易于理解和易于维护的代码,或者使用C++ API来获得更高的性能和更完整的OpenCV函数库。 OpenCV for Android也提供了丰富的开发工具。开发者可以使用Android Studio来编写和调试他们的OpenCV应用程序。同时,该库还提供了大量的示例代码和文档,以帮助开发者更快地开始开发他们的应用程序。 除此之外,OpenCV for Android还可以与其他库和工具进行集成,例如TensorFlow,Caffe和Git等。这些工具加强了OpenCV的功能,为开发者提供了更多的选择和灵活性。 总体而言,OpenCV for Android是一种强大而且易于使用的计算机视觉库,它适用于广泛的应用程序和项目。它的不断发展和完善也使其成为了学习计算机视觉技术的理想选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值