[学opencv]opencv Mat类型初始化,遍历,赋值

2023-10-30

1.opencv Mat类型定义

   cv::Mat a(cv::Size(w,h),CV_8UC1); // 单通道

   cv::Mat b = cv::Mat(cv::Size(w,h),CV_8UC3); //3通道每个矩阵元素包含3个uchar值

对于维数较小的Mat类型,直接定义赋值方法如下:

Mat mtest = (Mat_<float>(4, 1) << -0.055818, -0.734866, -0.675912, 0.506045);

2.定义特殊矩阵

cv::Mat mz = cv::Mat::zeros(cv::Size(w,h),CV_8UC1); // 全零矩阵

【或者:Mat tmpdata = Mat::zeros(h, w, CV_8UC1);//h行w列的全0矩阵】


cv::Mat mo = cv::Mat::ones(cv::Size(w,h),CV_8UC1);  // 全1矩阵

【或者:Mat tmpdata = Mat::ones(h, w, CV_8UC1);//h行w列的全1矩阵】


cv::Mat me = cv::Mat::eye(cv::Size(w,h),CV_32FC1);  // 对角线为1的对角矩阵

【或者:Mat tmpdata = Mat::eye(h, w, CV_32FC1);//h行w列的对角矩阵】

 

3.Mat类型遍历与赋值

1)拷贝赋值

浅层拷贝:Mat B=A;B就是浅层拷贝A,B只拷贝了A的的头部和地址,当B被操作后A也随之改变。

深层拷贝:Mat A=imread("x.jpg"); Mat B=A.clone();B是开辟了新的内存完全的复制了A的内容,操作B不会对A造成影响。

 

2)将数据类型为U16的dataU16赋值给数据类型为u8的dataU8(数据类型转换).

    Mat dataU16 = Mat(Size(w, h), CV_16UC1);

    Mat dataU8 = Mat(Size(w, h), CV_8UC1);

    U16* pxvecU16 = dataU16.ptr<U16>(0);
    U8* pxvecU8 = dataU8.ptr<U8>(0);
    for (int i = 0; i < dataU16.rows; i++)
    {
        pxvecU16 = dataU16.ptr < U16>(i);
        pxvecU8 = dataU8.ptr<U8>(i);
        for (int j = 0; j < dataU16.cols; j++)
        {
            pxvecU8[j] = (U8)pxvecU16[j];
        }
    }

 

OpenCV—矩阵数据类型转换cv::convertTo

函数

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;

参数

m       – 目标矩阵。如果m在运算前没有合适的尺寸或类型,将被重新分配。

rtype – 目标矩阵的类型。因为目标矩阵的通道数与源矩阵一样,所以rtype也可以看做是目标矩阵的位深度。如果rtype为负值,目标矩阵和源矩阵将使用同样的类型。

alpha – 尺度变换因子(可选)。

beta   – 附加到尺度变换后的值上的偏移量(可选)。

描述

函数将源矩阵中的像素值转换为目标类型。最后会使用溢出保护函数saturate_cast<> ,以避免转换过程中可能出现的溢出。函数执行如下运算:

示例

在应用分水岭算法分割图像时,标记图像为32位有符号整型CV_32S变量(以便定义超过255个标签,每个值标记一类物体,如255标记目标,128标记背景,0标记未知等等)构成的矩阵markers,想要将标记图像显示出来必须转换其数据类型。

markers.convertTo(tmp,CV_8U,255,255);

将矩阵markers转换为CV_8U类型的矩阵tmp:tmp(x,y)= markers(x,y)*255+255.这样,将图像做线性变换,使值为-1的像素变为0(-1*255+255=0)。值大于255的像素将赋值为255,这是因为CV32S转换为无符号CV_8U时,应用了饱和度运算。具体应用参看分水岭算法的相关博文。

如果scale=1,shift=0,则不进行比例缩放。
如果输入数组与输出数组的类型相同,则函数可以被用于缩放和平移矩阵或图像;

