libccv - 如何从内存中的字节读取图像

时间:2017-08-10 09:02:30

标签: python c computer-vision swig

我正在尝试使用libccv和Python(我使用SWIG创建了包装器)。我的方案如下:

  1. 我有内存中的图像
  2. 我想将这个图像(字节)传递给C函数,用SWIG包装为Python。
  3. C代码将使用libccv函数
  4. 处理图像

    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从内存中读取图像的正确方法是什么?

1 个答案:

答案 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