C++,cv::Mat 矩阵的拷贝、截取、复制粘贴 (类似于python的切片)
·
情况一:将一个小矩阵拷贝/粘贴进一个大矩阵内
cv::Mat matSrc // 源矩阵(小矩阵)
cv::Mat matDst // 目标矩阵(大矩阵)
cv::Mat rStart // 源矩阵左上角在目标矩阵上的目标位置,行坐标/y坐标
cv::Mat cStart // 源矩阵左上角在目标矩阵上的目标位置,列坐标/x坐标
// 方案1
matSrc.copyTo(cv::Mat(matDst, cv::Rect(cStart, rStart, matSrc.cols, matSrc.rows)));
// 方案2
matSrc.copyTo(matDst(cv::Range(rStart,rStart+matSrc.rows),cv::Range(cStart,cStart+matSrc.cols)));
情况二:将源矩阵的某一列/某几列拷贝/粘贴到目标矩阵的某一列/某几列 (源矩阵目标矩阵等高)
cv::Mat matSrc // 源矩阵
cv::Mat matDst // 目标矩阵
// 将源矩阵的第3列拷贝/粘贴到目标矩阵的第5列
matSrc.col(3).copyTo(matDst.col(5));
// 将源矩阵的第2到第5列(不含第5列)拷贝/粘贴到目标矩阵的第3到第6列(不含第6列)
matSrc.colRange(2, 5).copyTo(matDst.colRange(3, 6));
情况三:将源矩阵的某一行/某几行拷贝/粘贴到目标矩阵的某一行/某几行 (源矩阵目标矩阵等宽)
cv::Mat matSrc // 源矩阵
cv::Mat matDst // 目标矩阵
// 将源矩阵的第3行拷贝/粘贴到目标矩阵的第5行
matSrc.row(3).copyTo(matDst.row(5));
// 将源矩阵的第2到第5行(不含第5行)拷贝/粘贴到目标矩阵的第3到第6行(不含第6行)
matSrc.rowRange(2, 5).copyTo(matDst.rowRange(3, 6));
情况四:对于等大的矩阵,根据掩膜 Mask,将一个矩阵的部分拷贝/粘贴到另一个矩阵的相应位置
cv::Mat matSrc // 源矩阵
cv::Mat matDst // 目标矩阵
cv::Mat Mask // 掩膜
matSrc.copyTo(matDst, Mask);
情况五:将源矩阵中裁剪出一个小矩阵拷贝/粘贴到目标矩阵的指定位置
int srcLocX; // 源矩阵中裁剪位置起点(小矩阵的左上角)的x坐标/列坐标
int srcLocY; // 源矩阵中裁剪位置起点(小矩阵的左上角)的y坐标/行坐标
int srcWidth; // 裁剪出的小矩阵的宽度
int srcHeight; // 裁剪出的小矩阵的高度
int dstLocX; // 裁剪出的小矩阵(左上角)在目标矩阵上的目标位置,x坐标/列坐标
int dstLocY; // 裁剪出的小矩阵(左上角)在目标矩阵上的目标位置,y坐标/行坐标
cv::Mat matSrc; // 源矩阵
cv::Mat matDst; // 目标矩阵
matSrc(cv::Range(srcLocY, srcLocY+srcHeight),cv::Range(srcLocX, srcLocX+srcWidth)).copyTo(matDst(cv::Range(dstLocY, dstLocY+srcHeight), cv::Range(dstLocX, dstLocX+ srcWidth)));
更多推荐



所有评论(0)