0

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

proj_x, proj_y <--> cam_x, cam_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 步骤中内存不足(相机是 5 兆像素,显然对于 labview 来说太多了)

然后我开始查看 openCV,并找到了 cvRemap 函数。不幸的是,这个函数以一个正则化的像素-像素图为起点,就像我在上面试图生成的那样。但是,这让我希望在 openCV 中可以使用创建此类地图的功能。我在 openCV 1.0 API 中找不到它(由于遗留原因,我坚持使用 1.0),但我希望它在那里,或者有人有一个简单的技巧。

所以我的问题是以下之一

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

2) 假设我知道坐标系 1 中的点到坐标系 2 的分散映射,我如何执行将图像 1 映射到图像 2 的图像变换。这可以在 Labview 或 OpenCV 中实现。

注意:我正在标记这篇文章 delaunay,因为这是进行分散插值的一种方法,但更好的标签是“分散插值”

4

1 回答 1

2

所以这最终成为 Labview 8.5 中错误的特定修复。尽管如此,由于它们的记录很差,而且我已经花了一天的时间来解决它们,我想我会发布它们,以便其他人在谷歌上搜索这个问题会遇到它。

1) 网格炸弹。不知道什么时候修复的,肯定是8.5的一个bug。解决方法:使用插值和外插托盘上的类似网格的功能。或者升级到显然可以工作的 LV2009(感谢 Underflow)

2) Griddata 在 8.5 中有缺陷。这没有很好的记录。8.6 升级说明说 griddata 和“cubic”设置有问题,但事实上 DEFAULT LINEAR 设置也有问题。按混乱程度降序排列的解决方案: 1) 传递 'v4' 标志,它执行某种样条插值,但没有错误。2) 至少升级到 8.6 版。3) 用芦苇击败 ni 工程师,直到他们正确记录错误。

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

于 2010-05-25T22:03:10.543 回答