您的位置:首页 > 运维架构

OpenCV2 图像旋转偏移问题

2016-07-08 17:56 435 查看

问题:

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

原图:



左旋 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 大法好!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv