OpenCV Mat 实例详解 二

   构造函数

      OpenCV Mat实例详解一中已介绍了部分OpenCV Mat构造函数,下面继续介绍剩余部分构造函数。

Mat (const std::vector< _Tp > &vec, bool copyData=false);

vec 包含数据的vec对象

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

下面新建一个控制台应用程序,来演示,该构造函数的使用,在新建程序中加入如下代码:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    Mat tmp = Mat(vec, 1);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
        cout << "构建Mat对象成功!" << endl;
    waitKey(0);
    return 0;
    
}

试运行结果如下:

说明构建Mat对象成功。

Mat (const std::initializer_list< _Tp > list); 

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    initializer_list<uchar> list = { 1,2,3,4,5,6,7,8,9 };
    Mat tmp = Mat(list);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
        cout << "构建Mat对象成功!" << endl;
    waitKey(0);
    return 0;
    
}

试运行,结果如下:

Mat (const std::initializer_list< int > sizes, const std::initializer_list< _Tp > list);

sizes 构建对象维度参数(rows,cols)

list 包含数据对的list对象

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
    //Mat tmp = Mat(list);
    initializer_list<int> list1 = {3,4};
    Mat tmp = Mat(list1,list);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
    {
        cout << "构建Mat对象成功!" << endl;
        cout << "构建Mat对象rows:" << tmp.rows << endl;
        cout << "构建Mat对象cols:" << tmp.cols << endl;
    }
    waitKey(0);
    return 0;
    
}

试运行,结果如下:

Mat (const std::array< _Tp, _Nm > &arr, bool copyData=false);

