代码之家  ›  专栏  ›  技术社区  ›  Marc

在labview和/或opencv中对图像进行插值和变形

  •  0
  • Marc  · 技术社区  · 15 年前

    我正在研究一个图像处理问题。我有一个投影到屏幕上的投影仪,我有一个照相机可以拍摄这些照片。我可以通过投影屏幕上的点并找到相机上生成区域的质量中心,在投影仪坐标子集和相机像素子集之间建立1:1的对应关系。所以我有一张地图

    项目x,项目y<-->凸轮x,离散点对的凸轮y

    我最初的计划是使用mathscript函数griddata来规范这个映射。这在matlab中可以很好地工作,如下所示

    [pgridx, pgridy] = meshgrid(allprojxpts, allprojypts)
    fitcx = griddata (proj_x, proj_y, cam_x, pgridx, pgridy);
    fitcy = griddata (proj_x, proj_y, cam_y, pgridx, pgridy);
    

    与相机到投影仪的映射相反

    不幸的是,此代码会导致LabVIEW耗尽MeshGrid步骤上的内存(摄像头为500万像素,显然LabVIEW无法处理)。

    然后我开始查看opencv,找到了cvremap函数。不幸的是,这个函数把一个规则化的像素点图作为它的起点,就像我在上面尝试生成的那样。然而,它使我希望在OpenCV中可以使用创建这样一个映射的函数。我在Opencv1.0API中找不到它(因为遗留的原因,我一直使用1.0),但我希望它在那里,或者某人有一个简单的技巧。

    所以我的问题是

    1)如何在opencv中将分散点插入到网格中;(即,对于分散的x和y值,给定z=f(x,y),如何用f(im_x,im_y)填充图像?

    2)如果我知道坐标系1中点到坐标系2的散点映射,我如何执行将图像1映射到图像2的图像转换。这可以在labview或opencv中实现。

    注意:我在标记这个后delaunay,因为这是一个做离散插值的方法,但更好的标记是“离散插值”。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Marc    15 年前

    因此,这最终成为LabVIEW8.5中针对bug的特定修复方法。尽管如此,由于它们的记录很差,而且我花了一天的时间在它们身上,所以我想我会把它们贴出来,这样其他人在谷歌上搜索这个问题就会发现它。

    1)网状炸弹。不知道什么时候修好的,肯定是8.5中的错误。解决方案:使用插值外推托盘上的类似网格的函数。或者升级到显然有效的2009级(感谢下溢)

    2)8.5网格数据有缺陷。这是很糟糕的记录。8.6升级说明指出,网格数据和“立方”设置存在问题,但事实上,默认线性设置也存在问题。以kludenginess的降序排列的解决方案:1)传递“v4”标志,该标志执行某种样条插值,但没有错误。2)至少升级到8.6版。3)用芦苇击打NI工程师,直到他们正确记录错误。

    3)我能够使用opencv remap函数进行从一个图像到另一个图像的实际转换。我刚试过使用内置interp2 vi的matlab,但它在大数组上阻塞了,给了我内存不足的错误。另一方面,将一个IMAQ图像映射到一个IPL图像是相当简单的,所以这并没有那么糟糕,除了添加了外部库。