【问题标题】:properly replace a cv::Mat with an own-ROI (opencv)用自己的 ROI (opencv) 正确替换 cv::Mat
【发布时间】:2016-02-13 12:05:08
【问题描述】:

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

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

(但因为在我的情况下 source===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);
}

这样可以吗?

【问题讨论】:

  • “dst = src(roi).clone();”怎么样还是“mat = mat(roi).clone();”?
  • mat = mat(roi).clone() 看起来优雅而诱人.. 会尝试一下谢谢

标签: c++ opencv


【解决方案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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2022-06-13
    • 2016-08-16
    相关资源
    最近更新 更多