You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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行:
    cv::Mat single_row = src.row(n);
    
    注意:这些新的Mat头和原矩阵共享内存,修改roi的内容会直接影响原矩阵!如果需要独立的数据,记得加.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:42:38