如何在Opencv中实现Matlab的Imrotate



对于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?

我大约在一年前得到了这段代码。我不记得我从哪里得到的。所以我不相信这个代码。但我几乎没有修改这个代码
结果与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;
}

相关内容

  • 没有找到相关文章

最新更新