C语言 OpenCV实现柱面投影

  cv::Mat image1 = cv::imread("E:zcb_work2113pic2k.jpg", 0);

  if (!image1.data)

  return 0;

  imshow("image1", image1);

  cv::Mat image2 = cv::imread("E:zcb_work2113pic2j.jpg", 0);

  if (!image2.data)

  return 0;

  imshow("image2", image2);

  Mat imgOut1 = Mat(image1.rows, image1.cols, CV_8UC1);

  imgOut1.setTo(0);

  Mat imgOut2 = Mat(image2.rows, image2.cols, CV_8UC1);

  imgOut2.setTo(0);

  float w = image1.cols;

  float h = image1.rows;

  float f = (w / 2) / atan(PI / 8);

  for (int i = 0; i < image1.rows; i++)

  {

  for (int j = 0; j < image1.cols; j++)

  {

  float x = j;

  float y = i;

  float x1 = f * atan((x - w / 2) / f) + f * atan(w / (2.0f * f));

  float y1 = f * (y - h / 2.0f) / sqrt((x - w / 2.0f) * (x - w / 2.0f) + f * f) + h / 2.0f;

  int col = (int)(x1 + 0.5f);//加0.5是为了四舍五入

  int row = (int)(y1 + 0.5f);//加0.5是为了四舍五入

  if (col < image1.cols && row < image1.rows)

  {

  imgOut1.at(row, col) = image1.at(i, j);

  imgOut2.at(row, col) = image2.at(i, j);

  //imgOut.at(row, col)[1] = image1.at(i, j)[1];

  //imgOut.at(row, col)[2] = image1.at(i, j)[2];

  }

  }

  }

  imshow("imgOut1", imgOut1);

  imshow("imgOut2", imgOut2);