OpenCV(二):认识Mat容器

news2024/12/26 4:23:51

目录

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/958995.html

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

相关文章

三十七个常见Vue面试题,背就完事了四

二十八、Vue.use是干什么的&#xff1f;Vue.use是用来使用插件的。我们可以在插件中扩展全局组件、指令、原型方法等。 会调用install方法将Vue的构建函数默认传入&#xff0c;在插件中可以使用vue&#xff0c;无需依赖vue库 二十九、组件写name有啥好处&#xff1f; 增加name…

恒运资本:什么叫融资通俗的讲是什么意思?

融资浅显的讲是什么意思&#xff1f; 近年来&#xff0c;伴随着互联网金融的鼓起&#xff0c;融资这个词越来越为人们所熟知。但是&#xff0c;关于融资这个词的意思&#xff0c;很多人也许只是有一个含糊的概念&#xff0c;无法做到准确而深入的了解。本文将从多个角度剖析&a…

VB:百元买百鸡问题

VB&#xff1a;百元买百鸡问题 Private Sub Command1_Click()ClsRem 百元买百鸡问题Print "公鸡", "母鸡", "小鸡"For x 0 To 20For y 0 To 33z 100 - x - yIf z Mod 3 0 ThenIf 5 * x 3 * y z / 3 100 ThenPrint x, y, zEnd IfEnd IfNe…

亚运会即将召开,数字孪生体育场能够发挥什么作用?

亚运会&#xff0c;作为亚洲地区最重要的综合性运动盛会之一&#xff0c;将吸引数以千计的运动员、教练员和观众汇聚一堂&#xff0c;共同见证运动的魅力。在如此大规模的体育盛会中&#xff0c;数字孪生技术能够为运动场馆的规划、运营和观众带来前所未有的体验。 数字孪生技术…

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序

ESP-C3入门22. 基于VSCODE使用内置JTAG调试程序 一、简介1. 内置 jtag 介绍2. OpenOCD3. 准备工作 二、操作步骤1. 接线2. 在VSCode设置端口等信息3. 测试编译烧录 三、调试程序 一、简介 1. 内置 jtag 介绍 在ESP32中&#xff0c;内置了一个用于JTAG调试的特殊程序&#xff…

【实验八】555定时器的应用

【实验内容】 【实验报告】 【实验截图】 1 2 3 【得分】

(c++)类和对象 上篇

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步…

C++ for 循环

for 循环允许您编写一个执行特定次数的循环的重复控制结构。 语法 C 中 for 循环的语法&#xff1a; for ( init; condition; increment ) {statement(s); }下面是 for 循环的控制流&#xff1a; init 会首先被执行&#xff0c;且只会执行一次。这一步允许您声明并初始化任…

模糊测试面面观 | 模糊测试是如何发现异常情况的?

协议模糊测试是一种用于评估通信协议、文件格式和API实现系统安全性和稳定性的关键技术。在模糊测试过程中&#xff0c;监视器扮演着关键角色&#xff0c;它们能够捕获异常情况、错误响应、资源利用等&#xff0c;为测试人员提供有价值的信息&#xff0c;有助于发现潜在漏洞和问…

STM32-串口通信(串口的接收和发送)

文章目录 STM32的串口通信一、STM32里的串口通信二、串口的发送和接收串口发送串口接收 三、串口在STM32中的配置四、串口接收的两种实现方式1. 需要更改的地方2. 查询RXNE标志位3. 使用中断 总结 STM32的串口通信 本文在于记录自己的学习过程中遇到的问题和总结&#xff0c;各…

LeetCode——栈的压入、弹出序列

这里我用下面的例子子来讲解一下模拟栈的实现。 例子1&#xff1a;pushed [1,2,3,4,5] popped [4,5,3,2,1] 思路&#xff1a;第一步&#xff1a;我们先创建一个栈&#xff0c;然后将pushed的数据压进去 第二步&#xff1a;判断&#xff01; 当压入栈的数据和popped第一个数据…

【实验六】组合逻辑电路的设计

【实验内容】 【实验报告】

向openssl中添加一个最简单的算法

文章目录 一、尝试在sha.c中添加新的函数二、添加自定义算法2.1 添加对应文件2.2 相关配置2.3 编译运行 一、尝试在sha.c中添加新的函数 在尝试添加新算法前&#xff0c;我先尝试在原有的旧算法中添加一个新函数&#xff0c;看是否能被编译并生成对应的动态链接库。 关于open…

unity 跨屏显示

1.代码 /*Type:设置分辨率*/ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Runtime.InteropServices;public class ScreenManager : MonoBehaviour {[HideInInspector]//导入设置窗口函数 [DllImport("…

nginx压缩ttf文件 mine.types的作用

最近在运维过程中&#xff0c;前端提到发现在linux上下载某ttl文件&#xff08;字体文件&#xff09;太大&#xff0c;传输过程比较慢&#xff0c;于是就想着使用nginx的gzip进行压缩&#xff0c;经过不断尝试&#xff0c;终于发现在nginx的配置目录/etc/nginx/mine.types 文件…

Windows中安装nvm进行Node版本控制与详细使用教程

1.nvm介绍 nvm英文全程也叫node.js version management&#xff0c;是一个nodejs的版本管理工具。nvm和npm都是node.js版本管理工具&#xff0c;但是为了解决node各种不同之间版本存在不兼容的问题&#xff0c;因此可以通过nvm安装和切换不同版本的node。 2.nvm下载 可在点此…

springboot网上家乡特产商城系统 微信小程序

基于特产商城小程序的设计基于现有的智能手机上运行&#xff0c;可以实现管理员服务端&#xff1b;首页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理等功能。方便用户微信端&#xff1b;首页、商品信息、商城公告、购物车、我的 等详细的了解及统计分…

JavaScript Web APIs-01学习

复习&#xff1a; splice() 方法用于添加或删除数组中的元素。 **注意&#xff1a;**这种方法会改变原始数组。 删除数组&#xff1a; splice(起始位置&#xff0c; 删除的个数) 比如&#xff1a;1 let arr [red, green, blue] arr.splice(1,1) // 删除green元素 consol…

Ubuntu 22.04.2 LTS 安装python3.6后报错No module named ‘ufw‘

查明原因&#xff1a; vim /usr/sbin/ufw 初步判断是python版本的问题。 # 查看python3软链接 ll /usr/bin/python3 将python3的软链接从python3.6换成之前的3.10&#xff0c;根据自己电脑情况。 可以查看下 /usr/bin 下有什么 我这是python3.10 所以解决办法是 # 移除py…

四神兽套餐,自控专业课复习最强资料详细介绍!

⭐️所谓又专又精&#xff0c;专是指我们售后群团队上百人都是自动化研究生&#xff0c;精是指我们只做自动化这一门专业学科7年了&#xff0c;研究到极致&#xff01; 专业课即将进入强化阶段啦&#xff0c;资料选的好&#xff0c;高分少不了&#xff0c;今天学姐给大家带来的…