【问题标题】:C# Code to convert Circular Fisheye Image to Rectilinear Image将圆形鱼眼图像转换为直线图像的 C# 代码
【发布时间】:2016-02-14 13:37:51
【问题描述】:

我有一个圆形鱼眼图像,想转换为直线图像。 所以我尝试使用 Hugin Software 和 PanoTools Photoshop 插件来获得所需的投影、水平视野 (HFoV) 值和所需的输出宽度高度。

最终我有以下内容: 原图为正方形,尺寸为2650*2650,摄像头HFoV为159.36度。

输出的直线图像尺寸为 7200*2650,HFov 为 155 度。

我想问一下如何将所有这些参数和值转换为C#算法编码,这样当我提供原始图像时,我会得到校正后的输出图像?

谢谢

【问题讨论】:

    标签: c# algorithm image-processing fisheye


    【解决方案1】:

    即使不是c#,你也可以尝试this utility将PPM图像从圆形鱼眼转换为直线投影,它可以让你开始。

    /*
     * C++ utility to convert a PPM image from circular fisheye into rectilinear projection
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    
    void chomp(char *buffer)
    {
      char *end = strchr(buffer, '\0');
      if (end > buffer && *(end - 1) == '\n') *(--end) = '\0';
      if (end > buffer && *(end - 1) == '\r') *(--end) = '\0';
    }
    
    int main(int argc, char *argv[])
    {
      char linebuf[1024];
    
      // read PBM signature.
      if (!fgets(linebuf, sizeof(linebuf), stdin)) abort();
      chomp(linebuf);
      if (strcmp(linebuf, "P6") != 0) abort();
    
      // read dimensions.
      int width, height;
      while (1) {
        if (!fgets(linebuf, sizeof(linebuf), stdin)) abort();
        chomp(linebuf);
        if (linebuf[0] == '#') continue;
        if (sscanf(linebuf, "%d %d", &width, &height) != 2) abort();
        break;
      }
      if (width < 1 || height < 1) abort();
    
      // read bitdepth.
      int bitdepth;
      while (1) {
        if (!fgets(linebuf, sizeof(linebuf), stdin)) abort();
        chomp(linebuf);
        if (linebuf[0] == '#') continue;
        if (sscanf(linebuf, "%d", &bitdepth) != 1) abort();
        break;
      }
      if (bitdepth != 255) abort();
    
      // read pixel data.
      unsigned char *pixels[height];
      for (int i = 0; i < height; i++) {
        pixels[i] = new unsigned char[width * 3];
        if (fread(pixels[i], 3, width, stdin) != (size_t) width) abort();
      }
    
    
      // write out new image format.
      int midy = height / 2;
      int midx = width / 2;
      int maxmag = (midy > midx ? midy : midx);
      int circum = 2 * M_PI * maxmag;     // c = 2*pi*r
      printf("P6\n");
      printf("%d %d\n", circum, maxmag);
      printf("%d\n", bitdepth);
    
    
      char black[3] = {0,0,0};
      for (int y = 0; y < maxmag; y++) {
        for (int x = 0; x < circum; x++) {
          double theta = -1.0 * x / maxmag;       // -(x * 2.0 * M_PI / width);
          double mag = maxmag - y;                // y * 1.0 * maxmag / height;
          int targety = lrint(midy + mag * cos(theta));
          int targetx = lrint(midx + mag * sin(theta));
          if (targety < 0 || targety >= height || targetx < 0 || targetx >= width) {
            fwrite(black, 1, 3, stdout);
          } else {
            fwrite(&pixels[targety][targetx * 3], 1, 3, stdout);
          }
        }
      }
    
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 2019-11-21
      • 2019-11-16
      • 2017-10-08
      • 2014-12-22
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      相关资源
      最近更新 更多