簡體   English   中英

使用OpenCV C API進行Python擴展的未定義符號

[英]Undefined symbol with Python extention using OpenCV C API

我正在擴展C擴展名以使用OpenCV,並開始使用cvtColor,但出現了未定義的符號錯誤。 我認為可能是我混淆了C和C ++,或者可能是錯誤地加載了庫。 我將錯誤歸結為以下C代碼:

test.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 ++解決了該問題。 幸運的是我有靈活性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM