2011-09-16 34 views
5

Tôi đang tìm cách bọc một lớp C++ thực hiện một thuật toán mà tôi đã viết bằng cách sử dụng Opencv 2.3. Tôi biết rằng có python wrappers cho opencv như một toàn thể nhưng những gì tôi cần là để bọc mã của riêng tôi trong đó sử dụng opencv. Điều này có vẻ hợp lý bởi vì mức độ thấp hơn của thuật toán của tôi sẽ được biên dịch nhanh C++ mã và tôi sẽ được tự do để gọi nó từ python và xây dựng một hệ thống xung quanh nó.Tạo một trình bao bọc Python cho thuật toán của tôi sử dụng Opencv 2.3

lớp của tôi là thực sự khá đơn giản, nó có 4 phương pháp chính:

void train(std::vector<cv::Mat>); 
    void save(); 
    void load(); 
    bool detect(cv::Mat); 

Đây thực chất là đa số những gì tôi cần phải quấn. Vấn đề là tôi không biết cách tốt nhất để làm điều này. Tôi đã xem xét ctypes, swig, tăng python và pyplusplus. Tôi đã không thành công với bất kỳ điều nào kể trên cho đến nay.

Tôi tiếp tục gặp sự cố với cách bao bọc đối tượng opencv cv :: Mat. Từ python tôi sẽ được sử dụng mảng numpy vì vậy tôi biết tôi cần mã chuyển đổi từ một mảng numpy đến một cv :: Mat và tôi phải đăng ký nó.

Tôi cảm thấy như một người nào khác phải cố gắng một cái gì đó như thế này tại một thời điểm, nếu bạn có thể giúp tôi ra nó nhiều được đánh giá cao


Chỉ cần nhắc lại mục tiêu: Quấn c của tôi ++ lớp trong đó sử dụng OpenCV vào một thư viện python để tôi có thể sử dụng thuật toán của tôi từ python.

Tôi nghĩ rằng tôi có chuyển đổi phần nào tìm ra (với sự giúp đỡ của nguồn opencv) nhưng tôi vẫn sẽ không làm việc từ python.

Được rồi vì vậy tôi đã làm việc với mã được liên kết đến trong bài đăng trên (chuyển đổi từ numpy thành cv :: Mat) và tôi vẫn gặp phải sự cố. Tôi sẽ đăng mã của tôi và hy vọng một người hiểu biết nhiều hơn tôi có thể giúp tôi ở đây.

Ví dụ ở đây là một lớp đơn giản:

foo.h:

#include <opencv2/core/core.hpp> 

class Foo { 
    public: 
     Foo(); 
     ~Foo(); 

     cv::Mat image; 

     void bar(cv::Mat in); 
}; 

Foo.cpp:

#include "foo.h" 

    Foo::Foo(){} 

    Foo::~Foo(){} 

    void Foo::bar(cv::Mat in) { 
     image = in; 
     cv::Canny(image, image, 50, 100); 
     cv::imwrite("image.png", image); 
    } 

Và đây là nơi mà tôi đã cố gắng để quấn lớp này sử dụng boost :: python và bit mã từ liên kết ở trên:

wrap_foo.cpp

#include <boost/python.hpp> 
#include <numpy/arrayobject.h> 

#include <opencv2/core/core.hpp> 

#include "foo.h" 

using namespace cv; 
namespace bp = boost::python; 

//// Wrapper Functions 
void bar(Foo& f, bp::object np); 

//// Converter Functions 
cv::Mat convertNumpy2Mat(bp::object np); 

//// Wrapper Functions 
void bar(Foo& f, bp::object np) 
{ 
    Mat img = convertNumpy2Mat(np); 
    f.bar(img); 
    return; 
} 


//// Boost Python Class 
BOOST_PYTHON_MODULE(lib) 
{ 
    bp::class_<Foo>("Foo") 
     .def("bar", bar) 
     ; 
} 


//// Converters 
cv::Mat convertNumpy2Mat(bp::object np) 
{ 
    Mat m; 
    numpy_to_mat(np.ptr(),m); 
    return m; 
} 

Chức năng numpy_to_mat là từ thư viện pano_cv nhưng từ chơi xung quanh với nguồn opencv chính thức, tôi biết rằng chức năng này cũng có ở một mức độ nào đó. Tệp đầy đủ có chức năng bên dưới những gì tôi đã viết ở trên. Mã này biên dịch với bjam tốt nhưng khi tôi nhập vào python nó bị treo. Lỗi này là: libFoo.so: undefined symbol: _ZN2cv3Mat10deallocateEv. Tôi đã thử một số thứ khác nhau nhưng tôi không thể làm việc này được.

Trợ giúp được đánh giá cao nhất.

Trả lời

1

tôi thấy một số mã trên google có thể chuyển đổi mảng NumPy để cv :: mat trong C++ sử dụng tăng :: python: link

+0

Cảm ơn! Tôi đã không có cơ hội để tích hợp điều này với mã của tôi nhưng nó trông giống như chính xác những gì tôi cần. – Kevin

+1

Liên kết không hoạt động ... –

+0

@Kevin Bạn có thể vui lòng đăng liên kết cập nhật không? Liên kết này không hoạt động –

Các vấn đề liên quan