包装python的c++类(使用opencv),给出“未定义符号”

2024-04-25 09:16:13 发布

您现在位置:Python中文网/ 问答频道 /正文

背景: 我正在尝试包装一个c++类,以便可以从python中使用它。但是只要我使用opencv中的任何东西(比如:“cv::Mat frame;”我就会得到一个“undefined symbol”错误。一旦我删除了“cv::VideoCapture wcam;”一行,所有的代码都会按照它应该的方式编译和执行。在

我做错什么了?在

在网络摄像头.cpp公司名称:

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
using namespace cv;
using namespace std;


class webcam{
    private:
        cv::VideoCapture wcam;
    public:
        webcam();
        void nextFrame();
        //cv::Mat getNewFrame();
};


webcam::webcam(){}
void webcam::nextFrame(){
    std::cout << "TESTING TESTING";
}


extern "C" {
    webcam* webcam_new(){ return new webcam(); }
    void test(webcam* wc) {wc->nextFrame();}
    //void Foo_bar(Foo* camCon){ foo->bar(); }
}

编译:

^{pr2}$

在凸轮.py公司名称:

import cv2
import numpy as np

from ctypes import cdll
lib = cdll.LoadLibrary('./webcam.so')

class camCon(object):
    def __init__(self):
        self.obj = lib.webcam_new()
     def test(self):
        lib.test(self.obj)

fooo = camCon()
fooo.test()

错误输出:

Traceback (most recent call last):
  File "wrapp.py", line 5, in <module>
    lib = cdll.LoadLibrary('./webcam.so')
  File "/usr/lib/python2.7/ctypes/__init__.py", line 443, in LoadLibrary
    return self._dlltype(name)
  File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./webcam.so: undefined symbol: _ZN2cv12VideoCaptureC1Ev

(我知道可以在python中直接使用openCV)

更新

我发现使用 “cv::Mat帧” 可以。但是 “cv::VideoCapture网络摄像头” 不是。在

谢谢!在


Tags: pytestimportselfnewincludeinitlib
2条回答

已解决:

在为共享库编译时,我必须像这样添加库:

g++ -shared -Wl,-soname,webcam.so -o webcam.so  webcam.o -lopencv_core -lopencv_highgui -lopencv_imgproc

我知道这是愚蠢的,我想补充一点意见,但我的代表是坏的。。。。在

不管怎样,既然已经在使用using namespace cv指令,您是否尝试删除cv::部分?在

我也不确定cv和{}之间有什么相似之处?我不太确定他们是同一件事。在

相关问题 更多 >