用自己的ROI(opencv)正确替换cv :: Mat

时间:2016-02-13 12:05:08

标签: c++ opencv

我想裁剪cv::Mat - 也就是说,不仅仅是指向内存中更广泛的矩阵的投资回报率,而是真正摆脱所有原始数据,而不是投资回报率中的那些数据。更多,我需要我的界面与opencv传统的不返回垫子一致;基本上我想要这个:

void crop(cv::Mat& source, cv::Rect roi, cv::Mat& destination);

(但在我的情况下,来源===目的地)可能就是这样:

void crop(cv::Mat& mat, cv::Rect roi);

目前我这样做:

void crop(cv::Mat& original, cv::Rect roi) {
  cv::Mat roi_in_original {original(roi)};
  cv::Mat new_mat;
  roi_in_original.copyTo(new_mat);
  original = new_mat;
}

这不仅是冗长的,而且可能是次优的。 S直接将ROI复制到原始垫子是合理的:

void crop(cv::Mat& original, cv::Rect roi) {
  cv::Mat roi_in_original {original(roi)};
  roi_in_original.copyTo(original);
}

那可以吗?

1 个答案:

答案 0 :(得分:1)

我会将您的第一个版本更改为:

void crop(const Mat& src, const Rect& roi, Mat& dst)
{
    dst = src(roi).clone();
}

输入参数为const。您可以将结果保存在相同的矩阵调用中:

Mat m = ...
Rect roi = ...    

crop(m, roi, m);

我会将您的第二个版本更改为:

void crop( Mat& m, const Rect& roi)
{
    m = m(roi).clone();
}

您可以使用:

Mat m = ...
Rect roi = ...    

crop(m, roi);

请注意,在两种情况下都需要调用clone()才能生成矩阵连续,如您所料。

我个人更喜欢第一种变体,因为它更通用。但是,您也可以首先避免裁剪功能,因为它就像以下一样简单:

Mat m = ...
Rect roi = ...

m = m(roi).clone(); 

// Or, to save to a different matrix
//Mat n = m(roi).clone();