OpenCV2 图像旋转偏移问题

版权声明:本文为博主原创文章,转载请注明,欢迎交流~ https://blog.csdn.net/luoshi006/article/details/51863005

问题:

问题描述:略。。。直接上图:

原图:

这里写图片描述

左旋 90°:

这里写图片描述

【note】
在正方形图像中没有问题,所以,图片的偏移是由 原图 和 目标图 之间的 中心点(center) 位移所产生的。

解决方案:

方案一:

废话不多说,直接上程序:
当时脑残了,没想到 at 方法,所以。。。仅供参考!

//cv::Mat imgProc 源图像;
void MainWindow:: imgShowRotate90(float degree)
{
    cv::Point2f imgCenter;//中心点;

    imgCenter.x=imgProc.size().width/2;
    imgCenter.y=imgProc.size().height/2;

    cv::Size destSize;//程序中只有旋转90度选项,所以直接对调长宽;
    destSize.height = imgProc.size().width;
    destSize.width = imgProc.size().height;

     double rot[6];
    CvMat rotMat =cvMat(2,3,CV_64FC1,rot);
    //旋转矩阵;
    cv2DRotationMatrix(imgCenter,degree,1.0,&rotMat);

    //图像偏差校正;
    rot[2]+=(float)(destSize.width - imgProc.size().width)/2;
    rot[5] +=(float) (destSize.height - imgProc.size().height)/2;

    cv::Mat rotMatM(&rotMat,1);
    //旋转;
    cv::warpAffine(imgProc,imgProc,rotMatM,destSize);

}

由于在 cv::Mat 中的操作指针都是 uchar * 的,移动范围超过 256 就会溢出,所以借用 cvMat 实现旋转矩阵的操作。

最后将 cvMat 转换为 cv::Mat 用于 cv::warpAffine()

方案二

代码:

对于旋转矩阵不太清楚的童鞋,建议去看一下欧拉旋转、方向余弦矩阵、四元数,乃至于李代数(阴险脸)。

    cv::Point2f imgCenter;
    imgCenter.x=imgProc.size().width/2;
    imgCenter.y=imgProc.size().height/2;

    cv::Size destSize;
    destSize.height = imgProc.size().width;
    destSize.width = imgProc.size().height;

    cv::Mat rotMat(2,3,CV_64F);
    rotMat = cv::getRotationMatrix2D(imgCenter,degree,1.0);

    //图像偏差校正;
    rotMat.at<double>(2) +=(float)(destSize.width - imgProc.size().width)/2;
    rotMat.at<double>(5) +=(float) (destSize.height - imgProc.size().height)/2;

    cv::warpAffine(imgProc,imgProc,rotMat,destSize);

最后,放上效果图:

这里写图片描述

不错,就是我打的码,lena 大法好!

猜你喜欢

转载自blog.csdn.net/luoshi006/article/details/51863005