OpenCV Android开发实战的个人理解2-Mat与Bitmap第一部分

OpenCV Android开发实战的个人理解2-Mat与Bitmap第一部分

1.Mat用法

Mat是OpenCV中用来存储图像信息的内存对象,当通过Imgcodecs.imread()方法从文件读入一个图像文件时,imread方法就会返回Mat对象实例,或者通过Utils.bitmapToMat()方法由Bitmap对象转换而来。

1.1.方法(默认加载三通道顺序BGR彩色图像)

Mat src = Imgcodecs.imread(fileUri.getPath());

指定加载方法

Mat   src=Imgcodecs.imread(fileUri.getPath(), Imgcodecs.IMREAD_COLOR);

PS:

Imgcodecs.IMREAD_COLOR=1,彩色图像
Imgcodecs.IMREAD_GRAYSCALE=1,灰度图像
Imgcodecs.IMREAD_UNCHANGED=1,不改变加载图像类型,可能包含透明通道

1.2.获取信息

int width = src.cols();int height = src.rows();int dims = src.dims();维度
int channels = src.channels();通道数
int depth = src.depth();深度
int type = src.type();类型信息

1.3.创建与初始化

(1)creat方法创建

Mat m1 = new Mat();
m1.create(new Size(3, 3), CvType.CV_8UC3);
Mat m2 = new Mat();
m2.create(3, 3, CvType.CV_8UC3);

(2)ones、eye、zeros方法创建

Mat m3 = Mat.eye(3, 3,CvType.CV_8UC3);
Mat m4 = Mat.eye(new Size(3, 3),CvType.CV_8UC3);
Mat m5 = Mat.zeros(new Size(3, 3), CvType.CV_8UC3);
Mat m6 = Mat.ones(new Size(3, 3), CvType.CV_8UC3);

(3)setTo方法创建

Mat m7 = new Mat(3, 3, CvType.CV_8UC3);
m7.setTo(new Scalar(255, 255, 255));

(4)copyTo方法创建

Mat m8 = new Mat(500, 500, CvType.CV_8UC3);
m8.setTo(new Scalar(127, 127, 127));
Mat result = new Mat();
m8.copyTo(result);

1.4.对象保存

Mat image = new Mat(500, 500, CvType.CV_8UC3);
image.setTo(new Scalar(127, 127, 127));
ImageSelectUtils.saveImage(image);

2.Bitmap用法

2.1.图像文件与资源加载

Bitmap bm = BitmapFactory.decodeResource(this.getResources(), R.drawable.lena);

PS:当前Android支持的Bitmap像素存储类型为:

Bitmap.Config.ALPHA_8;
Bitmap.Config.ARGB_4444;
Bitmap.Config.RGB_565;
Bitmap.Config.ARGB_8888;

2.2.Bitmap循环读取每个像素每个通道并修改

int a=0, r=0, g=0, b=0;
    for(int row=0; row<height; row++) {
        for(int col=0; col<width; col++) {
           // 读取像素
           int pixel = bm.getPixel(col, row);
           a = Color.alpha(pixel);
           r = Color.red(pixel);
           g = Color.green(pixel);
           b = Color.blue(pixel);
           // 修改像素
           r = 255 - r;
           g = 255 - g;
           b = 255 - b;
           // 保存到Bitmap中
           bm.setPixel(col, row, Color.argb(a, r, g, b));
    }
}

2.3.Bitmap开辟像素缓冲区并修改

int[] pixels = new int[width*height];
bm.getPixels(pixels, 0, width, 0, 0, width, height);
int a=0, r=0, g=0, b=0;
int index = 0;
for(int row=0; row<height; row++) {
        for(int col=0; col<width; col++) {
                // 读取像素
                index = width*row + col;
                a=(pixels[index]>>24)&0xff;
                r=(pixels[index]>>16)&0xff;
                g=(pixels[index]>>8)&0xff;
                b=pixels[index]&0xff;
                // 修改像素
                r = 255 - r;
                g = 255 - g;
                b = 255 - b;
                // 保存到Bitmap中
                pixels[index] = (a << 24) | (r << 16) | (g << 8) | b;
        }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

matken

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值