环境 Windows,visual studio 15,opencv3.4.2,c++
1、例子1,初始化矩阵
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
Mat A(2, 2, CV_8UC1, Scalar(0, 0, 255));
cout << "A = " << endl << " " << A << endl << endl;
Mat B(2, 2, CV_8UC2, Scalar(0, 0, 255));
cout << "B = " << endl << " " << B << endl << endl;
Mat C(2, 2, CV_8UC3, Scalar(0, 0, 255));
cout << "C = " << endl << " " << C << endl << endl;
return 0;
}
创建一个2*2的矩阵,A矩阵的深度是1,B的深度是2,C的深度是3
创建的矩阵的 truew=deepth*w
其中CV_8UC1,CV_8UC2,CV_8UC3决定宽高之外的通道数,
其中8是每个数字占8位,
U是无符号字符型,
1,2,3是通道数
常用的数据格式
图片来自https://www.cnblogs.com/zvmxvm1991/p/7942881.html
2、例子2,初始化矩阵
int main()
{
Mat A(2, 2, CV_8UC1, Scalar(1));
cout << "A = " << endl << " " << A << endl << endl;
Mat B(2, 2, CV_8UC2, Scalar(1));
cout << "B = " << endl << " " << B << endl << endl;
Mat C(2, 2, CV_8UC3, Scalar(1));
cout << "C = " << endl << " " << C << endl << endl;
return 0;
}
仅修改了了Scalar中的数据,
结论,1、Scalar中的数据个数应该跟通道数匹配,否则0填充
2、第一个数字填充到第一个通道,第二个数字填充到第二个通道,第三个数字填充到第三个通道,类推
3、例子3,初始化矩阵
int main()
{
Mat A(2, 2, CV_8UC1);
cout << "A = " << endl << " " << A << endl << endl;
Mat B(2, 2, CV_8UC2);
cout << "B = " << endl << " " << B << endl << endl;
Mat C(2, 2, CV_8UC3);
cout << "C = " << endl << " " << C << endl << endl;
return 0;
}
如果构造函数没有Scalar,那么默认值是205
矩阵数据实际分布
图片来自:https://blog.youkuaiyun.com/duiwangxiaomi/article/details/93075571
4、例子4,矩阵赋值
int main()
{
Mat C(2, 2, CV_32FC3, Scalar());
cout << "C = " << endl << " " << C << endl << endl;
int kk = 0;
for (int i = 0; i<2; i++)
{
for (int j = 0; j<6; j++)
{
C.at<float>(i, j) = kk; //方法1
C.ptr<float>(i)[j] = kk; //方法2
kk = kk + 1;
}
}
cout << "C = " << endl << " " << C << endl << endl;
return 0;
}
矩阵读取的时候第一个参数是行,第二个参数列,数据列数=矩阵列数*通道个数