- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有图像A,我想获得图像A的鸟瞰图。所以我使用getPerspectiveTransform方法来获取变换矩阵。输出结果为 3x3 矩阵。看我的代码。就我而言,我想知道 3x3 矩阵的比例因子。我看过 opencv 文档,但找不到变换矩阵的详细信息,也不知道如何获取比例。我也读过一些论文,论文说我们可以从 a11、a12、a21、a22 获得缩放、剪切和旋转。看图片。那么我怎样才能得到比例因子。你能给我一些建议吗?你能解释一下 getPerspectiveTransform 输出矩阵吗?谢谢!
Points[0] = Point2f(..., ...);
Points[1] = Point2f(..., ...);
Points[2] = Point2f(..., ...);
Points[3] = Point2f(..., ...);
dst[0] = Point2f(..., ...);
dst[1] = Point2f(..., ...);
dst[2] = Point2f(..., ...);
dst[3] = Point2f(..., ...);
Mat trans = getPerspectiveTransform(gpsPoints, dst);//I want to know the scale of trans
warpPerspective(A, B, trans, img.size());
当我改变相机位置时,梯形的大小和位置也会改变。现在我们把它设置成一个矩形,矩形的宽度/高度是已知的。但我认为相机在不同高度的矩形尺寸应该已经改变。因为如果我们设置成相同尺寸的矩形,矩形可能有不同的细节。这就是为什么我想知道 3x3 变换矩阵的比例。例如,trapezium1 和 trapezium2 具有 transfrom scale s1 和 s2。所以我们可以设置 rectangle1(width,height) = s2/s1 * rectangle2(width,height)。
最佳答案
好的,给你:
H is the homography
H = T*R*S*L with
T = [1,0,tx; 0,1,ty; 0,0,1]
R = [cos(a),sin(a),0; -sin(a),cos(a),0; 0,0,1]
S = [sx,shear,0; 0,sy,0; 0,0,1]
L = [1,0,0; 0,1,0; lx,ly,1]
where tx/ty is translation; a is rotation angle; sx/sy is scale; shear is shearing factor; lx/ly are perspective foreshortening parameters.
如果我没理解错的话,你想计算 sx 和 sy。现在如果 lx 和 ly 都为 0,那么计算 sx 和 sy 就很容易了。这将是通过 QR 分解产生 Q*R 来分解 H 的左上部分,其中 Q 是正交矩阵(= 旋转矩阵),R 是上三角矩阵([sx, shear; 0,sy]
)。
h1 h2 h3
h4 h5 h6
0 0 1
=> Q*R = [h1,h2; h4,h5]
但 lx 和 ly 摧毁最简单的方法。所以你必须找出矩阵的左上部分在没有 lx 和 ly 的影响下会是什么样子。
如果你的整个单应性是:
h1 h2 h3
h4 h5 h6
h7 h8 1
那么你将拥有:
Q*R =
h1-(h7*h3) h2-(h8*h3)
h4-(h7*h6) h5-(h8*h6)
因此,如果您从该矩阵计算 Q 和 R,则可以轻松计算旋转、缩放和剪切。
我用一个小的 C++ 程序对此进行了测试:
double scaleX = (rand()%200) / 100.0;
double scaleY = (rand()%200) / 100.0;
double shear = (rand()%100) / 100.0;
double rotation = CV_PI*(rand()%360)/180.0;
double transX = rand()%100 - 50;
double transY = rand()%100 - 50;
double perspectiveX = (rand()%100) / 1000.0;
double perspectiveY = (rand()%100) / 1000.0;
std::cout << "scale: " << "(" << scaleX << "," << scaleY << ")" << "\n";
std::cout << "shear: " << shear << "\n";
std::cout << "rotation: " << rotation*180/CV_PI << " degrees" << "\n";
std::cout << "translation: " << "(" << transX << "," << transY << ")" << std::endl;
cv::Mat ScaleShearMat = (cv::Mat_<double>(3,3) << scaleX, shear, 0, 0, scaleY, 0, 0, 0, 1);
cv::Mat RotationMat = (cv::Mat_<double>(3,3) << cos(rotation), sin(rotation), 0, -sin(rotation), cos(rotation), 0, 0, 0, 1);
cv::Mat TranslationMat = (cv::Mat_<double>(3,3) << 1, 0, transX, 0, 1, transY, 0, 0, 1);
cv::Mat PerspectiveMat = (cv::Mat_<double>(3,3) << 1, 0, 0, 0, 1, 0, perspectiveX, perspectiveY, 1);
cv::Mat HomographyMatWithoutPerspective = TranslationMat * RotationMat * ScaleShearMat;
cv::Mat HomographyMat = HomographyMatWithoutPerspective * PerspectiveMat;
std::cout << "Homography:\n" << HomographyMat << std::endl;
cv::Mat DecomposedRotaScaleShear(2,2,CV_64FC1);
DecomposedRotaScaleShear.at<double>(0,0) = HomographyMat.at<double>(0,0) - (HomographyMat.at<double>(2,0)*HomographyMat.at<double>(0,2));
DecomposedRotaScaleShear.at<double>(0,1) = HomographyMat.at<double>(0,1) - (HomographyMat.at<double>(2,1)*HomographyMat.at<double>(0,2));
DecomposedRotaScaleShear.at<double>(1,0) = HomographyMat.at<double>(1,0) - (HomographyMat.at<double>(2,0)*HomographyMat.at<double>(1,2));
DecomposedRotaScaleShear.at<double>(1,1) = HomographyMat.at<double>(1,1) - (HomographyMat.at<double>(2,1)*HomographyMat.at<double>(1,2));
std::cout << "Decomposed submat: \n" << DecomposedRotaScaleShear << std::endl;
现在您可以使用http://www.bluebit.gr/matrix-calculator/ 的QR 矩阵分解来测试结果。
首先,您可以尝试将 perspectiveX 和 perspectiveY 设置为零。您会看到可以使用矩阵的左上部分分解为旋转角度、剪切和比例的输入值。但如果你不设置 perspectiveX 和 perspectiveX 为零,你可以使用“DecomposedRotaScaleShear”并将其分解为 QR。
你会得到一个结果页面
Q:
a a
-a a
在这里你可以计算acos(a)
来得到角度
R:
sx shear
0 sy
这里可以直接读取sx和sy。
希望这对您有所帮助,我希望没有错误;)
关于c++ - 如何在opencv中获取getPerspectiveTransform的比例因子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389125/
所以基本上我有一个导航栏,我只想有一定的宽度。它有 4 个元素,我希望它正好是这些元素的宽度。这是它在我的工作计算机上的样子。 这正是我想要的样子。导航栏在最后一个元素的末尾完美结束,并且居中。我自己
如何将多个过滤器链接到一个视频中? 基本上 - 我有一个叠加图像(透明 gif),想要将它居中,并为 gif 应用 30% 的不透明度。这就是我所拥有的: ffmpeg -i inputmovie.m
我正在使用此命令对视频进行编码 $transcode = FFMPEG_BINARY.' -loglevel panic -y -i "'.$files['original'].'" -vf scal
我正在使用 Laravel 网站,包括 照片滑动 . 这是我的问题:当我单击照片时,它会以预定义的高度和宽度(在我的情况下为 764X480)弹出。我希望我的照片以原始比例打开,而不是预定义的(因为我
假设我想计算每个组中不同值的比例。例如,使用 mtcars 数据,如何计算 am 的齿轮数量的相对频率(自动/手动)用 dplyr 一次性完成? library(dplyr) data(mtcars)
我用一个非常小的标记散点图数据点(见下面的屏幕截图)。当我使用非常小的标记 ',' 时,图例很难阅读(示例代码取自 here )。 (Python 3,Jupyter 实验室) 如何增加图例中标记的大
我有这个数据框: o d r kz p 1 3 1 5 NaN 1 3 2 0 NaN 1 10 1 7 NaN 1 10 3 1
我对 R 很陌生,所以如果我的问题中有不清楚的地方,请耐心等待。 我有一个 data.frame “蛋白质”有5列,即; 1.protein_name, 2.protein_FC, 3.protein
我有一个带有 webgl 的 Canvas 。我初始化 webgl,创建一个片段和一个顶点着色器、两个覆盖整体的三 Angular 形和一个纹理。 const vertexShaderSource =
我想找到包括旋转,比例和位置的匹配模板。但是cvMatchTemplate没有提供这些详细信息,它仅检测位置。 我看过使用棋盘的例子。但是我想用自定义图像实现相同的示例。 感谢帮助。 问候 最佳答案
我正在尝试制作像欧洲体育应用程序中那样的侧边栏菜单!当菜单从左侧滑动时,sourceviewcontroller 向左滑动并变小。 var percentWidthOfContainer = cont
https://stackblitz.com/edit/js-meta-viewport 在 Chrome 调试器中,当我点击“可以缩放”但无法在移动设备 (Nexus 5 (Chrome 70))
针对一台设备进行优化后, ImageView 会按照布局中定义的正确比例显示。然而,如何才能更进一步,使各种 ImageView 在不同设备上缩放? android:layout_width="fil
我正在尝试创建一个具有两个 View 的 View Controller ,其中一个实际上是自定义 TableView ,如下所示: 是否可以添加某种比例约束,以便在所有设备和所有方向上,上 View
我正在使用 PhoneGap 为 Android 开发。下面你可以看到我的代码,我不能做的是在用户更改比例后将 WebView 比例重置为 1。 The reset code should be im
我有一个涉及大量图像的元素。 问题是每个图像都有不同的分辨率(高度/宽度)。它从 200x600 之类的小图像变成了 3000x5000 大声笑。 我正在尝试找到一种方法将所有图像的大小减小到 (MA
我想在运行时设置视口(viewport)比例 - 移动浏览器是否应该在设置后立即应用更改?这就是我正在尝试的: var scale = 2.0; var viewport = document.get
我在 paperjs 中有一个圆形和一个矩形对象。现在我想制作动画。在该动画中,圆圈上升并且矩形必须在圆圈之后(在圆圈底部)增长。我在这里有一个例子(不是我想要的那样工作) example 代码: v
对不起,我不能给标题带来完美的含义。您可以在 http://dainielhhong.com/page1.html 测试代码 无论屏幕大小如何,我都想使 crack 和 box fit。 它适合我的显
我是 D3 v3 的新手,正在学习一些有关基本线性和序数尺度的教程。我正在修改教程中的一段代码。我想让颜色根据窗口的大小显示和缩放。如果有更多数据,那么它应该再次均匀分布以容纳所有数据。 var da
我是一名优秀的程序员,十分优秀!