如何在 Opencv 中实现 Matlab 的 Imrotate?

Posted

技术标签:

【中文标题】如何在 Opencv 中实现 Matlab 的 Imrotate?【英文标题】:how to implement Imrotate of Matlab in Opencv? 【发布时间】:2016-08-02 08:26:09 【问题描述】:

对于 Opencv 中的旋转,我使用了以下代码:

Mat rotate(Mat src, double angle)

    Mat dst;
    Point2f pt(src.cols/2., src.rows/2.);    
    Mat r = getRotationMatrix2D(pt, angle, 1.0);
    warpAffine(src, dst, r, Size(src.cols, src.rows));
    return dst;

我在matlab中使用过:

im = imrotate(img, angle, 'bilinear', 'crop');

但结果不相等。 如何解决这个问题或在 C++ 中实现 matlab 的 imrotate?

【问题讨论】:

添加示例图像(例如“source”、“opencv version”、“matlab version”)会有所帮助,因为有些人可能不知道您的代码或 Matlab 会产生什么结果。 你能显示起始图像,以及由 Matlab 和 OpenCV 生成的图像吗? 我希望结果完全一样。我使用最小平方误差并将像素与像素进行比较。 matlab使用mex文件,如何找到matlab的mex文件? 【参考方案1】:

我大约在 1 年前收到此代码。我不记得我从哪里得到的。所以我不相信这段代码。但我修改了这段代码。 结果与matlab结果不完全匹配。但它已经足够好用了。

cv::Mat imRotate(const cv::Mat source, double angle) 
    cv::Mat dst;
    // Special Cases
    if (std::fmod(angle, 360.0) == 0.0)
        dst = source;
    else
        cv::Point2f center(source.cols / 2.0F, source.rows / 2.0F);
        cv::Mat rot = cv::getRotationMatrix2D(center, angle, 1.0);
        // determine bounding rectangle
        cv::Rect bbox = cv::RotatedRect(center, source.size(), angle).boundingRect();
        // adjust transformation matrix
        rot.at<double>(0, 2) += bbox.width / 2.0 - center.x;
        rot.at<double>(1, 2) += bbox.height / 2.0 - center.y;
        cv::warpAffine(source, dst, rot, bbox.size(), cv::INTER_LINEAR);

    
    return dst;

【讨论】:

以上是关于如何在 Opencv 中实现 Matlab 的 Imrotate?的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 中实现复值矩阵方程

如何使用 OpenCV 在 C++ 中实现高效的 im2col 函数?

如何使用背景减法在 OpenCV 中实现tripwire

如何在 OpenCV 中实现颜色分割和前景检测?

如何在 MATLAB 中实现鱼眼镜头效果(桶形变换)?

如何使用 vlfeat 和 opencv 确定 C++ 中图像的 PHOW 特征?