我正在研究图像处理问题。我有一个投影到屏幕上的高射投影仪,我有一个可以拍摄照片的相机。我可以通过在屏幕上投影点并在相机上找到结果区域的质心,在投影仪坐标子集和相机像素子集之间建立 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,因为这是进行分散插值的一种方法,但更好的标签是“分散插值”