我对如何使用opencv和c ++在三维中实现sift算法感到困惑。我从一些论文中了解了3D筛选算法原理,但我对实现并不清楚。有些开源代码是用matlab编写的,我想用c ++和opencv来实现算法,但是不知道如何去除数据结构。
3D筛选算法可简单描述如下:
(1)建立比例空间并生成DOG(高斯差分)。
(2)检测极值并过滤一些不适当的关键点。
(3)以3D形式分配关键点方向。
(4)在3D中生成关键点描述符。
假设3D输入数据已准备好并且可以存储在3D阵列中(例如,双***数据)。
我的第一个尝试是通过以下方式声明3D矩阵(3D体积)(3D数组中的数据可以复制到Mat):
int sizes[] = {x ,y, z};
Mat *Img = new Mat(3, sizes, CV_8U, Scalar(0));// using namespace cv
然后我在算法的 step1 中遇到了一些问题:
(1)有没有办法使用 typedef 来声明3D音量,因为音阶空间包含不同大小的3D音量。 size数组不应该是常量。
(2)我找不到调整3D音量大小或为3D音量执行高斯滤波器的方法。将3D体积分解为2D切片并对每个切片进行调整大小或高斯滤波是一种合理的方法吗?或者有没有任何功能可以直接应用于3D音量?
构建适当的数据结构应该是算法的关键,我不清楚如何使用opencv。
感谢您的帮助!
答案 0 :(得分:1)
(1)是否有办法使用类似typedef的方式声明3D音量,因为音阶空间包含不同大小的3D音量。 size数组不应该是常量。
不,OpenCV主要针对2D图像(想想标准图像格式,如.png,视频输入等)
(2)我无法找到调整3D体积大小或为3D体积进行高斯滤波的方法。将3D体积分解为2D切片并对每个切片进行调整大小或高斯滤波是一种合理的方法吗?或者有没有任何功能可以直接应用于3D音量?
你唯一可以用OpenCV做的就是拥有一堆2D尺寸,如果你想要的话,它们都有不同的尺寸。如果你有一个带有一组垫子的矢量或某种类型,那么你可以改变这些垫子以适合你的目的(你甚至可以改变特定垫子的尺寸)
据说这听起来像你想要做的事情可能超出了OpenCV的范围。作为参考,您可以看到SIFT here
的OpenCV实现