opencv原尺寸旋转图片,无黑边;C++版

参考:
https://blog.csdn.net/cl2227619761/article/details/79897804
https://blog.csdn.net/weixin_30641465/article/details/98899952

以下代码可以实现在保持图片尺寸的情况下,旋转图片(不过好像还有角落那里有点黑边,有能力的同学去看看前面提到的博客看源码,看能不能解决)

//crop 是否裁剪
void cropRotateImage(const cv::Mat &source, cv::Mat &dst,  double angle, bool crop )
{
    angle = fmod(angle, 360.0);//double类型取余数

    cv::Point2f center = cv::Point2f(source.rows / 2, source.rows / 2);
    double scale = 1; // 缩放尺度
    cv::Mat rotateMat;
    rotateMat = cv::getRotationMatrix2D(center, angle, scale);

    Mat temp;
    cv::warpAffine(source, temp, rotateMat, source.size());

    if(crop == false)
    {
        dst = temp.clone();
    }
    else
    {
        int h = source.rows;
        int w = source.cols;

        double angle_crop = fmod(angle, 180.0);
        if(angle > 90)
        {
            angle_crop = 180 - angle_crop;
        }

        double  theta = angle_crop * CV_PI / 180.0;

        double  hw_ratio = float(h) / float(w);

        double tan_theta = tan(theta);
        double numerator = cos(theta) + sin(theta) * tan(theta);

        double r = h > w ? hw_ratio : (1.0 / hw_ratio);
        double denominator = r * tan_theta + 1.0;
        double crop_mult = numerator / denominator;

        int w_crop = int(crop_mult * w);
        int h_crop = int(crop_mult * h);
        int x0 = int((w - w_crop) / 2);
        int y0 = int((h - h_crop) / 2);

        cv::Rect2i roi(x0, y0, w_crop, h_crop);

        cv::resize(temp(roi), dst, source.size());
    }
}

调用就这样子调用

    Mat img = imread("1.bmp");

    Mat rotatedMat;
    Mat cropRotatedMat;
    cropRotateImage(img, rotatedMat, 45, false);
    cropRotateImage(img, cropRotatedMat, 45, true);

    imshow("img", img);
    imshow("rImg", rotatedMat);
    imshow("crImg", cropRotatedMat);

你可能感兴趣的:(opencv,opencv,图片旋转,C++)