OpenCV技术问询:创建子矩阵cv::Mat头与向量移位复制
我来帮你搞定这两个OpenCV的问题啦~
问题1:为已分配的cv::Mat矩阵特定区域创建对应的cv::Mat头
要给已经分配好数据的cv::Mat创建指向特定区域的Mat头,核心是共享原数据(不用复制,效率拉满),常用这几种方法:
- 矩形区域用
Rect构造:如果要取原矩阵src中左上角坐标(x,y)、宽w高h的矩形区域,直接写:cv::Mat roi(src, cv::Rect(x, y, w, h)); - 行/列范围用
rowRange/colRange:比如取第start_row到end_row(左闭右开)的所有行:
取第cv::Mat row_roi = src.rowRange(start_row, end_row);start_col到end_col的所有列同理:cv::Mat col_roi = src.colRange(start_col, end_col); - 单独一行/一列用
row()/col():比如取第n行:
注意:这些新的Mat头和原矩阵共享内存,修改roi的内容会直接影响原矩阵!如果需要独立的数据,记得加cv::Mat single_row = src.row(n);.clone()。
问题2:列向量右移后复制到多一个元素的行向量
你的需求是把列向量的值“右移”后放到更长的行向量里,也就是行向量预留第一个位置,后面填充原列向量的数据对吧?我给你完善并解释代码:
int yDimLen = 26; // 自定义的列向量行数 cv::Mat columnVector(yDimLen, 1, CV_32SC1, cv::Scalar(13)); // 26行1列的列向量,初始值13 cv::Mat rowVector(1, yDimLen + 1, CV_32SC1, cv::Scalar(0)); // 1行27列的行向量,初始值0 // 1. 先把列向量转成行向量(维度匹配才能复制到行向量区域) cv::Mat rowFromCol = columnVector.t(); // t()是转置操作,得到1行26列的行向量 // 2. 把转置后的行向量复制到rowVector的第1列到第26列(索引1到26) rowFromCol.copyTo(rowVector(cv::Rect(1, 0, yDimLen, 1))); // 验证输出(可选) for (int c = 0; c < rowVector.cols; c++) { std::cout << rowVector.at<int>(0, c) << " "; } std::cout << std::endl;
关键步骤解释:
- 转置操作
columnVector.t():列向量直接复制到行向量区域会维度不匹配,转置后变成同是行维度的矩阵才能正常复制 cv::Rect(1, 0, yDimLen, 1):指定目标区域的左上角列索引1、行索引0,宽度26(和原列向量行数一致)、高度1(行向量只有1行),正好实现“右移一位”的效果
内容的提问来源于stack exchange,提问作者Hanaa
相关产品推荐
相关产品推荐

