如何将 Mat 的矩形区域复制到相同大小的新 Mat?

Posted

技术标签:

【中文标题】如何将 Mat 的矩形区域复制到相同大小的新 Mat?【英文标题】:How to copy a rectangular area of a Mat a new Mat of the same size? 【发布时间】:2019-09-14 22:13:30 【问题描述】:

如何将一张图片的某个区域保存到与第一张图片大小相同的新图片中? 例如,如果我有这样的图像:

我想创建另一个像这样的图像:

这是我尝试过的:

#include <opencv2/opencv.hpp>
#include "iostream"

using namespace cv;
using namespace std;

int main()

    Mat src = imread("1.png");
    Mat dst;

    src(Rect(85, 45, 100, 100)).copyTo(dst);
    imshow("tmask", dst);

    waitKey(0);
    return 0;

但是结果会是这样的:

这不是我想要的。

程序有必要初始化Mat dst的大小,原因在这里写得太长了。 如何在不初始化大小的情况下生成上面的第二张图片(dst)?

【问题讨论】:

我假设你知道你想要什么,虽然这看起来很奇怪。我猜你可以dst = src.clone(); 然后在dst 上工作,或者创建掩码并使用第二个copyTo(img,mask) 重载版本:docs.opencv.org/3.4/d3/d63/… 【参考方案1】:

创建一个新图像并将子图像复制到 roi

cv:: Mat img = cv::imread(...);
cv::Rect roi(x,y,w,h);

cv::Mat subimage= img(roi); // embedded
cv::Mat subimageCopied = subimage.clone(); // copied

cv::Mat newImage=cv::Mat::zeros(img.size(), img.type);

img(roi).copyTo(newImage(roi); // this line is what you want.

如果您可以访问原始图像,但不允许使用其 siute 信息,您可以使用带有掩码的 .copyTo,但是您必须使用大小信息来创建掩码...

【讨论】:

以上是关于如何将 Mat 的矩形区域复制到相同大小的新 Mat?的主要内容,如果未能解决你的问题,请参考以下文章

如何在矩形子区域中划分 OpenCV Mat?

使用 OpenCV 在图像上创建矩形区域蒙版

将 cv::Mat 向量复制到浮点向量的最佳方法是啥?

如何在不同大小的矩形中裁剪相同的 ROI

在保持区域的同时旋转位图(矩形)

将 Mat 拆分为相同大小的 subMat