warpAffine仿射变换

仿射变换,其实就是不同的坐标系的相互转换,用于图像的平移和旋转.
首先看一下官方的api描述.
https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html?highlight=warpaffine#void%20warpAffine(InputArray%20src,%20OutputArray%20dst,%20InputArray%20M,%20Size%20dsize,%20int%20flags,%20int%20borderMode,%20const%20Scalar&%20borderValue)
583030-20190819173036473-1897118338.png

先从图像平移说起,假如说我们想把图像向右平移5个像素,即(0,0)-->(5,0),(100,100)--->(105,100),更一般地表达即(x,y)-->(x+5,y),其中x,y为坐标系中的某一个像素的位置.

这个过程可以用一个矩阵的乘法来表达
583030-20190819173108647-1593756526.png

M就是我们所谓的转移矩阵,当583030-20190819173207345-966352096.png
时,矩阵的乘法得到的效果就是将(x,y)转变为(x+tx,y+ty),从而完成图像的平移效果.

所以opencv中完成图像向右平移5个像素的代码如下,img_translation即我们得到的新矩阵:

    num_rows, num_cols = img_mat.shape[:2]
    tx=5
    ty=0
    translation_matrix = np.float32([ [1,0,tx], [0,1,ty] ])
    img_translation = cv2.warpAffine(img_mat, translation_matrix, (num_cols, num_rows),borderValue=(0,0,0))

效果如下
583030-20190819173236802-2127215900.png

图像旋转

图像的旋转其实和平移的原理是类似的,opencv里提供了一个api帮我们去获取旋转矩阵.我们只需要给出旋转中心和旋转角度即可.
583030-20190819173307899-1210473107.png

    cv::Mat src = cv::imread("lenna.jpg");
    cv::Mat dst;
 
    //旋转角度
    double angle = 45;
 
    cv::Size src_sz = src.size();
    cv::Size dst_sz(src_sz.height, src_sz.width);
    int len = std::max(src.cols, src.rows);
 
    //指定旋转中心
    cv::Point2f center(len / 2., len / 2.);
    
    //获取旋转矩阵(2x3矩阵)
    cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
 
    //根据旋转矩阵进行仿射变换
    cv::warpAffine(src, dst, rot_mat, dst_sz);
 
    //显示旋转效果
    cv::imshow("image", src);
    cv::imshow("result", dst);
 
    cv::waitKey(0);
 
    return 0;

效果如下:
583030-20190819173339581-117230319.png

转载于:https://www.cnblogs.com/sdu20112013/p/11378474.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值