首页 > 解决方案 > 如何使用 OpenCV 进行非线性透视拉伸?

问题描述

我需要执行一种图像拉伸,在顶部缩放更少,在底部缩放更多。我不会像 warpPerspective 那样丢失部分图像。OpenCV 是否提供这种功能?

原始图像

期望的结果

标签: opencvperspectivestretch

解决方案


我找到了一种使用重映射函数并使用指数函数重新映射每个像素的方法:

   cv::Mat mapX, mapY;
   mapX.create(m_nRemapHeight, m_nRemapWidth, CV_32FC1);
   mapY.create(m_nRemapHeight, m_nRemapWidth, CV_32FC1);

   for (int j = 0; j < m_nRemapHeight; j++)
   {
      for (int i = 0; i < m_nRemapWidth; i++)
      {
         mapX.at<float>(j, i) = (float)i;
         float t = (m_nRemapHeight * 0.5f);    
         float r = j + t;
         float fVal = ((r*r) / (m_nRemapHeight + t * 2));
         fVal -= ((t*t) / (m_nRemapHeight + t * 2));
         mapY.at<float>(j, i) = fVal;
      }
   }
   cv::remap(srcMat, dstMat, matX, matY, CV_INTER_LINEAR, 0);

推荐阅读