原理:参照墨卡托投影 - wenglabs - 博客园,感觉讲解的很详细。
这里只进行简单代码编写
c++代码:
/*2.获取螺旋区域直径,进行柱面展开*/
void speardCylinderMatrix(cv::Mat &rectImage01, int &radius, cv::Mat &mapX, cv::Mat &mapY)
{
radius = rectImage01.cols / 2.0; //定义半径,为子图像宽的一半
cv::Mat speImage(rectImage01.rows, PI*radius, CV_8UC1);
//映射参数
mapX.create(speImage.size(), CV_32F);
mapY.create(speImage.size(), CV_32F);
//创建映射参数
for (int y = 0; y < speImage.rows; y++)
{
for (int x = 0; x < speImage.cols; x++)
{
mapY.at<float>(y, x) = (y);
mapX.at<float>(y, x) = (radius*sin(((x - speImage.cols / 2.0)) / radius) + radius);
}
}
cv::remap(rectImage, speImage, mapX, mapY, cv::INTER_LINEAR);
cv::imshow("重投影", speImage);
}
只是利用墨卡托投影之后的对应关系,利用remap进行重投影。