#include <opencv2\opencv.hpp>

/*
@param o The customer origin
@param x The customer x @Note
The return matrix include translation
*/
cv::Mat ZRotationMatrix(const cv::Point2d o, const cv::Point2d x)
{
cv::Mat Rz = cv::Mat::zeros(3, 3, CV_32FC1);
Rz.at<float>(2, 2) = 1.0; double theta = std::atan((x.y - o.y) / (x.x - o.x));
Rz.at<float>(0, 0) = std::cos(theta);
Rz.at<float>(1, 0) = std::sin(theta);
Rz.at<float>(0, 1) = -Rz.at<float>(1, 0);
Rz.at<float>(1, 1) = Rz.at<float>(0, 0); // Adding Translation
Rz.at<float>(0, 2) = static_cast<float>(x.x);
Rz.at<float>(1, 2) = static_cast<float>(x.y);
Rz.at<float>(2, 2) = 0; return Rz;
} /*
Called by Rotation()
*/
std::pair<int, int> dstImageRegion(const cv::Mat points )
{
CV_Assert(points.size() == cv::Size(4, 3)); float maxRow(0.0), maxCol(0.0);
for (size_t i=0; i<4; ++i)
{
// x
maxCol = maxCol < points.at<float>(0, i) ? points.at<float>(0, i) : maxCol; // y
maxRow = maxRow < points.at<float>(1, i) ? points.at<float>(1, i) : maxRow;
} return {maxRow, maxCol};
} /*
@Param Rz It includes the translation also!
*/
cv::Mat Rotation(const cv::Mat src, const cv::Mat Rz)
{
// get region of dst
cv::Mat Corners_src((cv::Mat_<float>(3,4) << 0, src.cols, 0, src.cols,
0, 0, src.rows, src.rows,
1, 1, 1, 1
));
cv::Mat Corners_dst = Rz * Corners_src; std::pair<int, int> size_dst = dstImageRegion(Corners_dst);
cv::Mat dst = cv::Mat::zeros(size_dst.first, size_dst.second, src.type()); // Rz is the matrix from src to dst. The inverse matrix is needed to reconstruct dst.
cv::Mat Rz_inv = Rz.clone(); // The inverse matrix of Rotation is the same as its transpose matrix.
Rz_inv.at<float>(0, 1) = Rz.at<float>(1, 0);
Rz_inv.at<float>(1, 0) = Rz.at<float>(0, 1); // Set pixels value
for (size_t j=0; j<dst.rows; ++j)
{
for (size_t i = 0; i < dst.cols; ++i)
{
cv::Mat tp_src = Rz_inv * cv::Mat((cv::Mat_<float>(3,1) << i,j,1));
int Idx_src(cvRound(tp_src.at<float>(0))), Idy_src(cvRound(tp_src.at<float>(1))); if (Idx_src<0.0 || Idx_src>=src.cols || Idy_src<0.0 || Idy_src>=src.rows)
continue; dst.at<float>(j, i) = src.at<float>(Idy_src, Idx_src);
} } return dst;
} int main()
{
cv::Mat img = cv::imread("1.PNG", CV_LOAD_IMAGE_GRAYSCALE);
img.convertTo(img, CV_32FC1); //
cv::Mat Rz = ZRotationMatrix(cv::Point2d(10,10), cv::Point2d(20, 5));
cv::Mat img_d = Rotation(img, Rz); return 0;
}

  

