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);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值