cv::Mat类的矩阵内容输出的各种格式的例子

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

功能描述

我们可以这样使用:cv::Mat M(...); cout << M;,直接将矩阵内容输出到控制台。

输出格式支持多种风格,包括OpenCV的原生格式、MATLAB风格、Python风格、NumPy风格、CSV格式以及C语言风格等。

用到的函数

Mat::eye

cv::Mat::eye 是一个静态方法,用于创建一个单位矩阵(对角线上的元素为1,其余位置为0)的 cv::Mat 对象。这个方法使得初始化一个单位矩阵变得简单快捷。

原型
cpp 复制代码
cv::Mat eye(int rows, int cols, int type = CV_64F);
参数
  • rows:指定创建矩阵的行数。
  • cols:指定创建矩阵的列数。
  • type:可选参数,指定了矩阵的数据类型,默认为 CV_64F,即64位浮点型。你可以根据需要选择其他类型,如 CV_8U 表示无符号8位整型,CV_32F 表示32位浮点型等。
示例
cpp 复制代码
cv::Mat identityMatrix = cv::Mat::eye(3, 3, CV_32F);

这段代码将创建一个3x3的浮点型单位矩阵。

函数Mat::Mat( int rows, int cols, int type )

使用 cv::Mat 的构造函数来初始化一个矩阵

原型
cpp 复制代码
cv::Mat::Mat(int rows, int cols, int type);
参数
  • int rows: 指定矩阵的行数。这是一个整数值,表示矩阵的高度。
  • int cols: 指定矩阵的列数。同样是一个整数值,表示矩阵的宽度。
  • int type: 确定矩阵中元素的数据类型以及(对于多通道数组而言)通道数。这个参数是关键,因为它定义了矩阵中每个元素是如何存储的。类型编码遵循OpenCV的类型系统,常见的类型有:
    CV_8U: 无符号8位整数(uchar,0-255)
    CV_8S: 有符号8位整数(char,-128到127)
    CV_16U: 无符号16位整数
    CV_16S: 有符号16位整数
    CV_32S: 有符号32位整数
    CV_32F: 32位浮点数(float)
    CV_64F: 64位双精度浮点数(double)
    对于多通道数组(如RGB图像),在上述类型后面加上"Cn",其中n表示通道数。例如,CV_8UC3 表示无符号8位,3通道(常用作BGR图像)。因此,type 参数不仅指定了数据类型,还隐含了数组是否为多通道以及通道数。

randu函数

生成单个均匀分布的随机数或随机数数组。

此非模板函数变体将矩阵dst填充来自指定范围的均匀分布随机数:

low c ≤ dst ( I ) c < high c \texttt{low} _c \leq \texttt{dst} (I)_c < \texttt{high} _c lowc≤dst(I)c<highc

参数

-参数 dst 输出随机数数组;该数组必须预先分配.

-参数 low 生成随机数的包含下限.

-参数 high 生成随机数的不包含上限.

代码示例

cpp 复制代码
/*
 *
 *该程序演示了cv::Mat类的串行输出功能,
 *也就是说,你现在可以这样使用:cv::Mat M(...); cout << M;,直接将矩阵内容输出到控制台。
 *输出格式支持多种风格,包括OpenCV的原生格式、MATLAB风格、Python风格、NumPy风格、CSV格式以及C语言风格等。
 *
 */

#include "opencv2/core.hpp"
#include <iostream>
using namespace std;
using namespace cv;


