我在几何变形方面遇到问题,基本上是在自上而下的 View 中变形图像。不使用积分。
我有什么:
我有一个 45 度角的图像(即 F 是我的相机指向下方的位置)
This关于我想做什么的论文。第2页有主要公式
- 在 opencv
cv::warpPerspective
中用来激活这个变形图像的主要函数 - 我有必要的 Ccam1_cam2 roation(假设我的数学是正确的)
我做了什么:
- 我已经使用论文中的公式生成了一个 H 矩阵。
- 测试是否没有平移只有旋转,即
H=R
是否会使扭曲的图像看起来更好。 查看变形图像中的 x、y 值并注意到它们是 <1,这很糟糕,因为它们需要在原始图像 400x530 的范围内。
代码:
cv::Mat hmatrix = (cv::Mat_<double>(3,3) << H.c11, H.c12, H.c13, H.c21, H.c22, H.c23, H.c31, H.c32, H.c33); lfImg = cv::imread("undistortedsmall.bmp", 0); imshow("not warped image", lfImg); cv::waitKey(0); cv::Mat warpedimg; cv::Scalar borderValue; cv::warpPerspective(lfImg, warpedimg, hmatrix ,lfImg.size(),cv::INTER_LINEAR,cv::BORDER_CONSTANT,borderValue); imshow("warpedImage", warpedimg);
我从自上而下的图像中提取点,并从我的 45 度图像中提取相应的点,并生成一个变形良好的 H 矩阵。只是为了看看 H 矩阵会是什么样子。但规模完全不同。
例子:
My generated H Matrix:
0.240053 0.859119 -0.451983
0.689905 -0.478534 -0.543171
-0.682938 -0.181435 -0.707585
pt generated H matrix
0.894764 3.37653 77.6052
-0.950235 2.02846 240.977
-8.73899e-05 0.00384326 1
我想要的:
在不使用从图像中提取的点的情况下对该图像进行自上而下的变形。
问题 黑屏(如果我缩放矩阵我的一些倍数可以说 *100) 我得到了不正确的翘曲,但至少是可见的东西
最佳答案
由于您没有显示在 H 中生成值的完整代码 - 很难确定,但您可能缺少内部参数矩阵(通常也称为相机校准矩阵)。
您提供的论文中没有提到它,这意味着它们使用所谓的“标准化”或“未校准”单应性。当您从点对应生成单应性时,您将获得“校准的”单应性并获得预期结果。
考虑部分3D 平面到平面方程 here .如您所见,R-(t*n^t)/d 由矩阵 Ka 预乘并由 Kb^-1(倒置的第二个相机的固有矩阵)后乘,以产生“校准的”单应性。如果两张图像都是用同一台相机拍摄的,您可以假设 Ka = Kb。
因此,为了获得“校准的”单应性,您可以使用表达式 Hc = K * H * K^-1,其中 Hc 是校准的单应性,H 是未校准的单应性,K 是校准矩阵。
现在,您需要估算 K。理想情况下,您应该执行相机校准才能获得它,但如果您知道相机的焦距,则可以使用如下粗略的近似值:
| f, 0, cx |
K = | 0, f, cy |
| 0, 0, 1 |
其中 f 是以像素为单位的相机焦距,(cx, cy) 是主点的坐标(您可以使用 (w/2, h/2),其中 w 和 h 是以像素为单位的图像宽度和高度)
关于c++ - 显示黑色图像的几何变形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25537775/