[OpenCV][C++编程] cv::mat的定义与赋值

这篇具有很好参考价值的文章主要介绍了[OpenCV][C++编程] cv::mat的定义与赋值。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0.在pro文件中添加opencv的库

0.1 INCLUDEPATH

可以通过在/目录下直接搜索opencv,确定opencv所在的目录:

INCLUDEPATH += \

 /usr/include/opencv4

0.2 LIBS

LIBS += \
 -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_ml
  • lopencv_core 是opencv的核心,
  • -lopencv_highgui包含读取图像和显示图像的函数
  • -lopencv_imgproc包含图像处理函数(非机器学习方法),例如线性滤波,边缘检测、膨胀腐蚀、检测直线、仿射变换等等。
  • -lopencv_ml包含机器学习算法(贝叶斯分类、k-近邻分类器、SVM、决策树、EM算法等待)

1. cv::Mat的创建

1.1 默认的构造函数

可以直接采用下面的形式:cv::Mat mat(sizeRow,sizeCol,type)定义mat变量的尺寸和类型。

type可选项有CV_8UC1、CV_8SC1等等。它的数据含义是:
CV_数据类型_数据的通道数量

  • cv的类型编号定义:

#define CV_8U 0

#define CV_8S 1

#define CV_16U 2

#define CV_16S 3

#define CV_32S 4

#define CV_32F 5

#define CV_64F 6

#define CV_16F 7

通过mat.type()可以输出mat变量的类型。

C1,C2,C3,C4代表数据通道数:

  • C1:灰度图像,单个数字
  • C2:每一个可以表示一个二维向量
  • C3:RGB图像
  • C4:PNG格式图像除了RGB,还有一个透明度通道。
  

#include <QCoreApplication>

#include<opencv/cv.h>

#include<QDebug>

#include<iostream>

int main(int argc, char *argv[])

{

 //QCoreApplication a(argc, argv);

  

// cv::Mat mat1 = cv::Mat_<float>(3,3);

// std::cout<<"mat1 size is " << mat1.size<<std::endl;

// std::cout<<"mat1 type is " << mat1.type()<<std::endl;

  

 cv::Mat mat2(4,4,CV_8UC1);

 std::cout<<"mat2 size is " << mat2.size<<std::endl;

 std::cout<<"mat2 type is " << mat2.type()<<std::endl;

  

 return 0;

}

输出结果为:

  
mat2 size is 4 x 4

mat2 type is 0

1.2使用mat_<变量类型>(变量尺寸)函数进行创建(推荐使用)

cv::Mat_<类型>(sizeRow,sizeCol)

例如下面的代码是创建了一个3*3的Mat变量,变量的类型都是float


#include <QCoreApplication>

#include<opencv/cv.h>

#include<QDebug>

#include<iostream>

int main(int argc, char *argv[])

{

 //QCoreApplication a(argc, argv);

 cv::Mat mat1 = cv::Mat_<float>(3,3);


 //std::cout<< "mat1:"<mat1<<std::endl ;

 std::cout<<"mat1 size is " << mat1.size<<std::endl;


 return 0;

}

输出的结果为:

  
mat1 size is 3 x 3

mat1 type is 5

1.3 构造一些特殊矩阵

生成零矩阵、全1矩阵、单位矩阵、对角矩阵。

  • cv::Mat::zeros()
  • cv::Mat::ones()
  • cv::Mat::eye()
  • cv::Mat::diag();
 cv::Mat mat2;

 mat2= cv::Mat::zeros(3,3,CV_16U);

 std::cout<<mat2<<std::endl;

 mat2= cv::Mat::ones(3,3,CV_16U);

 std::cout<<mat2<<std::endl;

 mat2= cv::Mat::eye(3,3,CV_16U);

 std::cout<<mat2<<std::endl;

结果:

  

[0, 0, 0;

0, 0, 0;

0, 0, 0]


[1, 1, 1;

1, 1, 1;

1, 1, 1]


[1, 0, 0;

0, 1, 0;

0, 0, 1]

1.4 克隆其他矩阵

同尺寸克隆,直接通过 mat.clone( )指令就可以了。被克隆的


 //从其他矩阵克隆

 cv::Mat mat2;

 mat2= cv::Mat::eye(3,3,CV_16U);

 cv::Mat mat3 = mat2.clone();

 std::cout<<mat3<<std::endl;

输出结果:

[1, 0, 0;

0, 1, 0;

0, 0, 1]

缩小尺寸克隆,需要

