PyObject_CallMethod返回Null

时间:2015-11-09 21:42:45

标签: python c++ python-2.7 opencv numpy

我有一个图像处理应用程序,我在Python中使用OpenCV,然后将其嵌入到Embarcadero C ++ XE6 IDE for Windows中。

我遵循了所有伟大的exampled,并且能够在裸应用程序中使用嵌入式Python代码。但是,当我尝试使用numpy(loadImage)时,我收到以下错误:

<type 'exception.AttributeError'>:'NoneType' object has no attribute 'dtype'

如果我只是用True返回Python函数(现在已注释掉),它将返回一个有效的PyObject。如果我尝试用numpy平均像素的强度,它会返回一个NULL对象。

我想我没有正确设置导入。独立的Python应用程序按预期工作,但在嵌入到我的C ++应用程序中时却没有。

Python代码:

import numpy
import cv2

class Camera:      

def __init__(self):
    print 'OpenCV Version:', cv2.__version__

def loadImage(self):
    '''
       Load image from file
    '''
    global img
    img = cv2.imread('cameraImageBlob.png',cv2.IMREAD_GRAYSCALE)
    #return True
    return numpy.average(img)         

if __name__ == '__main__':
    dc = Camera()
    print dc.loadImage()

C ++代码:

#include "Python.h"

int main() {
    PyObject *pName, *pModule, *pDict, *pFunc, *pValue, *pClass, *pInstance;

    double dValue;

    // Initilize the Python interpreter
    Py_Initialize();

    // Set runtime paths
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("import numpy");
    PyRun_SimpleString("import cv2");

    // Build the name object - create a new reference
    pName = PyString_FromString((char*)"OpenCVTest");

    // Load the module object
    pModule = PyImport_Import(pName);

    if(pModule != NULL) {
        //pDict is a borrowed reference so no DECREF
        pDict = PyModule_GetDict(pModule);

        // Get the Camera Class
        pClass = PyDict_GetItemString(pDict, "Camera");
        if(PyCallable_Check(pClass)) {
           pInstance = PyObject_CallObject(pClass, NULL);
        } else {
           return;
        }

        // Load Image and get intensity
        pValue = PyObject_CallMethod(pInstance, "loadImage", NULL);
        if(pValue == NULL) {
           GetError();
        } else {
           dValue = PyFloat_AsDouble(pValue);
        }
    }

    Py_DecRef(pName);
    Py_DecRef(pModule);
    Py_DecRef(pValue);
    Py_Finalize();

    return 0;
}

0 个答案:

没有答案