我正在研究图像处理问题。我有一台投影仪投影到屏幕上,我有一台相机拍摄照片。我可以通过在屏幕上投射点并在相机上找到所得区域的质心来建立投影仪坐标子集与相机像素子集之间的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步骤上耗尽内存(相机是500万像素,显然对于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,因为这是一种做散乱插值的方法,但更好的标签是“散布插值”
答案 0 :(得分:2)
因此,这最终成为Labview 8.5中针对错误的特定修复。然而,由于他们的记录很少,而且我已经花了一天时间对他们感到痛苦,我想我会张贴他们所以其他人用谷歌搜索这个问题会遇到它。
1)网格炸弹。不知道什么时候修复,肯定是8.5中的一个bug。解决方案:在插值和外推托盘上使用类似网格网格的函数。或者升级到显然有效的LV2009(感谢Underflow)
2)Griddata在8.5中有缺陷。这是很难记录的。 8.6升级说明说明了griddata和“立方”设置的问题,但事实上也是DEFAULT LINEAR设置的一个问题。按kludginess的降序排列的解决方案:1)传递'v4'标志,它执行某种样条插值,但没有错误。 2)升级到至少8.6版。 3)用芦苇打击ni工程师,直到他们正确记录错误。
3)我能够使用openCV重映射功能来实现从一个图像到另一个图像的实际转换。我尝试使用内置在interp2 vi中的matlab,但它在大型数组上窒息并且让我出现内存错误。另一方面,将IMAQ图像映射到IPL图像是相当简单的,所以除了添加外部库之外,这并不是那么糟糕。