需要注意的是,直接赋值并不定于克隆:例如mat3 = mat2只是把mat2的头部指针赋值为mat3,修改mat2或者mat3中任意一个,其他一个都会跟着修改。而mat3= mat2.clone()则创建了完全独立的变量mat3。例如下面的代码,运行结果不一样。

[std::cout<<mat2<<std::endl;](<//从其他矩阵克隆  对比  直接赋值
    cv::Mat mat2;
    mat2= cv::Mat::eye(3,3,CV_16U);
    cv::Mat mat3 = mat2.clone();
    cv::Mat mat4 = mat2;
    std::cout%3C<"mat2:"<<std::endl<<mat2<<std::endl;

    mat4.at<uint16_t%3E(0,0) = 0;
    std::cout<<"mat2:"<<std::endl<<mat2<<std::endl;

    std::cout<<"mat3:"<<std::endl<<mat3<<std::endl;>)

结果:

mat2:

[1, 0, 0;

0, 1, 0;

0, 0, 1]

mat2:

[0, 0, 0;

0, 1, 0;

0, 0, 1]

mat3:

[1, 0, 0;

0, 1, 0;

0, 0, 1]

mat4和mat2是指向同一个地址,而mat3是单独地址。所以改变mat4的值后,mat2也改变了,而mat3不变。

1.5 基于其他mat变量建立更小尺寸的mat


 //基于某个mat变量,建立更小尺寸的mat,发现是共用指针的。

 cv::Mat mat2;

 mat2= cv::Mat::eye(5,5,CV_16U);

 std::cout<<"mat2:"<<std::endl<<mat2<<std::endl;

  

 cv::Mat mat3(mat2,cv::Range(0,3),cv::Range(0,3));

 std::cout<<"mat3:"<<std::endl<<mat3<<std::endl;

  

 std::cout<<"将mat3 的 (0,0)元素赋值为0"<<std::endl;

 mat3.at<uint16_t>(0,0) = 0;

 std::cout<<"mat2:"<<std::endl<<mat2<<std::endl;

结果:

mat2:

[1, 0, 0, 0, 0;

0, 1, 0, 0, 0;

0, 0, 1, 0, 0;

0, 0, 0, 1, 0;

0, 0, 0, 0, 1]

mat3:

[1, 0, 0;

0, 1, 0;

0, 0, 1]

将mat3 的 (0,0)元素赋值为0

mat2:

[0, 0, 0, 0, 0;

0, 1, 0, 0, 0;

0, 0, 1, 0, 0;

0, 0, 0, 1, 0;

0, 0, 0, 0, 1]

2.mat的赋值

2.1 针对某个点的赋值

通过 mat.at<变量类型>(numRow,numCol) = num;命令对mat变量中某个索引值进行赋值。例如在1.5中出现的赋值。

2.2在创建mat变量时赋值

在采用构造方式创建变量时,直接附在最后一个变量。
给矩阵中每个像素赋值的参数变量,例如Scalar(0, 0, 255)。_

cv::Mat a(2, 2, CV_8UC3, cv::Scalar(0,0,255));//创建一个3通道矩阵,每个像素都是0,0,255
cv::Mat a(2, 2, CV_8UC3, cv::Scalar(0,255));//创建一个2通道矩阵,每个像素都是0,255
cv::Mat a(2, 2, CV_8UC1, cv::Scalar(255));//创建一个单通道矩阵,每个像素都是255

2.3 采用枚举法赋值

这种赋值方式是将矩阵中所有的元素都一一枚举出,并用数据流的形式赋值给Mat类。具体赋值形式:

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

也可以把需要赋值的数写成列表

float a[8] = { 5,6,7,8,1,2,3,4 };
cv::Mat b = cv::Mat(2, 2, CV_32FC2, a);

2.4 循环赋值

与通过枚举法赋值方法相类似,循环法赋值也是对矩阵中的每一位元素进行赋值,但是可以不在声明变量的时候进行赋值,而且可以对矩阵中的任意部分进行赋值:文章来源地址https://www.toymoban.com/news/detail-698765.html

cv::Mat c = cv::Mat_<int>(3, 3); //定义一个3*3的矩阵
for (int i = 0; i < c.rows; i++) //矩阵行数循环
{
    for (int j = 0; j < c.cols; j++) //矩阵列数循环
    {
        c.at<int>(i, j) = i+j;
    }
}

