python - 使用 OpenCV C API 的 Python 扩展的 undefined symbol

标签 python c opencv gcc ctypes

我正在扩展一个 C 扩展以使用 OpenCV,并开始使用 cvtColor,但我收到一个 undefined symbol 错误。我认为可能是我混淆了 C 和 C++,或者可能是错误地加载了库。我将错误归结为这段 C 代码:

测试.c:

#include <cv.h>

void BGR2HLS(const void * srcv, void * dstv, int elems) {
    const uint8_t * src = (uint8_t *) srcv;
    uint8_t * dst = (uint8_t *) dstv;
    cvtColor(src, dst, CV_BGR2HLS);
}

我编译使用:

gcc -fPIC -shared -o test.so test.c -L/usr/lib/ `pkg-config --cflags opencv` -lopencv_imgproc -lopencv_core

我看到/usr/lib/libopencv_imgproc.so 存在,并且所有内容都可以正确编译。

然后我尝试运行这个 Python 脚本:

import numpy as np
import os.path
import ctypes
import cv2

test_module = ctypes.CDLL(
    os.path.join(os.path.dirname(__file__), './test.so'))

test_module.BGR2HLS.argtypes = [
    ctypes.c_void_p, ctypes.c_void_p, ctypes.c_int
]

if __name__ == '__main__':
    img_data = cv2.imread('../test_data/FixedUIDesign.jpg')
    h, w, d = img_data.shape
    img_data_out = np.array(img_data, dtype=np.uint8)
    test_module.BGR2HLS(img_data.ctypes.data, img_data_out.ctypes.data, h*w)

并出现以下错误(我正在尝试添加 RTLD_GLOBAL 标志):

Traceback (most recent call last):
  File "c_tests.py", line 6, in <module>
    os.path.join(os.path.dirname(__file__), './test.so'), ctypes.RTLD_GLOBAL)
  File "/usr/lib/python2.7/ctypes/__init__.py", line 365, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./test.so: undefined symbol: cvtColor

我看到opencv_imgproc存在,编译无误时可以指向它。我也可以看到与我想要的符号类似的东西:

$ nm -D /usr/lib/libopencv_imgproc.so | grep cvtColor
00000000000b65a0 T _ZN2cv8cvtColorERKNS_11_InputArrayERKNS_12_OutputArrayEii

奇怪的名字是问题的症结所在吗?我构建/使用扩展程序的方式有什么问题/缺失?

最佳答案

切换到 C++ 解决了这个问题。幸运的是我有灵 active 。

关于python - 使用 OpenCV C API 的 Python 扩展的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27209769/

相关文章:

C 格式的字符串 - 如何将前导零添加到 float 和 int 值?

c++ - 第二次运行时 while 循环中的 OPEN CV image.at<Vec3b>(b,a) 函数错误

python - python 作为服务的 xlsxwriter 中的 "No such file or directory"

c - 如何正确内联静态库

python - 如何将嵌套的命名元组转换为字典?

c - 程序流卡在函数中

c++ - OpenCV 模板化代码在派生类中产生编译错误

python - 如何在 Python OpenCV 中找到轮廓边界框的左上角

python - 如何用与 B 列相关的平均值替换 A 列中的 NaN 值?

python - 重复字符串部分之间的值