互联网@时事传播

OpenCV --- 图像旋转、镜像、尺寸调整

2019-04-10  本文已影响13人  CPlusPlus图像处理

一、图像旋转

1、图像旋转函数原型

CV_EXPORTS_W void rotate(InputArray src, OutputArray dst, int rotateCode);

其中第一,二个参数是输入和输出的图像;
第三个参数为旋转的方法,有默认的宏

ROTATE_90_CLOCKWISE = 0, //!<Rotate 90 degrees clockwise

ROTATE_180 = 1, //!<Rotate 180 degrees clockwise

ROTATE_90_COUNTERCLOCKWISE = 2, //!<Rotate 270 degrees clockwise

2、OpenCV提供了warpAffine函数实现图片仿射变换功能,我们可以利用这个函数实现图像旋转

函数原型为

CV_EXPORTS_W void warpAffine(

InputArray src,

OutputArray dst,

InputArray M,

Size dsize,

int flags=INTER_LINEAR,

int borderMode=BORDER_CONSTANT,

const Scalar& borderValue=Scalar());

其中第一,二个参数是输入和输出的图像;

第三个参数仿射变换矩阵;

第四个参数为变换后的图像尺寸;

第五个参数为差值方法,参数的默认值为int flags=INTER_LINEAR双线性插值。

其他的插值方法和其对应的参数:

INTER_NEAREST=CV_INTER_NN, //!< 最邻近插值

INTER_LINEAR=CV_INTER_LINEAR, //!< 双线性插值

INTER_CUBIC=CV_INTER_CUBIC, //!<双三次插值

INTER_AREA=CV_INTER_AREA, //!< 基于面积插值

INTER_LANCZOS4=CV_INTER_LANCZOS4, //!< 8邻域兰索斯插值

第六个参数为边界处理方法,参数的默认值为int borderMode=BORDER_CONSTANT

第七个参数为边界颜色。

那么实现旋转操作的重点就在于输入合适的仿射变换矩阵-M。

OpenCV提供了getRotationMatrix2D函数计算旋转加缩放的仿射矩阵,其函数原型为:

CV_EXPORTS_W Mat getRotationMatrix2D(

Point2f center,

double angle,

double scale );

参数很简单明了,不需要缩放时只需把第三个参数设为1。

角度为负,顺时针;角度为正,逆时针。

该函数的返回值是一个Mat类型的矩阵。

实例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

// 图像旋转
///@ angle 要旋转的角度
void Rotate(const Mat &srcImage, Mat &destImage, double angle)
{
    Point2f center(srcImage.cols / 2, srcImage.rows / 2);//中心
    Mat M = getRotationMatrix2D(center, angle, 1);//计算旋转的仿射变换矩阵 
    warpAffine(srcImage, destImage, M, Size(srcImage.cols, srcImage.rows));//仿射变换  
    circle(destImage, center, 2, Scalar(255, 0, 0));
}

int main()
{
    //读入图像,并判断图像是否读入正确
    cv::Mat srcImage = imread("3.png");
    if (!srcImage.data)
        return -1;
    imshow("srcImage", srcImage);
    //将图片按比例缩放至宽为250像素的大小
    Mat destImage;
    double angle = 9.9;//角度
    Rotate(srcImage, destImage, angle);
    imshow("dst", destImage);
    waitKey(0);
    return 0;
}

二、图像镜像

图像镜像函数原型

CV_EXPORTS_W void flip(InputArray src, OutputArray dst, int flipCode);

其中第一,二个参数是输入和输出的图像;
第三个参数为旋转的方法,有默认的宏

flipCode为0时表示上下镜像

flipCode为1时表示左右镜像

flipCode为-1时表示上下左右镜像

三、尺寸调整

CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
Size dsize, double fx = 0, double fy = 0,
int interpolation = INTER_LINEAR );

其中第一,二个参数是输入和输出的图像;
第三个参数为调整之后的图像尺寸;

第四个参数fx为x方向的缩放因子,若fx为0,fx = dsize.width/src.cols;

第五个参数fy为y方向的缩放因子,若fy为1,fy = dsize.height/src.rows;

第六个参数interpolation:这个是指定插值的方式,图像缩放之后,肯定像素要进行重新计算的,就靠这个参数来指定重新计算像素的方式,有以下几种:

INTER_NEAREST - 最邻近插值

INTER_LINEAR - 双线性插值,如果最后一个参数你不指定,默认使用这种方法

INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.

INTER_CUBIC - 4x4像素邻域内的双立方插值

INTER_LANCZOS4 - 8x8像素邻域内的Lanczos插值

实例

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

// 图像按比例缩放
///@ width 输入要缩放图像的宽度
void Resize(const Mat &srcImage, Mat &destImage, int width)
{
    int ncols = width;
    int nrows = srcImage.rows*width / srcImage.cols;
    resize(srcImage, destImage, cv::Size(nrows, ncols));
}

int main()
{
    //读入图像,并判断图像是否读入正确
    cv::Mat srcImage = imread("3.png");
    if (!srcImage.data)
        return -1;
    imshow("srcImage", srcImage);

    //将图片按比例缩放至宽为250像素的大小
    Mat destImage;
    double angle = 9.9;//角度
    Resize(srcImage, destImage, 400);
    imshow("dst", destImage);

    waitKey(0);
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读