Interfacing Python + C + OpenCV via ctypes
I was recently asked to help a colleague access his image processing C-library from python; quite a common task. As those of you who are familiar with Python might realise, there are a whole bag of ways that this can be accomplished;
In this case the colleague only needed to access a single function from the library returning image data, and then hand this result onto OpenCV. One happy side effect of the new (> v2.1) python-opencv bindings is that they do no validation on CvImage.SetData, which means you can pass an arbitrary string/pointer. Because of this I advised him I thought using something like SWIG was overkill, and he could just write a wrapper to his library using ctypes, or a thin python extension directly.
Image data contains embedded NULLs, and I could not find a concise example of dealing with non null-terminated, non-string char * arrays via ctypes so I wrote one.
# char *test_get_data_nulls(int *len); func = lib.test_get_data_nulls func.restype = POINTER(c_char) func.argtypes = [POINTER(c_int)] l = c_int() data = func(byref(l)) print data,l,data.contents
and, another approach
# void test_get_data_nulls_out(char **data, int *len); func_out = lib.test_get_data_nulls_out func_out.argtypes = [POINTER(POINTER(c_char)), POINTER(c_int)] func.restype = None l2 = c_int() data2 = POINTER(c_char)() func_out(byref(data2), byref(l2)) print data2,l2,data2.contents
The full code can be found here and contains examples showing how to deal with data of this type using ctypes, and by writing a simple python extension linking with the library in question.