2010-05-24 178 views
0

我正在处理图像处理问题。我有一台投影仪投射到屏幕上,我有一台可以拍摄照片的相机。我可以通过在屏幕上投影点并找到相机上产生的区域的质心来建立投影仪坐标子集和相机像素子集之间的1:1对应关系。因此,我有地图labview和/或openCV中图像的插值和变形

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的网格内插; (即给定z = f(x,y)散射值的x和y,如何用f填充图像(im_x,im_y)?

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

注:我标记这个职位德劳内,因为这是做散插值的一种方法,但更好的标签是“散插值”

+1

您正在使用哪个版本的LV? meshgrid *的“内存不足”问题应该在LV2009中得到修复......至少,这对我们是有用的。不是说升级总是一种选择,我知道:(。 – 2010-05-25 03:56:31

+0

8.5。我们有一个站点许可证,所以我可以在理论上升级到最新版本。实际上,2009年看起来像是一次重大升级,我不想打破现有的代码你知道内存错误是否特定于mathscript吗?插值和推断托盘上有一个vi可以做同样的事情,所以我可以只用kludge来代替。谢谢,Marc – Marc 2010-05-25 12:46:17

+0

好的,我能够得到它通过在i&e托盘上使用vi而不是在meshgrid上工作。 – Marc 2010-05-25 14:00:00

回答

2

因此,这最终成为了错误的某个特定修正在LabVIEW 8.5 。尽管如此,由于它们的记录不完善,而且我花了一天的时间对它们进行了处理,所以我想我会发布它们,以便其他人使用这个问题会遇到它。

1)Meshgrid炸弹。不知道这是什么时候修复的,肯定是8.5中的一个bug。解决方案:改用外插托盘上的类似网格栅格的功能。或升级到显然工作的LV2009(谢谢下溢)

2)Griddata在8.5中有缺陷。这是记录不好的。 8.6升级说明说griddata和“立方”设置有问题,但事实上也是DEFAULT LINEAR设置的问题。按照顺序排列的解决方案:1)通过“v4”标志,它执行某种样条插值,但没有错误。 2)至少升级到版本8.6。 3)用哨子击败ni工程师,直到他们正确地记录错误。

3)我能够使用openCV重映射函数来进行从一个图像到另一个图像的实际转换。我尝试了使用interp2 vi中构建的matlab,但它在大型数组上窒息并给我带来了内存不足的错误。另一方面,将IMAQ图像映射到IPL图像是相当直接的,所以这不是很糟糕,除了添加外部库。