我想裁剪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);
}
那可以吗?
答案 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();