2016-08-02 81 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; 
}