C++版OpenCV_02_几何变换


几何变换:

  1. 仿射变换:平移、放大缩小、旋转、计算仿射矩阵(方程法、矩阵法)、插值(最近邻、双线性插值)、
  2. 投影变换
  3. 极坐标变换

2.1 仿射变换

平移

x_ = 1*x + 0*y+ tx
y_ = 0*x + 1*y+ ty


放大缩小

/*
x_ = sx*x + 0*y+ 0*tx
y_ = 0*x + sy*y+ 0*ty

void resize(InputArray scr,outputArray dst,Size dsize,double fx=0,double fy=0,int interpolation=INTER_LINEAR)
scr: 输入图像
dst: 输出图像
dsize:(宽高)
fx: 水平方向上的缩放比例
fy: 垂直方向上的缩放比例
interpolation: 插值法 INTER_NEAREST、INTER_LINEAR

*/
#include<opencv/core/core.hpp>
#include<opencv/highgui/highgui.hpp>
#include<opencv/imgproc/imgproc.hpp>
using namespace cv;
int main(int argv,char*argv[])
{
    Mat I = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
    if(!I.data)
        return -1;
    Mat s = (Mat_<float>(2,2)<<0.5,0,0,0,0.5,0);
    Mat dst;
    warpAffine(I,dst,s,Size(I.cols/2,I.rows/2));
    Mat dst1;
    resize(I,dst1,Size(I.cols/2,I.rows/2),0.5,0.5);
}

旋转

/*
x_ = cosa*x + sina*y+ 0*tx
y_ = -sina*x + cosa*y+ 0*ty
void rotate(InputArray scr,outputArray dst,int rotateCode)
rotateCode: ROTATE_90_CLOCKWISE,ROTATE_180,ROTATE_90_COUNTERCLOCKWISE,270度
*/

#include<opencv/core/core.hpp>
#include<opencv/highgui/highgui.hpp>

using namespace cv;
int main(int argv,char*argv[])
{
    Mat I = imread(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
    if(!I.data)
        return -1;
 
    Mat dst;
    rotate(I,dst,ROTATE_90_CLOCKWISE);

}

计算仿射矩阵
方程法求仿射矩阵

// 仿射矩阵有6个自由度,因此需要src,dst3对不共线的点求解
// 把对应点存在数组中
Point2f src[]={Point2f(0,0),Point2f(10,24),Point2f(60,120)};
Point2f dst[]={Point2f(0,0),Point2f(30,64),Point2f(50,98)};
Mat A = getAffineTransform(src,dst)

// 把对应点存在矩阵中
Mat src = (Mat_<float>(3,2)<<0,0,10,24,60,120);
Mat dst = (Mat_<float>(3,2)<<0,0,30,64,50,98);
Mat A = getAffineTransform(src,dst)


计算仿射矩阵
矩阵法:

// 获取旋转矩阵
Mat A = getRotationMatrixD(Point2f(x,y),angle,scale);

2.2 投影变换

/*
Point2f src[]={Point2f(0,0),Point2f(100,0),Point2f(0,100),Point2f(100,100)};
Point2f dst[]={Point2f(100,30),Point2f(200,30),Point2f(70,80),Point2f(230,90)};
Mat P=getPerspectiveTransform(src,dst);


Point2f src=(Mat_<float>(4,2)<<0,0,20,10,40,89,100,100);
Point2f dst=(Mat_<float>(4,2)<<10,20,30,80,80,90,200,150);
Mat P=getPerspectiveTransform(src,dst);
*/

2.3 极坐标变换

/*
笛卡尔坐标转极坐标
已知任意一点(x,y),中心(x',y'),(a,r)
r = ((x-x')**2+(y-y')**2)**0.5
a = 2pi+arctan2(y-y',x-x') 当y-y' <=0  or  arctan2(y-y',x-x')  当y-y' >0

cartToPolar(x,y magnitude,angle,angleInDegrees)
angleInDegrees: ture 返回角度,反之,返回弧度。

*/
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值