我遇到了几何变形的问题,基本上是在俯视图的视角下扭曲图像。不使用积分。
我有什么:
我有一张45度角的图像(即)F是我的相机朝下的位置
This关于我想做什么的论文。第2页有主要公式
cv::warpPerspective
中用于激活此扭曲图像的主要功能我做了什么:
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) 我得到了一个不正确的翘曲,但至少有一些可见的
答案 0 :(得分:0)
由于您没有显示在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是图像的宽度和高度,以像素为单位)