如何使用Boost :: Python编译OpenCV?

时间:2016-10-02 00:12:30

标签: c++ opencv boost

我试图用boost::python在C ++中编译OpenCV,但我一直收到一个我无法解决的链接器错误。

以下是代码。

cascade_handler.cpp

#include <iostream> 

#include <boost/python.hpp>

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/objdetect/objdetect.hpp> 
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ocl/ocl.hpp>

#include "cascade_handler.h"

using namespace std;
using namespace boost::python;

void CascadeHandler::cascade_classifier_cpu(const string *cascade_file, std::vector<cv::Rect>& objects, double scale_factor, int min_neighbors){
    /*cv::Mat image;
    cv::CascadeClassifier cascade_classifier;

    cascade_classifier.load(*cascade_file);
    cascade_classifier.detectMultiScale(image, objects, scale_factor, min_neighbors, 0 | CASCADE_SCALE_IMAGE, Size(20, 20));
    */
}

void CascadeHandler::cascade_classifier_gpu(const string *cascade_file, std::vector<cv::Rect>& objects, double scale_factor, int min_neighbors){
    /*Mat image;
    cv::CascadeClassifier cascade_classifier;
    */
}

void CascadeHandler::handle(const string cascade_file, std::vector<cv::Rect>& objects, double scale_factor, int min_neighbors)
{   

    CascadeHandler cascade_handler;
    cv::CascadeClassifier cascade_classifier;
    //ocl::Context context;

    /*
    if (!cascade_classifier.load(cascade_file)){
        cout << "[!] Error: You must load a Cascade file\n";
    }
    if (objects.empty()){
    }
    if (scale_factor == 0){
        cout << "[!] Error: Unacceptable Scale Factor\n";
    }
    if (min_neighbors == 0){
        cout << "[!] Error: Unacceptable Minimum Neighbors\n"; 
    }

    if (context.ndevices()){
        cascade_handler.cascade_classifier_gpu(&cascade_file, objects, scale_factor, min_neighbors);
    }
    else if (!context.ndevices()){
        cascade_handler.cascade_classifier_cpu(&cascade_file, objects, scale_factor, min_neighbors);
    }
    */
}

void cascade_handler_wrapper(const string cascade_file, std::vector<cv::Rect>& objects, 
                            double scale_factor, int min_neighbors){
    CascadeHandler cascade_handler;
    cascade_handler.handle(cascade_file, objects, scale_factor, min_neighbors);
}

BOOST_PYTHON_MODULE(cascade_handler){
    def("handle", cascade_handler_wrapper);
}

标头文件

#ifndef _CASCADE_HANDLER
#define _CASCADE_HANDLER

#include <iostream> 

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/objdetect/objdetect.hpp> 
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ocl/ocl.hpp>

using namespace std;

class CascadeHandler
{
public:
    void cascade_classifier_cpu(const string *cascade_file, std::vector<cv::Rect>& objects, double scale_factor, int min_neighbors);
    void cascade_classifier_gpu(const string *cascade_file, std::vector<cv::Rect>& objects, double scale_factor, int min_neighbors);
    void handle(const string cascade_file, std::vector<cv::Rect>& objects, double scale_factor, int min_neighbors);
};

#endif

Makefile

CPP = g++
CPPFLAGS = -g -Wall -std=c++11

INCLUDES = -I /usr/local/include
LDFLAGS = -L /usr/local/lib
ARCH := $$(getconf LONG_BIT)

CUDA_PATH = /opt/cuda
CUDA_LDFLAGS = -L$(CUDA_PATH)/lib$(ARCH)
CUDA_INCLUDES = -I$(CUDA_PATH)/include

OPENCV_LDFLAGS = $(CUDA_LDFLAGS)
OPENCV_LIBS = $$(pkg-config --libs opencv)
OPENCV_INCLUDES = $$(pkg-config --cflags opencv) $(CUDA_INCLUDES)

PYTHON_VER = 2
ifeq ($(PYTHON_VER), 2)
  BOOST_LIBS = -lboost_python
else
  BOOST_LIBS = -lboost_python$(PYTHON_VER)
endif
PYTHON_LIBS = $$(pkg-config --libs python$(PYTHON_VER))
PYTHON_INCLUDES = $$(pkg-config --cflags python$(PYTHON_VER))

TARGET = cascade_handler

all: $(TARGET).so

$(TARGET).so: $(TARGET).o 
    $(CPP) -shared  -Wl,--export-dynamic $(LDFLAGS) \
    $(OPENCV_LIBS) $(BOOST_LIBS) $(PYTHON_LIBS) \
    $(TARGET).o -o $(TARGET).so

$(TARGET).o: $(TARGET).cpp
    $(CPP) $(CPPFLAGS) $(INCLUDES) $(OPENCV_INCLUDES) $(PYTHON_INCLUDES) \
    -fPIC -c $(TARGET).cpp

clean:
    rm -f *.o *.so

输出

g++ -shared  -Wl,--export-dynamic -L /usr/local/lib \
    $(pkg-config --libs opencv) -lboost_python $(pkg-config --libs python2) \
    cascade_handler.o -o cascade_handler.so
ld: unknown option: --export-dynamic
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [cascade_handler.so] Error 1

链接器错误是我无法解决的问题。我希望在Makefile上编译所有内容,因为我无法找到使用setup.py时使用boost::python编译OpenCV的方法。我还读到有些人一直在使用numpy来包装他们的代码然后以这种方式编译,但我想知道这种方法是否也可以工作?我也将大部分代码注释掉了,因为我只想测试它是否可以通过只有类cv::CascadeClassifier cascade_classifier;进行编译

0 个答案:

没有答案