int main( int argc, char** argv )
{
    Mat I                  = Mat::eye( 4, 4, CV_64F );
    I.at< double >( 1, 1 ) = CV_PI;
    cout << "I = \n" << I << ";" << endl << endl;
    Mat r = Mat( 10, 3, CV_8UC3 );
    randu( r, Scalar::all( 0 ), Scalar::all( 255 ) );
    cout << "r (默认风格) = \n" << r << ";" << endl << endl;
    cout << "r (matlab风格) = \n" << format( r, Formatter::FMT_MATLAB ) << ";" << endl << endl;
    cout << "r (python风格) = \n" << format( r, Formatter::FMT_PYTHON ) << ";" << endl << endl;
    cout << "r (numpy风格) = \n" << format( r, Formatter::FMT_NUMPY ) << ";" << endl << endl;
    cout << "r (csv风格) = \n" << format( r, Formatter::FMT_CSV ) << ";" << endl << endl;
    cout << "r (c风格) = \n" << format( r, Formatter::FMT_C ) << ";" << endl << endl;
    Point2f p( 5, 1 );
    cout << "p = " << p << ";" << endl;
    Point3f p3f( 2, 6, 7 );
    cout << "p3f = " << p3f << ";" << endl;
    vector< float > v;
    v.push_back( 1 );
    v.push_back( 2 );
    v.push_back( 3 );
    cout << "shortvec = " << Mat( v ) << endl;
    vector< Point2f > points( 20 );
    for ( size_t i = 0; i < points.size(); ++i )
        points[ i ] = Point2f( ( float )( i * 5 ), ( float )( i % 7 ) );
    cout << "points = " << points << ";" << endl;
    return 0;
}

运行结果

bash 复制代码
I = 
[1, 0, 0, 0;
 0, 3.141592653589793, 0, 0;
 0, 0, 1, 0;
 0, 0, 0, 1];

r (默认风格) = 
[ 91,   2,  79, 179,  52, 205, 236,   8, 181;
 239,  26, 248, 207, 218,  45, 183, 158, 101;
 102,  18, 118,  68, 210, 139, 198, 207, 211;
 181, 162, 197, 191, 196,  40,   7, 243, 230;
  45,   6,  48, 173, 242, 125, 175,  90,  63;
  90,  22, 112, 221, 167, 224, 113, 208, 123;
 214,  35, 229,   6, 143, 138,  98,  81, 118;
 187, 167, 140, 218, 178,  23,  43, 133, 154;
 150,  76, 101,   8,  38, 238,  84,  47,   7;
 117, 246, 163, 237,  69, 129,  60, 101,  41];

r (matlab风格) = 
(:, :, 1) = 
 91, 179, 236;
239, 207, 183;
102,  68, 198;
181, 191,   7;
 45, 173, 175;
 90, 221, 113;
214,   6,  98;
187, 218,  43;
150,   8,  84;
117, 237,  60
(:, :, 2) = 
  2,  52,   8;
 26, 218, 158;
 18, 210, 207;
162, 196, 243;
  6, 242,  90;
 22, 167, 208;
 35, 143,  81;
167, 178, 133;
 76,  38,  47;
246,  69, 101
(:, :, 3) = 
 79, 205, 181;
248,  45, 101;
118, 139, 211;
197,  40, 230;
 48, 125,  63;
112, 224, 123;
229, 138, 118;
140,  23, 154;
101, 238,   7;
163, 129,  41;

r (python风格) = 
[[[ 91,   2,  79], [179,  52, 205], [236,   8, 181]],
 [[239,  26, 248], [207, 218,  45], [183, 158, 101]],
 [[102,  18, 118], [ 68, 210, 139], [198, 207, 211]],
 [[181, 162, 197], [191, 196,  40], [  7, 243, 230]],
 [[ 45,   6,  48], [173, 242, 125], [175,  90,  63]],
 [[ 90,  22, 112], [221, 167, 224], [113, 208, 123]],
 [[214,  35, 229], [  6, 143, 138], [ 98,  81, 118]],
 [[187, 167, 140], [218, 178,  23], [ 43, 133, 154]],
 [[150,  76, 101], [  8,  38, 238], [ 84,  47,   7]],
 [[117, 246, 163], [237,  69, 129], [ 60, 101,  41]]];

r (numpy风格) = 
array([[[ 91,   2,  79], [179,  52, 205], [236,   8, 181]],
       [[239,  26, 248], [207, 218,  45], [183, 158, 101]],
       [[102,  18, 118], [ 68, 210, 139], [198, 207, 211]],
       [[181, 162, 197], [191, 196,  40], [  7, 243, 230]],
       [[ 45,   6,  48], [173, 242, 125], [175,  90,  63]],
       [[ 90,  22, 112], [221, 167, 224], [113, 208, 123]],
       [[214,  35, 229], [  6, 143, 138], [ 98,  81, 118]],
       [[187, 167, 140], [218, 178,  23], [ 43, 133, 154]],
       [[150,  76, 101], [  8,  38, 238], [ 84,  47,   7]],
       [[117, 246, 163], [237,  69, 129], [ 60, 101,  41]]], dtype='uint8');

r (csv风格) = 
 91,   2,  79, 179,  52, 205, 236,   8, 181
239,  26, 248, 207, 218,  45, 183, 158, 101
102,  18, 118,  68, 210, 139, 198, 207, 211
181, 162, 197, 191, 196,  40,   7, 243, 230
 45,   6,  48, 173, 242, 125, 175,  90,  63
 90,  22, 112, 221, 167, 224, 113, 208, 123
214,  35, 229,   6, 143, 138,  98,  81, 118
187, 167, 140, 218, 178,  23,  43, 133, 154
150,  76, 101,   8,  38, 238,  84,  47,   7
117, 246, 163, 237,  69, 129,  60, 101,  41
;

r (c风格) = 
{ 91,   2,  79, 179,  52, 205, 236,   8, 181,
 239,  26, 248, 207, 218,  45, 183, 158, 101,
 102,  18, 118,  68, 210, 139, 198, 207, 211,
 181, 162, 197, 191, 196,  40,   7, 243, 230,
  45,   6,  48, 173, 242, 125, 175,  90,  63,
  90,  22, 112, 221, 167, 224, 113, 208, 123,
 214,  35, 229,   6, 143, 138,  98,  81, 118,
 187, 167, 140, 218, 178,  23,  43, 133, 154,
 150,  76, 101,   8,  38, 238,  84,  47,   7,
 117, 246, 163, 237,  69, 129,  60, 101,  41};

p = [5, 1];
p3f = [2, 6, 7];
shortvec = [1;
 2;
 3]
points = [0, 0;
 5, 1;
 10, 2;
 15, 3;
 20, 4;
 25, 5;
 30, 6;
 35, 0;
 40, 1;
 45, 2;
 50, 3;
 55, 4;
 60, 5;
 65, 6;
 70, 0;
 75, 1;
 80, 2;
 85, 3;
 90, 4;
 95, 5];
相关推荐
jndingxin14 分钟前
OpenCV 图形API(63)图像结构分析和形状描述符------计算图像中非零像素的边界框函数boundingRect()
人工智能·opencv·计算机视觉
暴龙胡乱写博客3 小时前
OpenCV---图像预处理(四)
人工智能·opencv·计算机视觉
正在走向自律4 小时前
AI数字人:繁荣背后的伦理困境与法律迷局(8/10)
人工智能·python·opencv·语音识别·ai数字人·ai伦理与法律
起个破名想半天了15 小时前
计算机视觉cv入门之答题卡自动批阅
人工智能·opencv·计算机视觉
鸿蒙布道师15 小时前
OpenAI为何觊觎Chrome?AI时代浏览器争夺战背后的深层逻辑
前端·人工智能·chrome·深度学习·opencv·自然语言处理·chatgpt
神奇侠202416 小时前
基于opencv和PaddleOCR识别身份证信息
opencv·paddleocr
满怀101518 小时前
【OpenCV图像处理实战】从基础操作到工业级应用
图像处理·人工智能·python·opencv·计算机视觉·编程入门
Tech Synapse18 小时前
人脸识别考勤系统实现教程:基于Face-Recognition、OpenCV与SQLite
人工智能·opencv·sqlite
jndingxin21 小时前
OpenCV 图形API(62)特征检测-----在图像中查找最显著的角点函数goodFeaturesToTrack()
人工智能·opencv·计算机视觉
鸿蒙布道师1 天前
AI硬件遭遇“关税风暴“:中国科技企业如何破局?
人工智能·科技·嵌入式硬件·深度学习·神经网络·opencv·机器人