2016-08-02 78 views
0

用于在OpenCV中旋转,我用以下代码:如何在Opencv中实现Imrotate的Matlab?

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++中实现immatate?

+0

添加例如图像(例如,“源”,“OpenCV的版本”,“matlab版”)将是有益的,因为有些人可能不知道是什么结果呢你的代码或Matlab产生。 – alexisrozhkov

+0

您可以显示起始图像,以及由Matlab和OpenCV生成的图像吗? – Miki

+0

我想要得到完全一样的结果。我使用最小平方误差并将像素与像素进行比较。 Matlab使用mex文件,如何找到matlab mex文件? – user1610865

回答

0

我在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; 
}