【问题标题】:Exposing the LBP descriptors from OpenCV in Python在 Python 中从 OpenCV 公开 LBP 描述符
【发布时间】:2013-08-27 22:01:49
【问题描述】:

我希望能够使用 OpenCV 在 python 中计算 LBP 描述符。 根据this我需要重新编译openCV。

我更改了opencv-2.4.6.1/modules/contrib/src/facerec.cpp 中的elbp() 函数,因此它们不再是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,我按照指令 here 创建了 cv2.so 共享对象。

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

例如python中存在cv2.HogDescriptor()函数,我想同样暴露LBP描述符。

【问题讨论】:

    标签: c++ python opencv


    【解决方案1】:

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

    还值得一看 pyopencv,它提供了一个基于 Boost 的界面。

    更新:

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

    【讨论】:

    • 谢谢史蒂夫。我的问题是如何使用现有的界面。我不明白它是如何工作的以及它如何链接到 python。
    • 它成功了,我回答了这个问题以帮助所有未来的搜索:) 非常感谢史蒂夫!
    【解决方案2】:

    所以,它奏效了。

    要使函数可访问:.

    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.hppcv 命名空间下添加了以下内容:

      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
      

    瞧!

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 2012-06-14
      • 2010-10-27
      • 2017-01-14
      • 1970-01-01
      • 2016-02-10
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多