Exposing the LBP descriptors from OpenCV in Python

前端 未结 2 1526
梦如初夏
梦如初夏 2021-01-06 04:33

I want to be able to calculate the LBP discriptor in python using OpenCV. According to this I need to compile openCV again.

I changed the elbp() functio

相关标签:
2条回答
  • 2021-01-06 05:26

    This is actually the same problem, if not the same question, as how to call a dll in python - But you can use either ctypes or swig however since there is already a python interface into OpenCV your best bet is to take a look to see how the existing one is done.

    It may also be worth taking a look at pyopencv which provides a Boost based interface.

    Update:

    To see how the current system does things take a look at CMakeLists.txt in opencv/modules/python and you will find that a number of generated headers are created by opencv/modules/python/src2/gen2.py - you will need to spend some time looking at these two files.

    0 讨论(0)
  • 2021-01-06 05:27

    So, it worked.

    To make the function accessible: .

    1. I made the following change to facerec.cpp, from:

      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*/)
      {
      ...
      }
      

      to:

      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. I added the following into /modules/contrib/include/opencv2/include/contrib.hpp under the cv namespace:

      CV_EXPORTS_W void elbp(InputArray src, OutputArray dst, int radius, int neighbors);
      
    3. I then creted a release folder in the opencv root.
    4. From within that folder, I ran:

      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. Next, I ran make
    6. take the cv2.so shared object created under /lib and put it where python looks for the packages. For me, it was /usr/local/lib/python2.7/dist-packages/
    7. run python

      from cv2 import spatial_histogram
      

    Voila!

    0 讨论(0)
提交回复
热议问题