【问题标题】:FishEye Picture Effect (Barrel Distortion) Algorithm (with Java)?FishEye 图片效果(桶形失真)算法(使用 Java)?
【发布时间】:2011-06-26 01:40:07
【问题描述】:

我正在寻找算法(位图像素操作)来模拟普通图片中的鱼眼镜头(桶形失真)。到目前为止,我已经找到了涉及 OpenCV、OpenGL 或 jhlabs 等外部库的实现。由于我正在上数字图像处理课程并且我正在做一个课程评估项目,我不确定使用任何外部库是否会给我带来好成绩。那么有人会给我这种算法的参考吗?

附言。我被要求用 Java 实现它,但任何语言的示例都可以。

【问题讨论】:

    标签: java image-processing fisheye distortion


    【解决方案1】:

    很高兴您能够找到符合您要求的示例。将它们包含在您的问题中会很有帮助——它可以确保阅读它的人与您在同一页面上。所以这里是link

    你想自己做事情也很好,而不是依赖一些库来为你做艰苦的工作。但这并不意味着您必须忽略此类解决方案。原因如下。

    that link 中查看 OpenCV 的实际用途。这些是以cv开头的函数:

    $ grep -o "cv\\w*" barrel.cpp | sort | uniq
    cv
    cvCreateImage
    cvGet2D
    cvGetSize
    cvLoadImage
    cvNamedWindow
    cvSaveImage
    cvSet2D
    cvShowImage
    cvWaitKey
    

    如果您查看OpenCV API,所有这些功能都只是处理普通任务,如图像创建、删除、显示、像素设置等。这些任务都不是桶形失真所特有的。就桶形失真而言,该解决方案不是特定于 OpenCV 的

    确实,程序的核心在这里:

    float getRadialX(float x,float y,float cx,float cy,float k){
      x = (x*xscale+xshift);
      y = (y*yscale+yshift);
      float res = x+((x-cx)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
      return res;
    }
    
    float getRadialY(float x,float y,float cx,float cy,float k){
      x = (x*xscale+xshift);
      y = (y*yscale+yshift);
      float res = y+((y-cy)*k*((x-cx)*(x-cx)+(y-cy)*(y-cy)));
      return res;
    }
    

    这只是径向变换公式——这是您需要了解的一点。如您所见,其中没有 OpenCV 调用。

    【讨论】:

    • 哇,非常感谢!我想我还没有足够彻底地检查该代码。虽然我可能能够在不使用基于代码的 OpenCV 的情况下继续我的项目,但由于我对 OpenCV 不太熟悉,它的 Java 包装器是否与这个特定任务兼容?
    • 是的,理论上您应该能够在 Java 中重用大部分代码,而无需付出太多努力。但是我从来没有在 Java 中使用过 OpenCV,所以我不知道它在实践中会如何。
    • 嗨,我正在尝试创建相同的效果,但在 Android 中。你能向我解释一下上述方法是如何工作的吗? Atm 我有一个应用程序,我在位图上放置一个圆圈,我有一个算法只针对圆圈中的像素。我显然知道圆的半径,圆的中心点,我可以逐个像素地遍历位图。这是我对图像处理的了解,因为我是新手。你介意告诉我如何应用这种效果吗?任何帮助,将不胜感激。如果你愿意,我可以用我的源开始一个线程
    • @turtleboy:很遗憾,我没有任何 Android 经验,所以帮不了你。不过,如果您提出问题并用“android”标记,您很可能会找到可以帮助您的人。
    • @mishsa 好的,谢谢,但上面的代码并不是 Android 特有的,我只是想知道径向变换是如何工作的,以及如何在位图中进行变换。例如,我认为通常你有一个 src 图像和一个目标图像,然后你会在 dest 中绘制新点。我不清楚的其他事情是,我需要什么变量,例如半径、像素的 x y 坐标等
    【解决方案2】:

    【讨论】:

    • 欢迎来到 Stack Overflow!请注意,这里不鼓励直接链接到您自己的网站/产品,原因有两个;首先,答案应该作为独立的答案发布,而不仅仅是指向外部站点的链接。其次,自我推销在这里往往不受欢迎,并且经常被标记为垃圾邮件(特别是如果没有披露您链接到自己的网站/产品)。
    • 正如 Andrew 所说,看起来您那里有一篇非常详细的帖子。您能否总结一下这个问题的相关信息并将其放在您的答案中?这样可以防止您的链接在未来某个时候消失。
    【解决方案3】:
    猜你喜欢
    • 2012-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多