我正在尝试使用libccv和Python(我使用SWIG创建了包装器)。我的方案如下:
libccv
函数Python代码:
bytes = open("input.jpg","rb").read()
result = ccvwrapper.use_ccv(bytes, 800, 600)
C代码:
int use_ccv(char *bytes, int width, int height){
int status = 0;
ccv_enable_default_cache();
ccv_dense_matrix_t* image = 0;
ccv_read(bytes, &image, CCV_IO_ANY_RAW, width, height, width * 3);
if (image != 0)
{
//process the image
ccv_matrix_free(image);
status = 1;
}
ccv_drain_cache();
return status;
}
我尝试了type, rows, cols, scanline
ccv_read
image
参数的几种组合,但每当我得到 SIGSEV 或0
变量为{{1}时}。
我不想使用ccv_read
函数重载,因为我不想引入将图像写入磁盘的开销。
使用libccv从内存中读取图像的正确方法是什么?
答案 0 :(得分:0)
我已经弄明白了,诀窍是使用 fmemopen()
功能,打开内存作为流,进一步可以通过API读取,接受FILE*
指针。
完整代码:
int* swt(char *bytes, int array_length, int width, int height){
ccv_dense_matrix_t* image = 0;
FILE *stream;
stream = fmemopen(bytes, array_length, "r");
if(stream != NULL){
int type = CCV_IO_JPEG_FILE | CCV_IO_GRAY;
int ctype = (type & 0xF00) ? CCV_8U | ((type & 0xF00) >> 8) : 0;
_ccv_read_jpeg_fd(stream, &image, ctype);
}
if (image != 0){
// here we have access to image in libccv format, so any processing can be done
}
}
Python的用法(在使用SWIG构建C代码之后):
import ccvwrapper
bytes = open("test_input.jpg", "rb").read()
results = ccvwrapper.swt(bytes, len(bytes), 1024, 1360) # width:1024, height:1360
我在博文中解释了所有细节:http://zablo.net/blog/post/stroke-width-transform-swt-python