OpenCV(三):Mat类数据的读取

目录

1.Mat类矩阵的常用属性

2.Mat元素的读取

[1.at方法读取Mat矩阵元素 at (int row,int col)](#1.at方法读取Mat矩阵元素 at (int row,int col))

2.矩阵元素地址定位方式访问元素

[3.Android jni demo](#3.Android jni demo)


1.Mat类矩阵的常用属性

下面是一些Mat类的常用属性:

  1. rows: 返回Mat对象的行数。

  2. cols: 返回Mat对象的列数。

  3. dims: 返回Mat对象的维度数,通常为2(表示二维矩阵)。

  4. size(): 返回Mat对象的尺寸(行数和列数)。

  5. empty(): 返回一个布尔值,判断Mat对象是否为空(即未分配内存)。

  6. total(): 返回Mat对象的总元素数。

  7. type(): 返回Mat对象的数据类型,例如CV_8UC1表示8位无符号单通道图像。

  8. channels(): 返回Mat对象的通道数。

  9. depth(): 返回Mat对象中每个像素元素的深度。

  10. elemSize(): 返回Mat对象中每个像素元素的大小(以字节为单位)。

  11. elemSize1(): 返回Mat对象中每个像素元素的大小(以字节为单位),不考虑通道数。

  12. isContinuous(): 返回一个布尔值,指示Mat对象的数据是否连续存储。

  13. total(): 返回Mat对象的总元素数量。

  14. step: 返回Mat对象中每行像素数据的字节步长。

2.Mat元素的读取

1.at方法读取Mat矩阵元素 at (int row,int col)

单通道:

int value = (int)a.at<uchar>(0, 0);

多通道:

cv::Vec3b vc3 = b.at<cv::Vec3b>(0, 0)

int first = (int)vc3.val0;

2.矩阵元素地址定位方式访问元素

单通道

(int)(*(b.data + b.step0 * row + b.step1* col + channel));

比较直观

不用考虑数据类型

3.Android jni demo

复制代码
#include <jni.h>
#include <string>
#include <android/bitmap.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <android/log.h>

#define LOG_TAG "xxx"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG, __VA_ARGS__)
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)

using namespace cv;
using namespace std;
 extern "C"
    JNIEXPORT void JNICALL
    Java_com_example_myapplication_MainActivity_test(JNIEnv *env, jclass clazz) {
        Mat c0(5,5,CV_8UC1,Scalar(4,5,6));
        Mat c1(5,5,CV_8UC2,Scalar(4,5,6));
        Mat c2(5,5,CV_8UC3,Scalar(4,5,6));
        Mat d = (Mat_<int>(1, 5) << 1, 2, 3, 4, 5);
        ostringstream ss;
        ss<<"Mat d的【0,0】="<<d.at<int>(0,0)<<endl;
        Vec2b vc=c1.at<Vec2b>(0,1);
        ss<<"vc.val[0]="<<(int)vc.val[0]<<" vc.val[1]="<<(int)vc.val[1]<<endl;
        ss<<(int)(*(c2.data + c2.step[0] * 2 + c2.step[1]* 2 + 3))<<endl;
        LOGD("%s",ss.str().c_str());
    }

运行结果:

相关推荐
Meteors.1 小时前
安卓源码阅读——01.grade设置binding为true时,xml如何进行映射
android·xml
_李小白2 小时前
【android opencv学习笔记】Day 26: 滤波算法之低通滤波与图像缩放插值
android·opencv·学习
NiceCloud喜云2 小时前
Claude Code Routines 实战:三种触发器跑通云端自动化编码
android·运维·数据库·人工智能·自动化·json·飞书
我命由我123456 小时前
Bugly - Bugly 基本使用( App 质量追踪平台)
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
weiggle6 小时前
第二篇:搭建你的第一个 Compose 项目——开发环境与项目结构
android·前端
阿巴斯甜6 小时前
为什么 AIDL 接口客户端、服务端要写两份一模一样的?
android
weiggle7 小时前
第一篇:Jetpack Compose 宣言——为什么 Android 开发需要声明式 UI
android
城管不管9 小时前
什么是Prompt?
android·java·数据库·语言模型·llm·prompt
Hello world.Joey9 小时前
吴恩达深度学习基础
人工智能·深度学习·神经网络·opencv·算法·机器学习·计算机视觉