几何翘曲显示黑色图像

时间:2014-08-27 22:11:05

标签: c++ opencv transformation perspective homography

我遇到了几何变形的问题,基本上是在俯视图的视角下扭曲图像。不使用积分。

我有什么:

  1. 我有一张45度角的图像(即)F是我的相机朝下的位置 enter image description here

  2. This关于我想做什么的论文。第2页有主要公式

  3. opencv cv::warpPerspective中用于激活此扭曲图像的主要功能
  4. 我有必要的Ccam1_cam2动作(假设我的数学是正确的)
  5. 我做了什么:

    1. 我使用论文中的公式生成了一个H矩阵。
    2. 经过测试,如果没有翻译只有轮换,H=R,如果这样可以使扭曲的图像看起来更好。
    3. 从扭曲的图像中查看我的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);
      
    4. 我从顶部向下的图像中获取了点,其中包含了来自我的45度图像的相应点,并生成了一个扭曲良好的H矩阵。只是为了看看H矩阵的样子。但规模完全不同。

    5. 示例:

       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)     我得到了一个不正确的翘曲,但至少有一些可见的

1 个答案:

答案 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是图像的宽度和高度,以像素为单位)