图像的旋转操作
来源:互联网 发布:微信网页授权登录源码 编辑:程序博客网 时间:2024/05/22 06:43
图像的旋转的额基本原理:
图像的每个像素需要经过如下3步完成旋转。
①由输入图像的坐标系转换为数学坐标系。
②通过数学旋转坐标系计算指定像素旋转后的坐标。
③由旋转坐标系转换为输出图像的坐标系。
话不多说放上源代码:
#include<opencv2\core\core.hpp>#include<opencv2\highgui\highgui.hpp>#include<opencv2\imgproc\imgproc.hpp>#include<cmath>#include<iostream>using namespace cv;using namespace std;//旋转图像Mat RotIamge(Mat &srcImage, float Angle) //旋转角度然后返回一张旋转后的图像{//以图像的中心为原点求出原图中的四个角的坐标float SrcX1, SrcY1, SrcX2, SrcY2, SrcX3, SrcY3, SrcX4, SrcY4;//新图中四个角的坐标float DstX1, DstY1, DstX2, DstY2, DstX3, DstY3, DstX4, DstY4;//将角度转换位弧度float alpha = Angle*CV_PI / 180;//原图的宽高int Wold = srcImage.cols;int Hold = srcImage.rows;//假设原图的原点在原图的中心主要是为了求出新图的宽高//原图的四个角的坐标SrcX1 = (float)((-0.5)*Wold);SrcY1 = (float)((0.5)*Hold);SrcX2 = (float)((0.5)*Wold);SrcY2 = (float)((0.5)*Hold);SrcX3 = (float)((-0.5)*Wold);SrcY3 = (float)((-0.5)*Hold);SrcX4 = (float)((0.5)*Wold);SrcY4 = (float)((-0.5)*Hold);//求出cosa 和sinafloat cosa = cos(alpha);float sina = sin(alpha);//求出新图的四个角的坐标DstX1 = cosa*SrcX1 + sina*SrcY1;DstY1 = -sina*SrcX1 + cosa*SrcY1;DstX2 = cosa*SrcX2 + sina*SrcY2;DstY2 = -sina*SrcX2 + cosa*SrcY2;DstX3 = cosa*SrcX3 + sina*SrcY3;DstY3 = -sina*SrcX3 + cosa*SrcY3;DstX4 = cosa*SrcX4 + sina*SrcY4;DstY4 = -sina*SrcX4 + cosa*SrcY4;//计算新图的宽和高int Wnew = cvRound(max(abs(DstX4 - DstX1), abs(DstX3 - DstX2)));int Hnew = cvRound(max(abs(DstY4 - DstY1), abs(DstY3 - DstY2)));//计算矩阵中的两个常数float num1 = (float)(-0.5*Wnew*cosa - 0.5*Hnew*sina + 0.5*Wold);float num2 = (float)(0.5*Wnew*sina - 0.5*Hnew*cosa + 0.5*Hold);//创建一张新的大小的图Mat resultImage(Hnew, Wnew, srcImage.type());for (int i = 0; i < Hnew; i++) //rows{for (int j = 0; j < Wnew; j++)//cols{//求出新图中的像素在原图的位置int x = cvRound(i*cosa + j*sina + num1);int y = cvRound(-sina*i + j*cosa + num2);if ((x >= 0) && (x < Wold) && (y >= 0) && (y < Hold))//在原图中的范围{resultImage.at<Vec3b>(i, j) = srcImage.at<Vec3b>(x, y);}}}return resultImage;}int main(){Mat srcImage = imread("lakeWater.jpg");if (!srcImage.data){printf("image could not load...\n");return -1;}imshow("srcImage", srcImage);Mat resultImage = RotIamge(srcImage,30);imshow("resultImage", resultImage);waitKey(0);return 0;}
原图:
旋转之后的效果图:
阅读全文
0 0
- 图像的旋转操作
- C++实现图像的各种旋转操作
- 图像的平移、旋转等基本操作
- 图像编程的若干常用操作(旋转,透明等)
- 图像的缩放(scale),旋转(rotation),错切(shear)操作
- opencv对图像的旋转操作以及尺寸改变
- 图像UIVIEW的旋转
- 图像的旋转 OpenCV
- 图像旋转的实现
- OpenCV图像的旋转
- 图像的旋转变换
- 图像的旋转
- nv12 图像的旋转
- OpenCV图像操作,缩放,旋转等
- OpenGL图像平移、旋转基本操作总结
- 图像旋转后的还原图像坐标
- 图像学习一:图像的旋转
- 图像旋转后的还原图像坐标
- bzoj2938 [Poi2000]病毒
- jsp中out.print及out.println无法换行的问题
- Elasticsearch生成json,创建索引(把数据写入索引中)
- 转载一个大神的函数
- [数据结构课设]汽车租借公司的管理
- 图像的旋转操作
- SDL_CondSignal与SDL_CondWait用法
- Kafka系列二之部署与使用
- nginx 负载均衡5种配置方式
- Tomcat-高并发并设置
- 反引号
- teamviewer 安装成功
- 对CNN感受野一些理解
- fastjson简单运用