c++ - 更改现有 cv::Mat 尺寸,同时保留适合新尺寸的内容

标签 c++ opencv

我有一组不同大小的 cv::Mat 对象。我希望它们都具有与集合中最宽矩阵相同的列数。列较少的矩阵应该用固定颜色填充到右边。本质上,我想要与 Photoshop 的“Canvas Size...”操作相同的功能。我应该如何在 C++ 中执行此操作?

cv::resize不会剪切它,因为它会拉伸(stretch)内容,而不是填充它。 cv::Mat::resize也不符合要求,因为它只能添加行,不能添加列。

最佳答案

诀窍是创建一个具有所需尺寸的新矩阵,然后将数据从原始图像复制到代表保留数据的 ROI 中:

// Creates a new matrix with size newSize with data copied from source.
// Source data outside the new size is discarded.
// If any of the dimensions of newSize is larger than that dimension in source,
// the extra area is filled with emptyColor.
cv::Mat resizeCanvas(const cv::Mat& source, cv::Size newSize, cv::Scalar emptyColor) {
    cv::Mat result(newSize, source.type(), emptyColor);

    int height = std::min(source.rows, newSize.height);
    int width = std::min(source.cols, newSize.width);
    cv::Rect roi(0, 0, width, height);

    auto sourceWindow = source(roi);
    auto targetWindow = result(roi);
    sourceWindow.copyTo(targetWindow);

    return result;
}

关于c++ - 更改现有 cv::Mat 尺寸,同时保留适合新尺寸的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53502957/

相关文章:

C++ Vector 删除特定项目,但会出现段错误

c++ - 如何检查 std::cout 是否支持颜色?

python - PyOpenGL,使用 glFrustum 和 glTranslate 在屏幕上出现 3D 图形问题

c++ - Qt delete 适用于 Valgrind 但不能正常执行

c++ - 将专用插槽连接到 QGraphicsItem 中的 QAction

c++ - 参数问题帮助

python - 我正在创建无损 PNG 图像吗?

python - 在脸周围画出花哨的矩形

iOS:OpenCV 红色范围

opencv - 使用 IPP ippicv_windows_20151201.zip 构建 Opencv 3.1.0