1.Mat类矩阵的常用属性
下面是一些Mat类的常用属性:
- rows: 返回Mat对象的行数。
- cols: 返回Mat对象的列数。
- dims: 返回Mat对象的维度数,通常为2(表示二维矩阵)。
- size(): 返回Mat对象的尺寸(行数和列数)。
- empty(): 返回一个布尔值,判断Mat对象是否为空(即未分配内存)。
- total(): 返回Mat对象的总元素数。
- type(): 返回Mat对象的数据类型,例如CV_8UC1表示8位无符号单通道图像。
- channels(): 返回Mat对象的通道数。
- depth(): 返回Mat对象中每个像素元素的深度。
- elemSize(): 返回Mat对象中每个像素元素的大小(以字节为单位)。
- elemSize1(): 返回Mat对象中每个像素元素的大小(以字节为单位),不考虑通道数。
- isContinuous(): 返回一个布尔值,指示Mat对象的数据是否连续存储。
- total(): 返回Mat对象的总元素数量。
- 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.val[0];
2.矩阵元素地址定位方式访问元素
单通道
(int)(*(b.data + b.step[0] * row + b.step[1]* 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()); }
运行结果: