- 操作系統: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 對象。這個方法使得初始化一個單位矩陣變得簡單快捷。
原型
cv::Mat eye(int rows, int cols, int type = CV_64F);
參數
- rows:指定創建矩陣的行數。
- cols:指定創建矩陣的列數。
- type:可選參數,指定了矩陣的數據類型,默認為 CV_64F,即64位浮點型。你可以根據需要選擇其他類型,如 CV_8U 表示無符號8位整型,CV_32F 表示32位浮點型等。
示例
cv::Mat identityMatrix = cv::Mat::eye(3, 3, CV_32F);
這段代碼將創建一個3x3的浮點型單位矩陣。
函數Mat::Mat( int rows, int cols, int type )
使用 cv::Mat 的構造函數來初始化一個矩陣
原型
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 生成隨機數的不包含上限.
代碼示例
/***該程序演示了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;
}
運行結果
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, 23045, 6, 48, 173, 242, 125, 175, 90, 6390, 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];