arr含有构建Mat对象数据的array对象

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
    //Mat tmp = Mat(list);
    //initializer_list<int> list1 = {3,4};
    array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    Mat tmp = Mat(arr,1);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
    {
        cout << "构建Mat对象成功!" << endl;
        cout << "构建Mat对象rows:" << tmp.rows << endl;
        cout << "构建Mat对象cols:" << tmp.cols << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

Mat (const Vec< _Tp, n > &vec, bool copyData=true);

vec包含构建Mat对象数据的Vec对象

 copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
    //Mat tmp = Mat(list);
    //initializer_list<int> list1 = {3,4};
    //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(arr,1);
    Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    Mat tmp = Mat(vec, 1);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
    {
        cout << "构建Mat对象成功!" << endl;
        cout << "构建Mat对象rows:" << tmp.rows << endl;
        cout << "构建Mat对象cols:" << tmp.cols << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

Mat (const Matx< _Tp, m, n > &mtx, bool copyData=true);

mtx含有构建对象数据的Matx对象

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
    //Mat tmp = Mat(list);
    //initializer_list<int> list1 = {3,4};
    //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(arr,1);
    //Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(vec, 1);
    Matx<uchar,3,4> mtx = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    Mat tmp = Mat(mtx, 1);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
    {
        cout << "构建Mat对象成功!" << endl;
        cout << "构建Mat对象rows:" << tmp.rows << endl;
        cout << "构建Mat对象cols:" << tmp.cols << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

Mat (const Point_< _Tp > &pt, bool copyData=true); 

pt 含构建Mat数据的point对象,以point对象的x,y坐标作为Mat对象数据

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
    //Mat tmp = Mat(list);
    //initializer_list<int> list1 = {3,4};
    //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(arr,1);
    //Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(vec, 1);
    //Matx<uchar,3,4> mtx = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    Point_<int> point;
    point.x = 100;
    point.y = 100;
    Mat tmp = Mat(point, true);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
    {
        cout << "构建Mat对象成功!" << endl;
        cout << "构建Mat对象rows:" << tmp.rows << endl;
        cout << "构建Mat对象cols:" << tmp.cols << endl;
    }
    waitKey(0);
    return 0;
}

试运行,结果如下:

Mat (const Point3_< _Tp > &pt, bool copyData=true)

pt 含构建Mat数据的point对象,以point对象的x,y,z坐标作为Mat对象数据

copyData 是否拷贝数据,true— 拷贝数据,false—不拷贝数据。

修改上面示例代码,来演示该构造函数的用法,修改后的代码如下:

// OpenCVMatTest2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //vector<uchar> vec = {1,2,3,4,5,6,7,8,9};
    //Mat tmp = Mat(vec, 1);
    //initializer_list<uchar> list = {1,2,3,4,5,6,7,8,9,10,11,12};
    //Mat tmp = Mat(list);
    //initializer_list<int> list1 = {3,4};
    //array<uchar,12> arr = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(arr,1);
    //Vec<uchar,12> vec = { 1,2,3,4,5,6,7,8,9,10,11,12 };
    //Mat tmp = Mat(vec, 1);
    //Matx<uchar,3,4> mtx = { 1,2,3,4,5,6,7,8,9,10,11,12 };
   //Point_<int> point;
    Point3_<int> point;
    point.x = 100;
    point.y = 100;
    point.z = 100;
    Mat tmp = Mat(point, true);
    if (tmp.empty())
        cout << "构建Mat对象失败!" << endl;
    else
    {
        cout << "构建Mat对象成功!" << endl;
        cout << "构建Mat对象rows:" << tmp.rows << endl;
        cout << "构建Mat对象cols:" << tmp.cols << endl;
    }
    waitKey(0);
    return 0;
}

运行结果如下:

除了用上面的构造函数构建Mat对象外,还可以以下面方式构建并初始化Mat对象:

Mat tmp = (Mat_<uchar>(3,3)<< 1, 0, 0, 0, 1, 0, 0, 0, 1); 

Mat类的公共属性

 Mat类有一下公共属性:

MatAllocator *  allocator

int cols

uchar *  data

const uchar *  dataend

const uchar * datalimit

const uchar *  datastart

int  dims

int flags

int rows

MatSize  size

MatStep  step

UMatData *  u

Mat类对象的共公属性可以用.运算符访问.有部分属性已在前面的示例中使用过,这里就不再做介绍了。

        本篇 博文示例是基于OpenCV4.8(opencv目录位于d盘根目录下)及VS2022。示例源码已上传到CSDN,其链接为:https://download.csdn.net/download/billliu66/88835162

    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS之BFC

BFC概念 BFC&#xff08;Block Formatting Context&#xff09;即块级格式化上下文&#xff0c;是Web页面的可视CSS渲染的一部分。它是一个独立的渲染区域&#xff0c;让其中的元素在布局上与外部的元素互不影响。简单来说&#xff0c;BFC提供了一个环境&#xff0c;允许内部的…

LeetCode 0103.二叉树的锯齿形层序遍历:层序遍历 + 适时翻转

【LetMeFly】103.二叉树的锯齿形层序遍历&#xff1a;层序遍历 适时翻转 力扣题目链接&#xff1a;https://leetcode.cn/problems/binary-tree-zigzag-level-order-traversal/ 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往…

常见的单片机及其功能

在当今电子技术快速发展的时代&#xff0c;单片机作为核心组件&#xff0c;在各类电子项目和产品中扮演着至关重要的角色。它们的应用范围从简单的家用电器控制到复杂的工业自动化系统&#xff0c;几乎无处不在。接下来&#xff0c;我们将以轻松的语言&#xff0c;探讨几种广泛…

【AIGC】Stable Diffusion的采样器入门

在 Stable Diffusion 中&#xff0c;采样器&#xff08;Sampler&#xff09;是指用于生成图像的一种技术或方法&#xff0c;它决定了模型如何从潜在空间中抽样并生成图像。采样器在生成图像的过程中起着重要作用&#xff0c;影响着生成图像的多样性、质量和创造性。以下是对 St…

【蓝桥杯单片机入门记录】LED灯(附多个例程)

目录 一、LED灯概述 1.1 LED发光原理 1.2电路原理图 1.3电路实物图 1.4 开发板LED灯原理图 1.4.1共阳极LED灯操控原理&#xff08;本开发板&#xff09; &#xff08;非实际原理图&#xff0c;便于理解版本&#xff09;由图可以看出&#xff0c;每个LED灯的左边&#xf…

迎新年,送新手福利, 送2篇nhanes文章全套复现代码

美国国家健康与营养调查&#xff08; NHANES, National Health and Nutrition Examination Survey&#xff09;是一项基于人群的横断面调查&#xff0c;旨在收集有关美国家庭人口健康和营养的信息。 地址为&#xff1a;https://wwwn.cdc.gov/nchs/nhanes/Default.aspx 本次赠送…

搭建 blender python api 的外部开发环境

以下都是为了不直接在 blender 的 script ide 里写脚本而做&#xff0c;直接在 blender 里写的话就没什么参考意义了。 首先是2个blender的设置选项&#xff0c;建议开启&#xff0c;会比较方便。 开发选项启用后&#xff0c;你在一些菜单上右键的话&#xff0c;会多出来 在线…

adobe软件提示This non-genuine Adobe app will be disabled soon【软件版本】

因为电脑上级路由器装了小飞机&#xff0c;导致本机电脑ps等adobe的系列软件出现了 This non-genuine Adobe app will be disabled soon&#xff0c;烦人的狠&#xff0c;之前有写过一篇通过更改host的教程&#xff0c;现在已经失效了&#xff0c;今天为大家分享一个用软件来屏…

深度学习:Pytorch安装的torch与torchvision的cuda版本冲突问题与解决历程记录

今天不小心将conda环境中的一个pytorch环境中的torch包给搞混了&#xff0c;将其更新了一下&#xff0c;发生了一些问题&#xff1a; 当时运行了一下这个代码&#xff1a; pip install torchvision --upgrade 导致了环境中包的混乱&#xff1a; 只能说欲哭无泪&#xff0c;当…

.NET Core WebAPI中封装Swagger配置

一、创建相关文件 创建一个Utility/SwaggerExt文件夹&#xff0c;添加一个类 二、在Program中找到Swagger相关配置信息 三、添加方法&#xff0c;在Program中调用 在SwaggerExt类中添加方法&#xff0c;将相关配置添写入 /// <summary> /// swagger配置 /// </sum…

Docker 第十四章 : Docker 三剑客之 Machine

第十四章 : Docker 三剑客之 Machine 本章知识点: Docker Machine 是 Docker 三剑客之一,它是一个工具,允许用户在本地或远程机器上创建 Docker 主机。它简化了 Docker 环境的设置,特别是在不同的操作系统和云平台上。通过 Docker Machine,用户可以轻松地在虚拟机或物理…

计算机网络——多媒体网络

前些天发现了一个巨牛的人工智能学习网站 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; 跳转到网站 小程一言 我的计算机网络专栏&#xff0c;是自己在计算机网络学习过程中的学习笔记与心得&#xff0c;在参考相关教材&#xff0c;网络搜素…

c语言中的模拟多态性

在C语言中模拟多态性 多态性是面向对象编程中的一个核心概念&#xff0c;它允许我们通过一个共同的接口来操作不同的数据类型。虽然C语言是一种过程式语言&#xff0c;本身不直接支持面向对象的特性&#xff0c;如继承、封装和多态&#xff0c;但我们可以通过一些技巧来模拟这些…

1036 跟奥巴马一起编程 (15)

美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形。现在…

H5 粒子特效引导页源码

H5 粒子特效引导页源码 源码介绍&#xff1a;一款粒子特效引导页源码&#xff0c;带彩色文字和4个按钮。 下载地址&#xff1a; https://www.changyouzuhao.cn/10222.html

Word docx文件重命名为zip文件,解压后直接查看和编辑

一个不知道算不算冷的知识[doge]&#xff1a; docx格式的文件本质上是一个ZIP文件 当把一个.docx文件重命名为.zip文件并解压后&#xff0c;你会发现里面包含了一些XML文件和媒体文件&#xff0c;它们共同构成了Word文档的内容和格式。 例如&#xff0c;word/document.xml文件…

fgets的使用方法详解

fgets的使用 文章目录 fgets的使用前言&#xff08;吹水&#xff0c;不看也罢&#xff09;fgets 的基本语法使用示例fgets() 对输入的处理的特点gets() 与 fgets() 的主要区别 总结 前言&#xff08;吹水&#xff0c;不看也罢&#xff09; 鼠鼠今天在B站上大学的时候&#xff…

【阅读笔记】空域保边降噪《Side Window Filtering》

1、保边滤波背景 保边滤波器的代表包括双边滤波、引导滤波&#xff0c;但是这类滤波器有一个问题&#xff0c;它们均将待处理的像素点放在了方形滤波窗口的中心。但如果待处理的像素位于图像纹理或者边缘&#xff0c;方形滤波核卷积的处理结果会导致这个边缘变模糊。 基于这个…

gorm day9(结)

gorm day9 实体关联gorm会话 实体关联 自动创建、更新 在创建、更新数据时&#xff0c;GORM会通过Upsert自动保存关联及其引用记录。 user : User{Name: "jinzhu",BillingAddress: Address{Address1: "Billing Address - Address 1"},Ship…