例:cv::Mat src, src_f;
image.convertTo(src_f, CV_32F, 1.0/255, 0);
图像大小没有变化,但是类型又UINT8变为了FLOAT32位.

 

 

 

openCV Mat初始化

这次来记一下自己对Mat类的理解,供交流

    首先,使用Mat就不需要为其手动分配内存大小,最后也不需要手动释放它。但是我们在使用openCV函数的时候,还是要手动分配其输入数据。
    第二点,Mat本质是由两部分数据组成的类,矩阵头(header)和指针Pointer,矩阵头主要是包含矩阵的大小,存储方式,存储地址等信息,指针中存储了指向存储图像像素值矩阵的指针。
    一个常用的Mat类的构造函数,但是要知道,Mat类的有很多重载的构造函数

int main()
{
    Mat M(2, 2, CV_8UC3, cv::Scalar::all(1));
    //前两个参数时指矩阵的行数和列数,
    //第3个参数时重点,表示矩阵的数据类型,接下来会详细讲解
    //第4个是对每个像素值赋初值,这个代码就是把每个通道的像素值都
    //都赋值1.,如果是Scalsr(255,0,0),就是将255,0,0分别赋予每个像素点的3个通道。
    cout << "M=" << endl << M << endl;
    system("pause");
    return 0;
}

    阵列的数据类型说明
    阵列的数据类型定义了为阵列的每个元素(图片中的像素)通道数和每个通道上表示像素值得比特数(位数)。任何阵列的元素都应该有下面数据类型的一种:
    单通道阵列
    CV_8U:

    CV_8U (8 bit 无符号整数)
    CV_8S (8 bit 有符号整数)
    CV_16U(16 bit 无符号整数)
    CV_16S (16 bit 有符号整数)
    CV_32S (32 bit 有符号整数)
    CV_32F (32 bit 浮点数)
    CV_64F (64 bit 浮点数)
    举例来说:下图展示了一个使用8 bit无符号整数的单通道阵列。因为数据类型是8 bit无符号整数,因此这个阵列的每个元素为0-255的值
    对应存储图为
    这里写图片描述

    多通道阵列(最大支持512个通道)

    CV_8UC1 (单通道阵列,8 bit 无符号整数)
    CV_8UC2 (2通道阵列,8 bit 无符号整数)
    CV_8UC3 (3通道阵列,8 bit 无符号整数)
    CV_8UC4 (4通道阵列,8 bit 无符号整数)
    CV_8UC(n) (n通道阵列,8 bit 无符号整数 (n 可以从 1 到 512) )
    下图展示了一个使用8 bit 无符号整数的3通道阵列。因为数据类型是8 bit无符号整数,因此这个阵列的每个元素为0-255的值。由于是3通道阵列,所以阵列由带有3个元素的元组组成,第一个元组是{54, 0, 34},第二个元组是 {58, 78, 185} ,以此类推。

这里写图片描述

对上面的数据类型使用举例
Mat image(3,5,CV_32F);
Mat image(3,5CV_64FC(5));
Mat image(Size(100,200),CV16UC2);

-还可能会遇到这个表达,IPlImage*,这个表达式C语言操作OPENCV的数据结构,地位相当于Mat。
Mat(const IplImage* img, bool copyData=false);
可以很好的将IplImage*转换为Mat
还有一种定义也可以转换

IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat

    还要注意Mat类使用了引用技术机理,简单讲,就是在拷贝Mat类的对象的时候,只是将矩阵头和指针复制,而复制后两个对象指针还是指向同一块矩阵数据区。如果要将数据矩阵也复制,必须使用copyTo()或者clone()函数。
    可以用下图来帮助理解
    这里写图片描述

Mat A,C;
A=imread("1.jpg",type);
Mat B(A);//拷贝构造函数
C=A;//直接是赋值运算

代码中的所有Mat对象最终都指向同一个也是唯一一个数据矩阵。虽然它们的信息头不同,但通过任何一个对象所做的改变也会影响其它对象。实际上,不同的对象只是访问相同数据的不同途径而已。
如果要将数据区一起赋值,就要这样,如下

