将垫从C传递给python

时间:2018-03-16 02:27:01

标签: python c++ opencv ctypes mat

我需要将C函数的Mat结果返回给Python并将其转换为numpy.array。在我打电话之前,我不知道结果Mat的大小,因此我无法将指针传递给现有数组。这是我的代码:

的Python:

def Utils_FindFeatures(image):
    comDll.FindFeatures.argtypes = [ndpointer(c_uint8, flags="C_CONTIGUOUS"), c_size_t, c_size_t, c_size_t, ndpointer(c_uint8, flags="C_CONTIGUOUS")] 
    comDll.FindFeatures.restype = None
    descriptors = ???
    comDll.FindFeatures(image.astype(c_uint8), image.shape[0], image.shape[1], 0, descriptors)

C ++

uchar* MatToBytes(Mat image, int& image_size)
{
    image_size = image.total() * image.elemSize();
    uchar * image_uchar = new uchar[image_size];
    //image_uchar is a class data member of uchar*
    std::memcpy(image_uchar, image.data, image_size * sizeof(uchar));
    return image_uchar;
}

Mat BytesToMat(int image_rows, int image_cols, int image_type, void* image_uchar)
{

   Mat img(image_rows, image_cols, image_type, image_uchar, cv::Mat::AUTO_STEP);
   return img;
}

static SurfFeaturesFinder sf;
void FindFeatures(const int* image_uchar, int image_rows, int image_cols, int image_type, int* descriptors)
{
    ImageFeatures features;
    Mat img = BytesToMat(image_rows, image_cols, image_type, (void*)image_uchar);
    sf(img, features);

    int size = 0;
    Mat matDescriptor;
    features.descriptors.copyTo(matDescriptor);
    descriptors = (int*) MatToBytes(matDescriptor, size);
}

显然"描述符"没有更新。 我还需要返回KeyPoint,但是我会在第一步之后处理它。

0 个答案:

没有答案