在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?
答案 0 :(得分: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;
}