Python 如何向OpenCV函数cv.dft()输入复数值?

Python 如何向OpenCV函数cv.dft()输入复数值?,python,numpy,opencv,dft,Python,Numpy,Opencv,Dft,我正在努力实现一篇研究论文中所述的内容。它描述了如何从图像中提取傅里叶特征。我试图在编码时遵循这些步骤,但反复遇到与输入数组的数据类型和维度相关的错误。 所以我问如何向函数输入复数值 我遵循了研究论文中的以下说明 傅立叶描述符:傅立叶描述符提供了一种编码方式 通过将每个像素位置(x,y)映射到 复数(x+y) 按顺序记录每个像素的坐标值 (沿形状顺时针移动) 使用坐标值构造复数向量 记录在步骤1中,即(x,y)→ (x+y) 取复值向量的DFT 我的问题出现在第三步 这是我的实现 def get

我正在努力实现一篇研究论文中所述的内容。它描述了如何从图像中提取傅里叶特征。我试图在编码时遵循这些步骤,但反复遇到与输入数组的数据类型和维度相关的错误。 所以我问如何向函数输入复数值

我遵循了研究论文中的以下说明

傅立叶描述符:傅立叶描述符提供了一种编码方式 通过将每个像素位置(x,y)映射到 复数(x+y)

  • 按顺序记录每个像素的坐标值 (沿形状顺时针移动)
  • 使用坐标值构造复数向量 记录在步骤1中,即(x,y)→ (x+y)
  • 取复值向量的DFT
  • 我的问题出现在第三步

    这是我的实现

    def get_dft(图像):
    坐标=cv.findNonZero(图像)
    #下面的代码删除了不必要的维度
    坐标=坐标.重塑(坐标.形状[0],2)
    y=坐标[:,1]*1j#转换为复数
    #下面的代码删除了不必要的维度
    y=y.重塑(坐标.形状[0],1)
    x=坐标[:,0]。重塑(坐标.shape[0],1)
    #下面的语句将从两个单独的数组进行转换
    #到每个元素的单个数组
    #形式为[a+jb]
    t=x+y
    #下面是发生错误的地方
    dft=cv.dft(t,标志=cv.dft\u复数输入)
    
    这就是我得到的错误

    TypeError: Expected cv::UMat for argument 'src'
    
    当我皈依为

    a=numpy.ndarray(t)
    
    我明白了

    它想说有超过32个维度。我不明白为什么会这样

    当我试着

    a=numpy.ndarray([t])
    
    我得到了错误

    TypeError: only integer scalar arrays can be converted to a scalar index
    
    简而言之,我想按照论文中提到的步骤,制作一个复数向量

    [[a+jb],[c+jd]...]    
    

    并将其传递给DFT函数。

    我找到了解决此问题的方法

    def get_dft(图像):
    坐标=cv.findNonZero(图像)
    坐标=坐标.重塑(坐标.形状[0],2).aType(浮点)
    y=坐标[:,1]。重塑(坐标.shape[0],1)
    x=坐标[:,0]。重塑(坐标.shape[0],1)
    t=cv.merge([x,y])#用于转换为2个通道
    dft=cv.dft(t,标志=cv.dft\u复数输入)
    
    我尝试了所有的numpy api,但由于我不理解的原因,所有这些似乎都失败了,但幸运的是OpenCV

    cv.merge(…)
    
    成功了

    它需要多个输入数组和连接来生成多通道输出

    我还尝试向opencvapi函数输入复数

    cv.dft(…)
    
    这不是输入复数的正确方法。

    它表示标志cv.DFT\u COMPLEX\u输入

    指定输入为复杂输入。如果设置了此标志,则输入必须有2个通道。另一方面,出于向后兼容性的原因,如果输入有2个通道,则输入已经被认为是复杂的

    请注意,我还面临的问题是转换为双通道,这是因为我没有正确理解函数输入所需的结构cv::UMat()

    总结是,
    如果要在OpenCV API函数中输入复数

    cv.dft(…)
    
    您的输入必须由2个通道组成,以完成制作双通道阵列、OpenCV函数、

    cv.merge(…)
    

    ,当您尝试组合多个单独的频道时,似乎可以正确地完成工作。

    我找到了解决问题的方法

    def get_dft(图像):
    坐标=cv.findNonZero(图像)
    坐标=坐标.重塑(坐标.形状[0],2).aType(浮点)
    y=坐标[:,1]。重塑(坐标.shape[0],1)
    x=坐标[:,0]。重塑(坐标.shape[0],1)
    t=cv.merge([x,y])#用于转换为2个通道
    dft=cv.dft(t,标志=cv.dft\u复数输入)
    
    我尝试了所有的numpy api,但由于我不理解的原因,所有这些似乎都失败了,但幸运的是OpenCV

    cv.merge(…)
    
    成功了

    它需要多个输入数组和连接来生成多通道输出

    我还尝试向opencvapi函数输入复数

    cv.dft(…)
    
    这不是输入复数的正确方法。

    它表示标志cv.DFT\u COMPLEX\u输入

    指定输入为复杂输入。如果设置了此标志,则输入必须有2个通道。另一方面,出于向后兼容性的原因,如果输入有2个通道,则输入已经被认为是复杂的

    请注意,我还面临的问题是转换为双通道,这是因为我没有正确理解函数输入所需的结构cv::UMat()

    总结是,
    如果要在OpenCV API函数中输入复数

    cv.dft(…)
    
    您的输入必须由2个通道组成,以完成制作双通道阵列、OpenCV函数、

    cv.merge(…)
    
    ,当您尝试组合多个单独的频道时,似乎可以正确完成工作

    [[a+jb],[c+jd]...]