版权声明:本文为博主原创文章,转载请注明,欢迎交流~ 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 大法好!