情况一:将一个小矩阵拷贝/粘贴进一个大矩阵内

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)));

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