我有一个图像处理应用程序,我在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;
}