我希望能够使用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描述符。
答案 0 :(得分:7)
所以,它奏效了。
使功能可访问:。
我对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*/)
{
...
}
我将以下内容添加到/modules/contrib/include/opencv2/include/contrib.hpp
命名空间下的cv
:
CV_EXPORTS_W void elbp(InputArray src, OutputArray dst, int radius, int neighbors);
release
文件夹。在该文件夹中,我跑了:
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
下创建的cv2.so共享对象,并将其放在python查找包的位置。对我而言,它是/usr/local/lib/python2.7/dist-packages/
运行python
from cv2 import spatial_histogram
瞧!
答案 1 :(得分:2)
这实际上是同一个问题(如果不是同一个问题),how to call a dll in python - 但是可以使用ctypes或swig但是因为有已经是OpenCV的python接口,最好的办法是看看现有的如何完成。
要查看当前系统的工作原理,请查看CMakeLists.txt
中的opencv/modules/python
,您会发现opencv/modules/python/src2/gen2.py
创建了许多生成的标头 - 您需要花费一段时间看这两个文件。