今天在看opencv官方给出的仿射变换计算仿射变换矩阵的文档的时候,发现官方文档中有个很明显的错误,再次给大家提个醒。

官方文档连接: http://opencv.willowgarage.com/documentation/cpp/imgproc_geometric_image_transformations.html#warpAffine

其中,在说如何计算仿射矩阵的时候, 原文是这样说的:

cv::getRotationMatrix2D

Comments from the Wiki

Mat 
getRotationMatrix2D
(Point2f
 center, double
 angle, double
 scale
)

Calculates the affine matrix of 2d rotation.

Parameters:
  • center – Center of the rotation in the source image
  • angle – The rotation angle in degrees. Positive values mean counter-clockwise rotation (the coordinate origin is assumed to be the top-left corner)
  • scale – Isotropic scale factor

The function calculates the following matrix:

where

The transformation maps the rotation center to itself. If this is not the purpose, the shift should be adjusted.

See also: getAffineTransform() , warpAffine() , transform()

然后由仿射矩阵计算每个像素的放射变换后的位置是这样:

但是,很明显的,根据上面的计算,得到的 新的  y 的坐标是错误的

上面的仿射变换矩阵中第二行第三列的元素 中间的 减号弄错了,应该是加号

beta * center.x + (1 - alpha)*center.y

这样计算得到的仿射变换后的点的坐标才是正确的。

可以通过查看源码很容易的看到应该是 加号 “+”

cv::Mat cv::getRotationMatrix2D( Point2f center, double angle, double scale )
{
angle *= CV_PI/180;
double alpha = cos(angle)*scale;
double beta = sin(angle)*scale; Mat M(2, 3, CV_64F);
double* m = (double*)M.data; m[0] = alpha;
m[1] = beta;
m[2] = (1-alpha)*center.x - beta*center.y;
m[3] = -beta;
m[4] = alpha;
m[5] = beta*center.x + (1-alpha)*center.y; return M;
}

m[5] 就是上面仿射矩阵中的第二行第三列的元素,可以看到,正确的算法应该是 “+” 号。

opencv 用户文档 错误更正 仿射变换的更多相关文章

  1. 聊下并发和Tomcat线程数(错误更正)

    本文前半部分结论存在严重错误,请看最后2015-1-20更新部分. 最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池 ...

  2. Opencv出现错误“0xc000007b”的解决办法

    装了一下午的opencv.之前用VS2010装过opencv,当时使用的是cmake编译源码的办法,这个方法好处就是不用每新建一个工程就重新链接opencv库文件.今天装了个VS2013,再装open ...

  3. 解决一个Ubuntu中编译NEON优化的OpenCV的错误

    在Ubuntu 16中编译开启NEON优化的Opencv时,遇到libpng编译是使用汇编代码的错误,完整错误见文章末尾.通过查询发现解决方案是安装跨平台编译器,安装代码如下: sudo apt-ge ...

  4. qt opencv编译错误 /usr/local/lib/libopencv_imgcodecs.so.3.1:-1: error: error adding symbols: DSO missing from command line

    转载自:http://tbfungeek.github.io/2016/03/05/Opencv-%E5%AE%89%E8%A3%85%E8%BF%87%E7%A8%8B%E4%B8%AD%E5%87 ...

  5. macos中xcode使用opencv,错误总结

    使用opencv时,进行编译时,会出现如上图所示错误,按图示更改就行了(我编译出来的有2处)主要参考 https://blog.csdn.net/fk1174/article/details/7011 ...

  6. opencv —— getRotationMatrix2D、warpAffine 仿射变换实现图像旋转缩放

    仿射变换的基本概念 仿射变换是一种二维坐标(x, y)到二维坐标(u, v)的线性变换,其数学表达式形式如下: 对应的齐次坐标矩阵表示形式为: 仿射变换保持了二维图形的“平直性”(直线经仿射变换后依然 ...

  7. JS学习之路,菜鸟总结的注意事项及错误更正

    JavaScript 是一种面向对象的动态语言,它的语法来源于 Java 和 C,所以这两种语言的许多语法特性同样适 用于 JavaScript.需要注意的一个主要区别是 JavaScript 不支持 ...

  8. (python走过的坑)OpenCV中错误opencv-3.3.1\modules\highgui\src\window.cpp:339: error: (-215) size.width>0 && size.height>0 in function cv::imshow

    第一次在python中使用OpenCV(cv2),运行时报错opencv-3.3.1\modules\highgui\src\window.cpp:339: error: (-215) size.wi ...

  9. OpenCV——重映射、仿射变换

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

随机推荐

  1. Codeforces 544E Remembering Strings 状压dp

    题目链接 题意: 给定n个长度均为m的字符串 以下n行给出字符串 以下n*m的矩阵表示把相应的字母改动成其它字母的花费. 问: 对于一个字符串,若它是easy to remembering 当 它存在 ...

  2. [转] C++11带来的move语义

    PS: 通过引入接收右值的函数形参,可以通过接收右值来实现高效 PS在C++11中,标准库在<utility>中提供了一个有用的函数std::move,这个函数的名字具有迷惑性,因为实际上 ...

  3. 如何在macos下创建文件或者文件夹的快捷方式

    用的时间久了就发现一次次的打开finder的次数多了,每次打开每次都要一层层的去点开一个个文件夹,太复杂了,然而右键也没有windows中发送到快捷方式到桌面的选项 于是Google一下,按住comm ...

  4. TCP/IP协议原理与应用笔记07:HTTP、TCP/IP与socket区别

    1. TCP/IP协议与HTTP协议区别:      HTTP 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件 ...

  5. android requestWindowFeature使用详解

    requestWindowFeature可以设置的值有:          1.DEFAULT_FEATURES:系统默认状态,一般不需要指定          2.FEATURE_CONTEXT_M ...

  6. noip 2010 关押罪犯 (二分图染色 并茶几)

    /* 二分图染色版本 两个监狱对应二部图的两部分 在给定的怨气值里二分 对于每一个Ci 进行染色判断是否合法 染色的时候 如果这条边的ci > Ci 这两个人就带分开 即染成不同的颜色 如果染色 ...

  7. Asp,题目

    1. 简述 private. protected. public. internal 修饰符的访问权限.答 . private : 私有成员, 在类的内部才可以访问. protected : 保护成员 ...

  8. group by、order by 先后顺序问题

    今天遇到个小问题 本来是很基础的问题 应该说 基础知道掌握的不牢  好了不说 错误 语句 :   select  a.a1  from table a  where order by a.a1 gro ...

  9. 【转】 分析iOS Crash文件:符号化iOS Crash文件的3种方法

    当你的应用提交到AppStore或者各个渠道之后,请问你多久会拿到crash文件?你如何分析crash文件的呢? 上传crash文件 你的应用应当有模块能够在应用程序crash的时候上传crash信息 ...

  10. 2.常用快捷键.md

    [toc] 1.mian函数补全 在IntelJ中和Eclipse中稍有不同,在Eclipse中,输入main再按Alt+/即可自动补全main函数,但是在IntellJ中则是输入psvm,选中即可 ...