在Python中公开来自OpenCV的LBP描述符

时间:2013-08-25 07:35:49

标签: c++ python opencv

我希望能够使用OpenCV计算python中的LBP描述符。 根据{{​​3}},我需要再次编译openCV。

我更改了elbp()中的opencv-2.4.6.1/modules/contrib/src/facerec.cpp函数,因此它们不再是statisc。 现在我必须在HFile中声明它们(假设我创建了elbp.hpp,或者我应该将它添加到现有文件中?):

// This is a header file created to expose the elbp (evaluate LBP) functions

#include "opencv2/core/core.hpp"

namespace cv {

Mat elbp(InputArray src, int radius, int neighbors);
Mat elbp(InputArray src, OutputArray dst, int radius, int neighbors);
Mat spatial_histogram(InputArray _src, int numPatterns, int grid_x, int grid_y, bool /*normed*/);
};

为了编译OpenCV,我遵循了this指令,并创建了cv2.so共享对象。

我的问题是,如何创建python“wrappers”(如果我使用正确的单词)能够从python调用elbp()函数?我觉得我在这里错过了至关重要的一步。

例如,python中存在cv2.HogDescriptor()函数,我想类似地公开LBP描述符。

2 个答案:

答案 0 :(得分:7)

所以,它奏效了。

使功能可访问:。

  1. 我对facerec.cpp做了以下更改,来自:

    static void elbp(InputArray src, OutputArray dst, int radius, int neighbors)
    {
    ...
    }    
    
    static Mat elbp(InputArray src, int radius, int neighbors) {
        Mat dst;
        elbp(src, dst, radius, neighbors);
        return dst;
    }
    
    static Mat spatial_histogram(InputArray _src, int numPatterns,
                             int grid_x, int grid_y, bool /*normed*/)
    {
    ...
    }
    

    为:

    void elbp(InputArray src, OutputArray dst, int radius, int neighbors)
    {
    ...
    }    
    
    Mat elbp(InputArray src, int radius, int neighbors) {
        Mat dst;
        elbp(src, dst, radius, neighbors);
        return dst;
    }
    
    Mat spatial_histogram(InputArray _src, int numPatterns,
                             int grid_x, int grid_y, bool /*normed*/)
    {
    ...
    }
    
  2. 我将以下内容添加到/modules/contrib/include/opencv2/include/contrib.hpp命名空间下的cv

    CV_EXPORTS_W void elbp(InputArray src, OutputArray dst, int radius, int neighbors);
    
  3. 然后我在opencv根目录中创建了一个release文件夹。
  4. 在该文件夹中,我跑了:

    cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON -D WITH_TBB=ON -D BUILD_EXAMPLES=ON ..
    
  5. 接下来,我运行了make
  6. 获取在/lib下创建的cv2.so共享对象,并将其放在python查找包的位置。对我而言,它是/usr/local/lib/python2.7/dist-packages/
  7. 运行python

    from cv2 import spatial_histogram
    
  8. 瞧!

答案 1 :(得分:2)

这实际上是同一个问题(如果不是同一个问题),how to call a dll in python - 但是可以使用ctypesswig但是因为有已经是OpenCV的python接口,最好的办法是看看现有的如何完成。

也许值得一看pyopencv提供基于Boost的界面。

更新

要查看当前系统的工作原理,请查看CMakeLists.txt中的opencv/modules/python,您会发现opencv/modules/python/src2/gen2.py创建了许多生成的标头 - 您需要花费一段时间看这两个文件。