Mat F=A.clone();
Mat G;
A.copyTo(G);

现在改变 F 或者 G 就不会影响 Mat 信息头所指向的矩阵。 所以说Mat 不但是一个很赞的图像容器类,它同时也是一个通用的矩阵类,所以可以用来创建和操作多维矩阵。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[学opencv]opencv Mat类型初始化,遍历,赋值 的相关文章

  • 使用opencv+picamera流IO用树莓派捕获视频

    我使用 Raspberry 来简单地显示一个视频 目前仅此 为此 我必须使用 opencv cv2 我尝试了很多解决方案 但现在我想使用 Picamera 库捕获视频 我将向您展示我的代码 import io import time imp
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • OpenCV 中的 Gabor 内核参数

    我必须在我的应用程序中使用 Gabor 过滤器 但我不知道这个 OpenCV 方法参数值 我想对虹膜进行编码 启动 Gabor 过滤器并获取特征 我想对 12 组 Gabor 参数值执行此操作 然后我想计算 Hamming Dystans
  • 如何将 Opencv VideoWriter 与 GStreamer 结合使用?

    我正在尝试使用 Opencv VideoWriter 传输 h264 流 以使用 VideoCapture 将其传输到网络上的另一台电脑上 但是 我被困在 VideoWriter 上 执行此代码会返回错误 并且 out isOpened 始
  • OpenCV:将垫子除以标量的最简单方法是什么

    我认为标题中已经包含了很多内容 显然我可以迭代和划分 但我认为有一种内置的方法 我看见cvConvertScale但这不适用于类型cv Mat 我知道标量乘法的缩放运算 cv Mat M float alpha cv Mat Result
  • 如何绘制每个分割对象的轮廓

    我应用分水岭分割来检测触摸对象 这样做效果很好 现在 我想绘制每个对象的轮廓 这样我就可以获得它们的长度 面积 矩等 但是分割结果中的对象仍然是触摸的 所以 我没能画出每一个的轮廓 如何绘制每个对象的轮廓 include
  • 寻找两个框架之间的变换

    我有来自视频源的两个连续帧 并且我使用 FAST 算法检测这两个帧的关键点 我使用平方差之和法 SSD 来匹配关键点 所以基本上我已经匹配了两个框架之间的关键点 现在我想根据匹配的关键点集计算两个帧之间的仿射变换 缩放 旋转 平移 我知道如
  • Python 2.7从非默认目录打开多个文件(对于opencv)

    我在 64 位 win7 上使用 python 2 7 并拥有 opencv 2 4 x 当我写 cv2 imread pic 时 它会在我的默认 python 路径中打开 pic 即C Users Myname 但是我如何设法浏览不同的目
  • 通过 cmake 链接作为外部项目包含的 opencv 库[重复]

    这个问题在这里已经有答案了 我对 cmake 比较陌生 经过几天的努力无法弄清楚以下事情 我有一个依赖于 opencv 的项目 它本身就是一个 cmake 项目 我想静态链接 opencv 库 我正在做的是我的项目中有一份 opencv 源
  • OpenCV OpenNI 校准kinect

    我使用 home 通过 kinect 进行捕捉 capture retrieve depthMap CV CAP OPENNI DEPTH MAP capture retrieve bgrImage CV CAP OPENNI BGR IM
  • 如何将本机库链接到 IntelliJ 中的 jar?

    我正在尝试在 IntelliJ 中设置 OpenCV 但是我一直在弄清楚如何告诉 IntelliJ 在哪里可以找到本机库位置 在 Eclipse 中 添加 jar 后 您可以在 Build Config 屏幕中设置 Native 库的位置
  • 多线程中的 OpenCV CascadeClassifier C++ 接口

    我想在多个线程中使用 CascadeClassifier 对象运行 OpenCV C 接口 我的程序的工作方式是我的主线程将 some file xml 加载到 CascadeClassifier 对象中 生成三个或更多线程并向它们传递级联
  • CMake:编译 OpenCV 时未找到 CUDA 库

    我正在 Windows 上使用 CMAKE 编译支持 CUDA 的 OpenCV 3 0 0 当我点击 配置 时 出现如下错误 CMake Error The following variables are used in this pro
  • 从图像中提取特定文本关联值

    我有一个图像 我想从图像中提取键和值对的详细信息 例如 我想提取 MASTER AIRWAYBILL NO 的值 我已编写使用 python opencv 和 OCR 从图像中提取整个文本 但我不知道如何从图像的整个结果文本中仅提取 MAS
  • HOGDescriptor 带有视频来识别物体

    不幸的是 我既是 python 又是 openCV 初学者 所以如果问题很愚蠢 请原谅我 我正在尝试使用cv2 HOGDescriptor识别视频中的物体 我关心的是逐帧识别 即没有跟踪等 这是我正在做的事情 我读了视频 目前是 mpg 通
  • OpenCV C++ 多线程

    我在 4 个不同的 Mat 对象上调用了 4x 这个 opencv 图像处理函数 void processBinary Mat binaryMat image processing 我想要对其进行多线程处理 以便所有 4 个方法调用同时完成
  • 我如何知道在 python 中使用 OpenCV 检测到的白色区域的位置?

    例如 在这段代码中 我过滤了视频源以显示白色区域 我如何知道他们的位置 坐标 x y import cv2 import numpy as np cap cv2 VideoCapture 0 while 1 frame cap read h
  • 如何使用 BoW 正确训练 OpenCV SVM

    我无法训练 SVM 识别我的对象 我正在尝试使用 SURF Bag Of Words SVM 来做到这一点 我的问题是分类器没有检测到任何东西 所有结果都是0 这是我的代码 Ptr
  • 在opencv中找到物体的凸包?

    我是根据教程写的here http docs opencv org doc tutorials imgproc shapedescriptors hull hull html但我无法获得图像的凸包 我使用的是教程中所示的类似手部图像 我得到
  • python - opencv - 将像素从 bgr 转换为 hsv

    img cv2 imread example jpg img hsv cv2 cvtColor img cv2 COLOR BGR2HSV lower mask 0 10 lower red np array 0 50 50 upper r

