对于如何使用opencv和c++在三维环境下实现sift算法,我感到困惑.我从一些论文中了解了3D sift算法的原理,但是对于实现我没有一个明确的想法。有一些开源代码是用matlab编写的,我想用c++和opencv来实现算法,但对数据结构不关心。
3D sift算法可以简单地描述为以下步骤:
(1)建立尺度空间,生成狗(高斯差)..
(2)检测极值点,滤除不合适的关键点。
(3)在三维环境下确定关键点的方向。
(4)在三维环境下生成keypoint描述符。
假设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卷。大小数组不应该是常量。
(2)无法找到调整三维体积大小的方法,也无法对三维体积进行高斯滤波。将3D体积分解成二维切片并在每个切片上进行调整大小或高斯滤波,这是一种合理的方法吗?或者有什么功能可以直接应用到3D卷上?
构建合适的数据结构应该是算法的关键,对于如何使用opencv,我没有一个清晰的想法。
谢谢你帮忙!
发布于 2017-11-14 15:15:40
(1)是否有一种方式来声明一个3D卷,因为尺度空间包含不同大小的3D卷,因此是否可以使用类似ty对联的东西来声明一个3D卷。大小数组不应该是常量。
不,OpenCV主要针对2D图像(例如.png、视频提要等标准图像格式)
(2)无法找到调整三维体积大小或对三维体积进行高斯滤波的方法。将3D体积分解成二维切片并在每个切片上进行调整大小或高斯滤波,这是一种合理的方法吗?或者有什么功能可以直接应用到3D卷上?
对于OpenCV,你唯一能做的就是拥有一个2D大小的堆栈,如果你愿意的话,所有的大小都是不同的。如果你有一个带有一组垫的向量或一些类型,那么你可以修改这些垫子以适应你的目的(你甚至可以改变特定垫子的大小)
尽管如此,这听起来确实像是你想要做的事情,很可能超出了OpenCV的范围。作为参考,您可以看到SIFT 这里的OpenCVs实现。
https://stackoverflow.com/questions/47288759
复制相似问题