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
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.
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.
So, it worked.
To make the function accessible: .
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*/)
{
...
}
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);
release
folder in the opencv root.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 ..
make
/lib
and put it where python looks for the packages. For me, it was /usr/local/lib/python2.7/dist-packages/
run python
from cv2 import spatial_histogram
Voila!