随机推荐

  • failed to find plugin “flannel” in path [/opt/cni/bin],k8sNotReady解决方案

    问题 由于k8s安装master一直处于NotReady状态查看日志出现 failed to find plugin flannel in path opt cni bin 日志信息 Nov 04 00 35 47 k8s node1 ku
  • [技术讨论]STM32三种库函数的分析和比较

    STM32库函数可以分为标准库函数 HAL库函数 LL库函数 你问我为什么不说寄存器开发 以为太过于底层 非一般高手驾驭不了 我只是个小菜 所以对于寄存器开发不敢妄自议论 1 标准库函数 标准库函数是C语言的标准库函数 包括stdio h
  • Chisel教程——14.(完结篇)Scala和Chisel中的数据类型

    完结篇 Scala和Chisel中的数据类型 完结篇开头的碎碎念 这是这个系列的最后一篇文章了 官方的Chisel Bootcamp中后面还有FIRRTL相关的内容 但设计一个RISC V CPU这样的目标 靠本系列文章讲述的内容已经足够了
  • 牛客网 第一个只出现一次的字符

    牛客网 第一个只出现一次的字符 时间限制 1秒 空间限制 32768K 热度指数 198167 本题知识点 字符串 算法知识视频讲解 题目描述 在一个字符串 0 lt 字符串长度 lt 10000 全部由字母组成 中找到第一个只出现一次的字
  • numpy log随机产生非常奇怪的数字(np.log的大坑)

    背景 有一批信号数据要送到网络里训练 训练之前为了统一量纲 首先根据方差和均值做了一次标准化 然后求了一次能量 20 log10 x 也就是说送进网络里的其实是一个能量谱 但是训练过程中经常蹦出来一些莫名其妙的数值 理论上我的数据标准化以后
  • Python tkinter自定义多选下拉列表框

    Python tkinter 自定义多选下拉列表框 困扰了我好久 终于在stackoverflow上找到了答案 废话不多说 直接上代码 加滚动条和全选传送门 Python tkinter自定义多选下拉列表框 带滚动条 全选 demo py文
  • 【C++笔试强训】第三十二天

    C 笔试强训 博客主页 一起去看日落吗 分享博主的C 刷题日常 大家一起学习 博主的能力有限 出现错误希望大家不吝赐教 分享给大家一句我很喜欢的话 夜色难免微凉 前方必有曙光 选择题 第一题 在计算机网络中 TCP和UDP协议的相似之处是
  • android如何设置自适应大小的背景图片,Android 背景图片自适应方案

    在做移动中间件的过程中 遇到了背景图片自适应的问题 比如一个Button的背景图片 如何让一张图片能够在不同高宽的场景下做到不失真 在做移动中间件的过程中 遇到了背景图片自适应的问题 比如一个Button的背景图片 如何让一张图片能够在不同
  • element ui 表格字段boolean 不显示

    如题后端返回的list 中有值 表格缺没显示 加一个template将true 和false 转为想要的字段即可 这里是三目
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Unity3D里使用自己的dll

    首先 我们需要新建一个类库项目 可以使用Visual Studio或者Monodevelop来做 我这里是使用vs2012来创建 选择好项目类型 写好项目名称 新生成的项目里面默认有一个Class1类 可以通过在解决方案资源管理器里面进行重
  • python类中的main函数_在Python中定义Main函数

    码农那点事儿 关注我们 一起学习进步 源 python程序员 目录 Python中的基本main 函数 Python中的执行模式 基于命令行执行 导入模块或解释器 Main函数的最佳实践 将大部分代码放入函数或类中 使用 name 控制代码
  • 如何搭建mmaction环境,手动安装MMCV

    1 创建虚拟环境并激活 conda create n open mmlab python 3 7 y conda activate open mmlab 2 安装cudatoolkit和cudnn 2 1 查看cudnn版本 conda s
  • Android onCreateOptionsMenu方法是什么时候调用的 ?

    onCreateOptionsMenu是在第一次menu显示的时候调用的 也就是你第一次点击menu按钮 这个时候 你xml配置的menu就会被加载进来 之后你还想更新menu信息 可以使用onPrepareOptionsMenu 也就是从
  • STM32F103C8T6单片机IAP升级

    关于IAP升级的方法和原理 网上已经有很多资料了 这块就不再说了 现在就将bootloader和app配置方法整理如下 APP程序就是一个简单的LED闪烁 APP设置为从FLASH中启动 STM32F103C8T6单片机flash有64K
  • QT风格(QStyle):绘制控件风格设置--QStyleOption

    QStyleOption是风格的设置类 定义了最基本的绘制控件所需的信息 绘制不同控件时 控件所使用的设置类继承QStyleOption 且OptionType值不同 如绘制按钮的风格设置类QStyleOptionButton继承QStyl
  • 记录es几个问题,增删改查,索引创建

    一 es版本 依赖
  • Echarts开发人物关系网络图

    引言 人物关系可视化是将人与人之之间通过某属性进行连接而形成的关系网络 通过可视化技术展现出来 而baidu的Echarts是一款非常敏捷 迅速 酷炫的js可视化工具 1 Echarts介绍 ECharts 一个纯 Javascript 的
  • 2021年连云港高考成绩查询,2021年连云港高考状元是谁分数多少分,历年连云港高考状元名单...

    2020年连云港一年一度的高考考试已经结束 今年连云港高考状元是谁呢 连云港高考状元出自哪个高中学校 文理科分数是多少分 一起来了解 一 2020年连云港高考状元名单资料 2020年连云港高考状元名单和学校相关信息 截至目前发文时间 官方暂
  • [学opencv]opencv Mat类型初始化,遍历,赋值

    1 opencv Mat类型定义 cv Mat a cv Size w h CV 8UC1 单通道 cv Mat b cv Mat cv Size w h CV 8UC3 3通道每个矩阵元素包含3个uchar值 对于维数较小的Mat类型 直