cv::Mat初始化、赋值初始化与访问方式

初始化

常量赋值初始化

cv::Mat m = (cv::Mat_<float>(3,1) << 1, 2, 1.0);

指定类型和大小的二维数组

cv::Mat m(int rows, int cols, int type);
cv::Mat m(cv::Size sz, int type);

初始化值均为0

//二维数组,类型CV_8UC3, 初始化值cv::Scalar(100, 1, 1)
cv::Mat mat = cv::Mat::zeros(int rows, int cols, CV_8UC3, cv::Scalar(100, 1, 1)); 
cv::Mat mat = cv::Mat::ones(rows, cols, CV_32F); // 全1
cv::Mat mat = cv::Mat::eye(rows, cols, CV_64F); // 单位矩阵

数组赋值

char* data = new char[15];
cv::Mat m3(3, 5, CV_8UC1, data);
//或者, 数据位数对齐
cv::Mat m4(1, 5, CV_8UC3, data);
cv::Mat m6(cv::Size(3, 5), CV_8UC1, data);

指定类型多维数组

 7、指定类型的多维数组
    cv::Mat m(int ndims, const int* sizes, int type);
    int size[3] = { 3, 2, 2 };
    cv::Mat m7(3, size, CV_8UC1);
    //多维赋值
 		int matSize2[] = { 2,2,2 };//每一维元素的个数:8:行,10:列
    char* data2 = new char[8];
    cv::Mat m9(3, matSize2, CV_8UC1, data2);
//使用cv::Vec定义相同类型、大小为n的一维数组初始化
cv::Vec<float, 10> data1{ 1,2,3,4,5, 6,7,8,9,10 };
cv::Mat m1(data1, true);
//使用cv::Matx定义相同类型、大小为mxn的二维数组
cv::Matx<float, 2, 4> data2{ 1,2,3,4,5,6,7,7 };
cv::Mat m2(data2, true);
//使用STL vector定义相同类型的一维数组
std::vector<float> vec{1, 2, 3, 4, 5, 6};
cv::Mat m3(vec, true);

访问:

1、 at 访问
If matrix is of type CV_8U then use Mat.at<uchar>(y,x).
If matrix is of type CV_8S then use Mat.at<schar>(y,x).
If matrix is of type CV_16U then use Mat.at<ushort>(y,x).
If matrix is of type CV_16S then use Mat.at<short>(y,x).
If matrix is of type CV_32S then use Mat.at<int>(y,x).
If matrix is of type CV_32F then use Mat.at<float>(y,x).
If matrix is of type CV_64F then use Mat.at<double>(y,x).
If matrix is of type CV_8UC3 then use Mat.at<Vec3b>(y,x)[0]

优点:直观好理解
缺点:访问速度相对慢

2、ptr指针进行访问

cvInitMatHeader(&mat,3,2,CV_32FC3,data);//3通道
int nChannels = 3;
for(int x=0;x<mat.rows;++x){
	float *p = (float *)(mat.data.ptr + x*mat.step);//指向每一行的起始位置
for(int y=0;y<mat.cols;++y){
		float value[3];
	 value[0] = *(p+y*nChannels);
	 value[1] = *(p+y*nChannels+1);
	 value[2] = *(p+y*nChannels+2);
	 }
 }
OpenCV 中,你可以使用构造函数或者赋值运算符对 `cv::Mat` 进行初始化。 1. 构造函数初始化 `cv::Mat` 有多个构造函数,可以根据不同的参数类型来初始化矩阵。其中,最常用的构造函数是: ```c++ cv::Mat::Mat(int rows, int cols, int type) ``` 其中,`rows` 和 `cols` 分别代表矩阵的行数和列数,`type` 是矩阵的数据类型。例如,如果你想要创建一个大小为 3x3,数据类型为浮点数的矩阵,你可以使用以下代码: ```c++ cv::Mat mat1(3, 3, CV_32F); ``` 此外,你还可以使用另一个构造函数来创建指定大小、数据类型和初始值的矩阵: ```c++ cv::Mat::Mat(int rows, int cols, int type, const Scalar& s) ``` 其中,`s` 是一个 `cv::Scalar` 类型的参数,用于指定矩阵的初始值。例如,如果你想要创建一个大小为 3x3,数据类型为整数(`CV_32S`),且所有元素初始值为 1 的矩阵,你可以使用以下代码: ```c++ cv::Mat mat2(3, 3, CV_32S, cv::Scalar(1)); ``` 2. 赋值运算符初始化 你可以使用赋值运算符将一个已有的 `cv::Mat` 赋值给另一个 `cv::Mat`。例如,如果你已经有一个大小为 3x3,数据类型为浮点数的矩阵 `srcMat`,你可以使用以下代码将其赋值给另一个矩阵 `dstMat`: ```c++ cv::Mat dstMat = srcMat.clone(); // 复制 srcMat 的内容到 dstMat 中 ``` 在这个例子中,我们使用了 `clone()` 函数来复制 `srcMat` 的内容到 `dstMat` 中。你也可以使用 `=` 运算符来进行赋值,例如: ```c++ cv::Mat dstMat = srcMat; // 直接将 srcMat 的引用赋值给 dstMat ``` 需要注意的是,这种方式会使 `dstMat` 和 `srcMat` 指向同一个内存地址,因此任何对 `dstMat` 的修改都会影响 `srcMat`。因此,在实际使用中,建议使用 `clone()` 函数来复制矩阵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值