opencv旋转图像的更多相关文章

  1. opencv旋转图像,90度标准旋转

    摘自opencv 源代码 void rotate(InputArray _src, OutputArray _dst, int rotateMode) { CV_Assert(_src.dims() ...

  2. opencv——(动态)旋转图像

    #include "stdafx.h" #include <opencv2\opencv.hpp> #include <opencv\cv.h> #incl ...

  3. opencv 3.3.0 如何旋转图像?

    函数介绍 1. void cv::flip(InputArray src,OutputArray dst,int flipCode) 2. void cv::transpose(InputArray ...

  4. 《学习OpenCV》练习题第四章第七题abc

    题外话:一直是打算把这本书的全部课后编程题写完的,中间断了几个月,一直忙于其他事.现在开始补上. 这道题我不清楚我理解的题意是不是正确的,这道题可以练习用OpenCV实现透视变换(可以用于矫正在3维环 ...

  5. 【转】【opencv】仿射变换

    仿射变换 目标 在这个教程中你将学习到如何: 使用OpenCV函数 warpAffine 来实现一些简单的重映射. 使用OpenCV函数 getRotationMatrix2D 来获得一个  旋转矩阵 ...

  6. opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

    常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标. 仿射变换在:http:// ...

  7. OpenCV探索之路(十六):图像矫正技术深入探讨

    刚进入实验室导师就交给我一个任务,就是让我设计算法给图像进行矫正.哎呀,我不太会图像这块啊,不过还是接下来了,硬着头皮开干吧! 那什么是图像的矫正呢?举个例子就好明白了. 我的好朋友小明给我拍了这几张 ...

  8. OpenCV实现仿射变换

    什么是仿射变换?¶ 一个任意的仿射变换都能表示为 乘以一个矩阵 (线性变换) 接着再 加上一个向量 (平移). 综上所述, 我们能够用仿射变换来表示: 旋转 (线性变换) 平移 (向量加) 缩放操作 ...

  9. Java基于opencv—矫正图像

    更多的时候,我们得到的图像不可能是正的,多少都会有一定的倾斜,就比如下面的 我们要做的就是把它们变成下面这样的 我们采用的是寻找轮廓的思路,来矫正图片:只要有明显的轮廓都可以采用这种思路 具体思路: ...

随机推荐

  1. luoguP4097 [HEOI2013]Segment

    题意 李超树板子题. 对每个区间维护该区间中点\(mid\)的最优线段. 插入一个线段: 求出这个线段的斜率和截距,注意特判无斜率的情况,得到\(y=kx+b\). 之后开始在线段树上插入,假设当前节 ...

  2. ASP.NET开发实战——(七)ASP.NET与数据库

    在之前的文章中介绍了使用ASP.NET MVC来开发一个博客系统,并且已将初具雏形,可以查看文章列表页面,也可以点击文章列表的其中一篇文章查看详情,这已经完成了最开始需求分析的读者的查看列表和查看文章 ...

  3. 这几款我私藏的Markdown编辑器,今天分享给你

    相信很多人都使用 Markdown 来编写文章,Markdown 语法简洁,使用起来很是方便,而且各大平台几乎都已支持 Markdown 语法 那么,如何选择一款趁手的 Markdown 编辑器,就是 ...

  4. nginx nginx_upstream_check_module自动踢除后端机器

    nginx 1.14.0 描述: nginx自带的upstream配置,如果后端挂了,接口会慢,原因不讲述,故接入第三方的自动检测与自动踢除模式 nginx_upstream_check_module ...

  5. 一、SqlServer查询今天的数据-多写法对比性能问题

    -- 目标:查询当天的所有数据 -- 说明:表数据行数:960w --方法一:使用格式化被查询条件与格式化当前时间比对 ),)),) --方法二:使用函数DATEDIFF 比对 --方法三:使用传统比 ...

  6. vscode自定义vue模板代码

    File--->preference -->user Snippets-->搜索html.json 编辑 加入以下自定义代码内容 "Html5-Vue": { & ...

  7. python-3-条件判断练习题

    前言 我们在前面两章学习了基础数据类型与条件判断语句,今天我们来做下练习题.如果你有不一样的解题思路在评论区亮出你的宝剑!!! 一.习题如下: 1.使用 while 循环输出 1 2 3 4 5 6 ...

  8. sqlplus简单使用

    登录 C:\Users\inmeditation>sqlplus 请输入用户名: scott 输入口令: 查看当前行长 SQL> show linesize; linesize 80 查看 ...

  9. Zookeeper的安装与配置、使用

    Dubbo的介绍 如果表现层和服务层是不同的工程,然而表现层又要调用服务层的服务,肯定不能像之前那样,表现层和服务层在一个项目时,只需把服务层的Java类注入到表现层所需要的类中即可,但现在,表现层和 ...

  10. 《数据结构》《C++程序设计》《计算机组成原理》中的英语名词

    一.数据结构 data 数据data element 数据元素data item 数据项data object 数据对象data structure 数据结构ADT (Abstruct Date Ty ...