【发布时间】:2015-01-28 08:37:10
【问题描述】:
我正在扩展一个 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++ 并且它可以工作。
标签: python c opencv gcc ctypes