【问题标题】:How to maintain white background when using opencv warpaffine使用opencv warpaffin时如何保持白色背景
【发布时间】:2016-03-10 22:39:47
【问题描述】:

我正在尝试使用旋转图像

void rotate(cv::Mat& src, double angle, cv::Mat& dst)
{
    int len = std::max(src.cols, src.rows);
    cv::Point2f pt(len / 2., len / 2.);
    cv::Mat r = cv::getRotationMatrix2D(pt, angle, 1.0);
    cv::warpAffine(src, dst, r, cv::Size(src.cols, src.rows));
}

通过给出角度、源图像和目标图像。旋转正常工作如下。

我想让黑色区域变白。我试过了

cv::Mat dst = cv::Mat::ones(src.cols, src.rows, src.type());

在调用旋转之前,但结果没有变化。我怎样才能做到这一点?

注意:我正在寻找在旋转时实现这一目标的解决方案。显然,通过在旋转后将黑色区域变为白色,可以实现这一点。

【问题讨论】:

    标签: c++ opencv image-processing rotation image-rotation


    【解决方案1】:

    您将需要使用warpAffine 函数的borderModeborderValue 参数来完成此操作。通过将模式设置为BORDER_CONSTANT,它将为边界像素(即图像外部)使用一个常量值,您可以将该值设置为您想要使用的常量值(即白色)。它看起来像:

    cv::warpAffine(src, dst, r,
                   cv::Size(src.cols, src.rows),
                   cv::INTER_LINEAR,
                   cv::BORDER_CONSTANT,
                   cv::Scalar(255, 255, 255));
    

    更多详情请见OpenCV API Documentation

    【讨论】:

    • 如果您想丢弃所有超出范围的像素,例如仅包括有效 roi 内的像素,该怎么办。有什么方法吗?
    • @PabloGonzalez API 中没有用于此的方法,您必须编写自己的方法来从您正在做的任何事情中取出这些像素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    • 2017-11-22
    • 2019-10-02
    • 2014-01-28
    相关资源
    最近更新 更多