opencv_cv::Mat的属性

文章详细介绍了如何使用cv::Mat进行图像处理,包括通过构造函数创建矩阵,如从数据指针或模型推理结果生成,以及获取矩阵尺寸。同时,讨论了cv::Mat的拷贝行为,如浅拷贝和深拷贝的差异。此外,还讲解了split和merge函数在分离和合并图像通道中的应用。
摘要由CSDN通过智能技术生成

cv::Mat的构造函数

#将img中的data()重新组成一个mat
unsigned char *pImgData;  
cv::Mat mat(height, width, CV_8UC3, (void*)pImgData);

#将模型推理的结果,多维float型数组,组成一个mat
std::vector<int> shapes={1,22600,6};
cv::Mat feat = cv::Mat(shapes, CV_32F, (float*)rawOutput);
获取该mat的尺寸
int size0=feat.size[0];
int size1=feat.size[1];
int size2=feat.size[2];

#新建一个值全为0的彩色mat
cv::Mat image(infer_h, infer_w, CV_8UC3, cv::Scalar(0, 0, 0));
#新建一个值全为0的灰度mat
cv::Mat mask(height, width, CV_8UC1, cv::Scalar(0));

cv::Mat的拷贝

// m声明并初始化
cv::Mat m1(m); // 拷贝构造函数,浅拷贝,仅是创建了Mat的头部分,m1与m共享数据区
cv::Mat m2 = m; // 重载运算符=,浅拷贝
cv::Mat m3 = m.clone(); // clone函数,深拷贝,m3与m有各自独立的数据区
cv::Mat m4;
m.copyTo(m4); // copyTo函数,深拷贝

判断图像是否为空

if (src.empty()) {
    cout << "打开错误" << endl;
    return -1;
  }

split和merge函数

void split(InputArray m, OutputArrayOfArrays mv);

void merge(InputArrayOfArrays mv, OutputArray dst);

通过split函数将cv::Mat分为多个通道

cv::Mat img = cv::imread(imgpath);
std::vector<cv::Mat> channels;
cv::split(img, channels);

通过merge函数将多个单通道的cv::Mat的指针组成一个3通道的cv::Mat

unsigned char* imageDataR;
unsigned char* imageDataG;
unsigned char* imageDataB;
cv::Mat img_r(height, width, CV_8UC1, imageDataR);
cv::Mat img_g(height, width, CV_8UC1, imageDataG);
cv::Mat img_b(height, width, CV_8UC1, imageDataB);
std::vector<cv::Mat> channels;
channels.push_back(img_b);
channels.push_back(img_g);
channels.push_back(img_r);
cv::Mat img;
cv::merge(channels, img);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值