到了这里,关于[OpenCV][C++编程] cv::mat的定义与赋值的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV buffer转cv::Mat

    void convertBuf2Mat(void* input_ptr, vx_uint32 width, vx_uint32 height, cv::Mat frame) {     // 计算亮度通道和色度通道的大小     size_t y_size = width * height;     size_t uv_size = y_size / 2;     // 创建一个只包含亮度通道的 cv::Mat 对象     cv::Mat y_channel(height, width, CV_8UC1, (unsigned char*)input_ptr);     // 设

    2024年02月07日
    浏览(32)
  • opencv学习(9):cv::Scalar、cv::Mat::zeros

            cv::Scalar是opencv的一个结构体,其定义如下:(c++中的结构体如下,可以存放1~4个数值。)         表示图像颜色时,单通道图像用下标[0]即可,三通道图像用下标[0]、[1]、[2]分别表示B、G、R通道         其中:                 白色:rgb(255,255,255)  

    2024年02月08日
    浏览(53)
  • 【debug】OpenCV出现问题:undefined reference to ‘cv::Mat::Mat()‘

    参考:动手学ROS2 分析原因: undefined reference to \\\'cv::Mat::Mat()\\\' 原因在于g++找不到库文件,解决方法就是我们帮助它定位到库文件的位置,并通过-L参数指定库目录,-l(小写L)指定库的名字。 解决方法: 在执行命令时添加后缀参数

    2024年02月08日
    浏览(43)
  • C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值]

    C# - Opencv应用(2) 之矩阵Mat使用[矩阵创建、图像显示、像素读取与赋值] 矩阵创建 图像显示与保存 像素读取与赋值 新建sample02项目,配置opencv4相关包,新建 .cs 进行测试 两种常用的图像遍历方式 灰度图操作 三通道图操作 完整代码

    2024年02月03日
    浏览(44)
  • OpenCV中cv::Mat矩阵的四种遍历

    at方法遍历 单通道 运行结果 at方法遍历 多通道 (下面这种方式,既能遍历,又能修改) 运行结果: 对比程序:(下面这种方式,只能遍历,不能修改) 运行结果 第一种写法 运行结果 更一般的写法:把里面的3改成矩阵的通道数 a.channels() ,如下: 运行结果 上面这种写法

    2024年02月13日
    浏览(49)
  • OpenCV:矩阵表达式:代数和cv::Mat

    OpenCV是一个强大的计算机视觉库,它提供了丰富的功能和工具,用于处理图像数据。在OpenCV中,矩阵是一种核心数据结构,而矩阵表达式则是一种强大的工具,用于在图像处理和计算机视觉任务中对矩阵进行代数运算。本文将深入探讨OpenCV中的矩阵表达式,以及它们与cv::Ma

    2024年01月19日
    浏览(40)
  • OpenCV - cv::Mat与unsigned char*数组或者float*数组相互转换,cv::Mat与std::vector的相互转换

    通常情况下,在同一个opencv项目传递cv::Mat可直接通过const cv::Mat img这种方式传递,但是如果需要进行跨语言传递,比如C++传递到C#或者C#传递到C++,那么通常这种情况下需要将cv::Mat转换为内存指针比如unsigned char指针或者float指针进行传递。 1.1 cv::Mat转换为unsigned char 数组、un

    2024年02月13日
    浏览(54)
  • cv库学习,一 Mat类矩阵的定义初始化

    1,由多维数组定义初始化Mat类矩阵;      double m[2][2]={{1.0,2.0},{3.0,4.0}};       Mat M(2,2,CV_64F,m); 2,构造函数定义法      Mat M(2,2,CV_32FC3,Scalar(100,200,300));       Mat M(2,2,CV_32FC2,Scalar(100,200));       Mat M(2,2,CV_8UC1,Scalar(100)); 3,   M.create(Size(10, 20), CV_32FC3); 在原有的M矩阵上修改大

    2023年04月24日
    浏览(37)
  • 【opencv之cv::Mat数据深拷贝和浅拷贝探讨】

    很多时候写程序除了一个强大的架构,细节也很重要,俗话说的话细节决定成败嘛,在使用cv::Mat做图片处理的时候发现,这个数据类型存在深拷贝和浅拷贝的情况,遂想一探究竟。 假设这里原图数据为matSrc : copy方法 结果 matA = matSrc 浅拷贝 matB(matSrc ) 浅拷贝 matC = matSrc .cl

    2024年02月13日
    浏览(35)
  • jni-Android Bitmap与OpenCV cv::Mat互转

    在封装so库的时候,底层c++代码的实现使用了OpenCV对图片进行操作,而Android中从摄像头中获取到的图片数据类型是Bitmap数据类型的,所以这里就避免不了做数据类型的转换。转换的方案主要有两种, 一种是封装的JNI接口方法直接接收cv::Mat数据类型的参数, 第二种是JNI方法的

    2024年02月01日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包