认识Mat容器

news2024/11/26 8:38:08

目录

1.什么是Mat类

2.Mat类能存储的数据

整数类型(有符号和无符号):

浮点数类型:

布尔类型:

3.Mat类的创建

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

2.利用矩陈Size(结构和数据类型参数创建Mat类

3.利用已有Mat类创建新的Mat类

4.Mat类的赋值

1.创建时赋值

2.类方法赋值

3.枚举法赋值

5. Android jni demo


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位有符号整数

  2. 浮点数类型:
    • CV_32F:32位浮点数(单精度浮点数)

    • CV_64F:64位浮点数(双精度浮点数)

  3. 布尔类型:
    • 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());



}

输出结果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/941026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ day6

1.编程题&#xff1a; 以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动…

RSA私钥解密操作

RSA私钥解密操作 一、背景二、操作三、常见问题3.1 invalid key format3.2 解密的数据太长3.3 Decryption error 一、背景 项目数据库中存放的敏感字段已使用rsa加密的方式&#xff0c;将内容加密成密文存放, 现在需要在使用的时候&#xff0c;使用私钥进行解密。 二、操作 …

无涯教程-Python机器学习 - AdaBoost函数

它是最成功的增强集成算法之一。该算法的主要关键在于它们对数据集中的赋予权重的方式。因此,在构建后续模型时,该算法无需过多关注。 在以下Python配方中,我们将通过使用Pima Indians糖尿病数据集上的 sklearn 的 AdaBoostClassifier 类来构建用于分类的Ada Boost集成模型。 …

【计算机基础】一文带你了解 Linux

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

【DevOps视频笔记】6 - 7. Jenkins 介绍 和 安装

一、Integrate 工具 二、Jenkins 介绍 1. Jenkins 最主要的工作 2. CI / CD 可以理解为&#xff1a; 2.1 CI 过程 2.2 CD 过程 三、Jenkins 安装 1. 安装准备工作 2. 安装 Jenkins Stage 1&#xff1a;拉取 jenkins 镜像 Stage 2&#xff1a;编写docker-compose.yml St…

Postgresql的一个bug_涉及归档和pg_wal

故障描述&#xff1a; 服务器ocmpgdbprod1&#xff0c;是流复制主节点&#xff0c;它的从节点是ocmpgdbprod2&#xff0c;两个节点的Postgresql数据库版本都是PostgreSQL 11.6&#xff0c;主节点ocmpgdbprod1配置了pg_wal归档&#xff0c;从节点ocmpgdbprod2没有配置pg_wal归档…

雅思作文复习

目录 我使用的词汇&#xff1a; 上升&#xff1a; 下降&#xff1a; 波动&#xff1a; 保持&#xff1a; 幅度 大变化&#xff1a; 小变化&#xff1a; 雅思评价标准改变 小作文一般花费20分钟&#xff0c;我觉得自己能在18分钟解决是最好 考生在雅思考试中的小作文&a…

kali的学习

网络配置 1.kali的网络设置 首先我们了解kali的网络设置 DHCP&#xff1a;动态主机配置协议 是一个局域网的协议 使用UDP 协议工作静态IP&#xff1a;用于大部分的中小型网络 通过网络管理员手动分配IP原理进程 /etc 系统大部分服务启动过程都要访问该目录 我们直接去看看…

高效便捷的法律咨询小程序的设计与实践

现如今&#xff0c;随着智能手机的普及和移动互联网的发展&#xff0c;小程序成为了一种新兴的应用形式。对于律师事务所来说&#xff0c;开发一款专属的法律咨询小程序&#xff0c;无疑可以为客户提供更加便捷和高效的服务。那么&#xff0c;对于初次接触小程序制作的新手来说…

spring:AOP面向切面编程+事务管理

目录 一、Aop( Aspect Oriented Programming) 二、springAOP实现 1.XML实现 2.注解实现 三、spring事务管理 一、Aop( Aspect Oriented Programming) 将程序中的非业务代码抽取&#xff0c;使非业务代码与业务代码相隔离&#xff0c;为目标类创建一个代理对象让代理对象调用…

【C++初阶】stack的常见操作和模拟实现

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

LNMT动静分离+keepalived

目录 前言 一、实验拓扑 二、配置tomcat 三、nfs配置 四、配置NGINX 五、配置NGINX的双机热备 六、验证双机热备 前言 LNMT动静分离是指在LNMT架构中使用动静分离技术&#xff0c;将动态请求和静态请求分开处理和分发&#xff0c;以提高性能和可扩展性。这种架构使用Nginx…

在GPU服务器(Linux)上安装Anaconda和PyTorch环境

安装Anaconda3 Anaconda官网&#xff1a;https://repo.anaconda.com/archive/ 根据自己需要&#xff0c;复制安装包名字&#xff0c;以Anaconda3-2023.07-2-Linux-x86_64.sh为例 命名规则&#xff1a;Anaconda3-<版本号>-Linux-x86_64.sh 在终端输入命令&#xff0c;下…

设备分类、设备号申请和注销

一、Linux内核对设备的分类 linux的文件种类&#xff1a; -&#xff1a;普通文件d&#xff1a;目录文件p&#xff1a;管道文件s&#xff1a;本地socket文件l&#xff1a;链接文件c&#xff1a;字符设备b&#xff1a;块设备 Linux内核按驱动程序实现模型框架的不同&#xff0…

JSX底层渲染机制

JSX底层渲染机制 一,.步骤 1.把我们写的jsx语法编译为虚拟DOM【virtualDOM】 虚拟DOM对象&#xff1a;框架自己内部构建的一套对象体系&#xff08;对象的相关成员都是React内部绑定的&#xff09;&#xff0c;基于这些属性描述出我们所构建视图中的DOM接的相关特征 1基于ba…

【crypto++使用】使用crypto++库函数运行RSA非对称加密

系列文章目录 1.&#xff08;全网最详细攻略&#xff09;【Crypto】在Visual studio2022中运行Cryptopp 文章目录 系列文章目录前言一、RSA加密过程、步骤可学习的网址 二、代码部分1.visual studio编程注意一个标准案例提供给大家 2.RSA密钥生成思考&#xff1a; 3.关于RSA的…

计算机视觉-卷积神经网络

目录 计算机视觉的发展历程 卷积神经网络 卷积&#xff08;Convolution&#xff09; 卷积计算 感受野&#xff08;Receptive Field&#xff09; 步幅&#xff08;stride&#xff09; 感受野&#xff08;Receptive Field&#xff09; 多输入通道、多输出通道和批量操作 …

死信队列理解与使用

一、简介 在rabbitMQ中常用的交换机有三种&#xff0c;直连交换机、广播交换机、主题交换机&#xff1b; 直连交换机中队列与交换机需要约定好routingKey去进行绑定&#xff1b; 广播交换机并不需要routingKey绑定,只需队列与交换机绑定即可&#xff1b; 主题交换机最大的特…

dml dql 约束 数据库设计

dml 1.添加数据 *语法 &#xff1a; *insert into 表名&#xff08;列名1&#xff0c;列名2&#xff0c;……..列名n&#xff09;values(值1&#xff0c;值2&#xff0c;…值n) *注意&#xff1a; 1.列名和值要一一对应 2.如果表名后&#xff0c;不写列名&#xff0c;就要给…

QT 获取程序编译时间并且转化格式

前言 有的时候我们要在程序的关于界面加上程序的编译时间等信息。可以通过如下代码实现 QString buildTime QStringLiteral("%1 %2").arg(__DATE__).arg(__TIME__);ui->label->setText(buildTime);QDateTime dateTime QLocale("en_US").toDateTim…