OpenCV(二):认识Mat容器

简介: OpenCV(二):认识Mat容器



1.什么是Mat类

 Mat类是OpenCV中的一个类,用于存储矩阵数据的类型,与int、double等相同。

2.Mat类能存储的数据

 Mat类可以存储各种类型的数据,包括但不限于以下几种常见的数据类型:

  1. 整数类型(有符号和无符号):
  • CV_8U:8位无符号整数(范围从0到255)
  • CV_8S:8位有符号整数(范围从-128到127)
  • CV_16U:16位无符号整数(范围从0到65535)
  • CV_16S:16位有符号整数(范围从-32768到32767)
  • CV_32S:32位有符号整数
  • CV_64S:64位有符号整数
  1. 浮点数类型:
  • CV_32F:32位浮点数(单精度浮点数)
  • CV_64F:64位浮点数(双精度浮点数)
  1. 布尔类型:
  • CV_8UC1:8位无符号整数,表示二值图像(黑白图像)
  • CV_8UC3:8位无符号整数,表示彩色图像(三通道RGB图像)

3.Mat类的创建

1.利用矩阵宽、高和类型参数创建Mat类

cv::Mat mat( int rows,int cols,int type)

  • 构造矩阵的行数rows:
  • cols:矩阵的列数
  • type: 矩阵中存储的数据类型。此处除了CV 8UC1、CV 64FC4等从1到4通道以外,还提供了更多通道的参数,通过CV 8UC(n)中的n来构建多通道矩阵,其中n最大可以取到512。
2.利用矩陈Size(结构和数据类型参数创建Mat类

cv::Mat mat( Size size,int type)

  • size: 2D数组变量尺寸,通过Size(cols,rows)进行赋值
  • type:与前面一致
3.利用已有Mat类创建新的Mat类

cv::Mat mat( const Mat &m,

const Range & rowRange,

const Range & colRange = Range: :al1()

  • m:已经构建完成的Mat类矩阵数据。
  • rowRange:在已有矩阵中需要截取的行数范围,是个Range变量,例如从第2行到第5行可以表示为Range(2,5)。
  • colRange: 在已有矩阵中需要截取的列数范围,是一个Range变量,例如从第2列到第5列可以表示为
  • Range(2,5),当不输入任何值时表示所有列都会被截取。

4.Mat类的赋值

1.创建时赋值

cv::Mat mat( int rows,

int cols,

int  type,

const Scalar & s

  • 矩阵的行数rows:
  • 矩阵的列数cols:
  • type:存储数据的类型
  • s:给矩阵中每个像素赋值的参数变量,例如Scalar(0,0,255)。
2.类方法赋值
  • eye:单位矩阵
  • diag:对角矩阵
  • 元素全为1的矩阵ones:
  • zeros:元素全为0的矩阵
3.枚举法赋值

cv::Mat a(Mat_<int>(3,3)<<1,2, 3, 4, 5, 6, 7,8, 9);

cv::Mat b = (Mat_<double>(2, 3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2);

5. 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 a(3,3,CV_8UC1);
   Mat b(Size(3,3),CV_8UC1);
   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);
    Mat e=Mat::diag(d);//类方法赋值,对角矩阵
    Mat f=Mat(e,Range(2,4),Range(2,4));
    ostringstream ss;
    ss << "c0 data:" << std::endl;
    // 遍历并输出像素值
    for (int i = 0; i < c0.rows; i++) {
        for (int j = 0; j < c0.cols*c0.channels(); j++) {
            // 获取像素值
            uchar value = c0.at<uchar>(i, j);
            // 构建输出字符串
            ss << static_cast<int>(value) << " ";
        }
        ss << std::endl;
    }
    ss << "c1 data:" << std::endl;
    // 遍历并输出像素值
    for (int i = 0; i < c1.rows; i++) {
        for (int j = 0; j < c1.cols*c1.channels(); j++) {
            // 获取像素值
            uchar value = c1.at<uchar>(i, j);
            // 构建输出字符串
            ss << static_cast<int>(value) << " ";
        }
        ss << std::endl;
    }
    ss << "c2 data:" << std::endl;
    // 遍历并输出像素值
    for (int i = 0; i < c2.rows; i++) {
        for (int j = 0; j < c2.cols*c2.channels(); j++) {
            // 获取像素值
            uchar value = c2.at<uchar>(i, j);
            // 构建输出字符串
            ss << static_cast<int>(value) << " ";
        }
        ss << std::endl;
    }
    ss << "d data:" << std::endl;
    // 遍历并输出像素值
    for (int i = 0; i < d.rows; i++) {
        for (int j = 0; j < d.cols; j++) {
            // 获取像素值
            int value = d.at<int>(i, j);
            // 构建输出字符串
            ss <<value << " ";
        }
        ss << std::endl;
    }
    ss << "e data:" << std::endl;
    // 遍历并输出像素值
    for (int i = 0; i < e.rows; i++) {
        for (int j = 0; j < e.cols*e.channels(); j++) {
            // 获取像素值
            int value = e.at<int>(i, j);
            // 构建输出字符串
            ss << value << " ";
        }
        ss << std::endl;
    }
    ss << "f data:" << std::endl;
    // 遍历并输出像素值
    for (int i = 0; i < f.rows; i++) {
        for (int j = 0; j < f.cols*f.channels(); j++) {
            // 获取像素值
           int value = f.at<int>(i, j);
            // 构建输出字符串
            ss <<value << " ";
        }
        ss << std::endl;
    }
    // 使用LOG输出到Logcat
    LOGD("%s", ss.str().c_str());
}

输出结果:

目录
相关文章
|
4月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C++)
41 2
|
7月前
|
存储 编译器 数据库
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV核心类型 Mat
[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV核心类型 Mat
|
4月前
|
存储 新制造 开发工具
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
Baumer工业相机堡盟工业相机如何联合NEOAPI SDK和OpenCV实现相机图像转换为Mat图像格式(C#)
31 0
|
5月前
|
存储 定位技术 计算机视觉
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
Armadillo与OpenCV矩阵数据mat、vec与Mat的相互转换
|
5月前
|
计算机视觉
OpenCV(四):Mat支持的运算
OpenCV(四):Mat支持的运算
35 0
|
5月前
|
存储 计算机视觉
OpenCV(三):Mat类数据的读取
OpenCV(三):Mat类数据的读取
91 0
|
9月前
|
存储 监控 算法
Baumer工业相机堡盟相机中的JPEG图像压缩相机如何通过BGAPI SDK和OpenCV的Mat进行图像转换(C++)
Baumer工业相机堡盟相机中的JPEG图像压缩相机如何通过BGAPI SDK和OpenCV的Mat进行图像转换(C++)
96 0
|
9月前
|
监控 开发工具 C#
Baumer工业相机堡盟相机BGAPI SDK联合OpenCV进行Mat图像转换(C#)
Baumer工业相机堡盟相机BGAPI SDK联合OpenCV进行Mat图像转换(C#)
69 1
|
9月前
|
开发工具 计算机视觉 C++
Baumer工业相机堡盟相机BGAPI SDK联合OpenCV进行Mat图像转换(C++)
Baumer工业相机堡盟相机BGAPI SDK联合OpenCV进行Mat图像转换(C++)
137 0
|
机器学习/深度学习 监控 计算机视觉
测试 opencv-python 中的 mat 和 Umat 处理图像的差异(GPU加速)
测试 opencv-python 中的 mat 和 Umat 处理图像的差异(GPU加速)
912 0