博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv图像几何变化
阅读量:3961 次
发布时间:2019-05-24

本文共 3082 字,大约阅读时间需要 10 分钟。

1.图像缩放resize()

1.1api

V_EXPORTS_W void resize( InputArray src, OutputArray dst,Size dsize, double fx=0, double fy=0,int interpolation=INTER_LINEAR );src:输入图像,Mat类型即可dst:输出图像,当其非0时,由dsize确定尺寸dsize: Size类型,指定输出图像大小,如果它等于0,由下式计算∶dsize = Size(round(fx*src.cols), round(fy*src.rows))fx:沿水平方向的缩放系数,默认值0,等于0时﹐由下式计算︰(double)dsize.width/src.colsfy:沿垂直方向的缩放系数﹐默认值0,等于0时,由下式计算︰(double)dsize.height/src.rowsinterpolation:用于指定插值方式,默认为INTER_LINEAR(线性插值)

1.2代码演示

Mat img = imread("E:\\OpenCV\\images\\car.jpg");Mat dst;resize(img, dst, Size(300, 300));imshow("img", img);imshow("dst", dst);waitKey();

2.图像平移(这里只做学习,学习后面知识可以用ROI完整实现)

2.1平移后,图像大小不变,信息丢失

Mat imgTranslate(Mat &srcImg, int xOffset, int yOffset){
int rows = srcImg.rows; int cols = srcImg.cols; Mat dstImg = Mat::zeros(srcImg.size(), srcImg.type()); //创建全黑图像 for(int i=0; i
=0 && y>=0 && x
(y, x) = srcImg.at
(i, j); } } } return dstImg;}

2.2平移后,图像大小改变,信息完整

Mat imgTranslate2(Mat &srcImg, int xOffset, int yOffset){
int rows = srcImg.rows + yOffset; int cols = srcImg.cols + xOffset; Mat dstImg = Mat::zeros(rows, cols, srcImg.type()); //创建全黑图像 for(int i=0; i
=0 && y>=0 && x
(y, x) = srcImg.at
(i, j); } } } return dstImg;}

3.图像旋转

OpenCV并没有提供图像旋转专门的函数,但我们可以用以下函数简单实现

3.1getRotationMatrix2D函数

getRotationMatrix2D来获得旋转矩阵, 这个函数返回一个矩阵

//Point2f center:表示旋转的中心点,主要中心点是Point2f类型//double angle:表示旋转的角度//double scale:图像缩放因子Mat roateM=getRotationMatrix2D(Point2f(img.cols, img.rows), 30, 0.5);

3.2warpAffine扭曲仿射

void cv::warpAffine(InputArray src,	OutputArray dst,	InputArray M,	Size dsize,	int flags = INTER_LINEAR,	int borderMode = BORDER_CONSTANT,	const Scalar &borderValue = Scalar())//src: 输入图像//dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致//M: 2X3的变换矩阵//dsize: 指定图像输出尺寸//flags: 插值算法标识符,有默认值INTER_LINEAR,如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转换

3.3代码演示

Mat img = imread("E:\\OpenCV\\images\\logo.jpg");Mat roateM = getRotationMatrix2D(Point2f(img.cols, img.rows), 30, 0.5);//roate里的size控制的是旋转图片的大小Mat dst;warpAffine(img,dst,roateM,Size(300,300));//warpAffine里的size控制的是画布的大小imshow("img", dst);waitKey();

4.转置和镜像

4.1transpose

Mat img = imread("E:\\OpenCV\\images\\car.jpg");Mat dst;transpose(img, dst);imshow("img", img);imshow("dst", dst);waitKey();

在这里插入图片描述

4.2flip

Mat img = imread("E:\\OpenCV\\images\\car.jpg");Mat dst;flip(img, dst, 90);//flip(img, dst, 0);//flipCode=0,垂直翻转(沿X轴翻转)://flipCode>0,水平翻转(沿丫轴翻转);//flipCode<0,水平垂直翻转(180°中心对称)imshow("img", img);imshow("dst", dst);waitKey();

在这里插入图片描述

5.重映射remap

Mat srcImg = imread("E:\\OpenCV\\images\\car.jpg");Mat dstImg;int rows = srcImg.rows;int cols = srcImg.cols;Mat xMapImg = Mat::zeros(srcImg.size(), CV_32FC1);  //map1Mat yMapImg = Mat::zeros(srcImg.size(), CV_32FC1);  //map2for (int i = 0; i< rows; i++){
for (int j = 0; j < cols; j++) {
xMapImg.at
(i, j) = j; //保持列不变,cols对于的是x的坐标 yMapImg.at
(i, j) = i + 5 * sin(j / 10.0); //yMapImg.at
(i, j) = rows - i; }}remap(srcImg, dstImg, xMapImg, yMapImg, INTER_LINEAR);imshow("src", srcImg);imshow("dst", dstImg);waitKey(0);

在这里插入图片描述

转载地址:http://rkmzi.baihongyu.com/

你可能感兴趣的文章
笔试常见的智力题(附答案)
查看>>
内核库函数
查看>>
Linux 系统内核空间与用户空间通信的实现与分析
查看>>
linux内核空间和用户空间的区别及交互
查看>>
如何写好应用型学术论文
查看>>
如何查看进程的各种限制
查看>>
64位int类型用printf输出问题
查看>>
网络后台开发面试题目
查看>>
Linux 共享内存限制的查看与设置
查看>>
进程的状态转换
查看>>
如何查看进程的信息(线程数)
查看>>
read的用法
查看>>
查看系统信息(cpu,内存,硬盘,网卡)
查看>>
awk的混合编程
查看>>
awk编程
查看>>
Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
查看>>
默认shell的修改
查看>>
Linux中的chage命令
查看>>
linux-详细解析密码文件passwd与shadow
查看>>
su- 与su的区别
查看>>