作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 opencv 和 C++ 中,如果我之前已经找到了 2 个图像之间的转换矩阵,为什么我需要这样做
Mat affineTransform=getAffineTransform(coordinates_1.data(),coordinates_2.data()) ;
Mat perspectiveTransform=Mat::eye(3,3,CV_64FC1);
for(unsigned int y=0; y<2; ++y){
for(unsigned int x=0; x<3; ++x){
perspectiveTransform.at<double>(y,x) = affineTransform.at<double>(y,x);
}
而不是直接将变换矩阵应用于图像。我理解 Mat::eye() 的含义,但为什么要经历这一切?
注意:originalTranformationMatrix是一个Mat对象,找到的变换矩阵是一个3×3的矩阵
最佳答案
仿射变换具有以下形式:
(a, b, c)
(d, e, f)
它按以下方式变换点 (x,y):
x_new = a*x + b*y + c;
y_new = d*x + e*y + f;
透视变换有如下形式:
(a, b, c)
(d, e, f)
(g, h, 1)
它按以下方式变换点 (x,y):
z = g*x + h*y + 1;
x_new = (a*x + b*y + c)/z;
y_new = (d*x + e*y + f)/z;
也就是说,如果你想定义只做仿射变换的透视变换,应该是:
(a, b, c)
(d, e, f)
(0, 0, 1)
这正是您的代码所做的。首先它创建矩阵:
(1, 0, 0)
(0, 1, 0)
(0, 0, 1)
然后用仿射变换行替换前两行。顺便说一句,它可以用更简洁的方式完成,没有循环:
perspectiveTransform(Rect(0,0,3,2)) = affineTransform.clone();
关于c++ - 为什么将单位矩阵等同于 OpenCV 中的变换矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22478964/
判断这2个相似的Uris实际上相同的标准方法是什么? var a = new Uri("http://sample.com/sample/"); var b = new Uri("http://sam
这个问题在这里已经有了答案: Why does "true" == true show false in JavaScript? (5 个答案) 关闭 5 年前。 可能我很困惑,但我无法理解这个愚蠢
我是一名优秀的程序员,十分优秀!