Я вызываю функцию Python из C ++ (MFC), используя Python C. API.
Например ...
C ++ Code
Py_Initialize();
PyEval_InitThreads();
PyThreadState* save = PyEval_SaveThread();
PyGILState_STATE state = PyGILState_Ensure();
PyObject* module = PyImport_ImportModule("scripts.KerasModule");
if (module) {
PyObject* functionName = PyObject_GetAttrString(module, "PythonFuncName");
if (functionName) {
PyObject* result = PyEval_CallObject(functionName, Mat(opencv));
if (result) {
int r = (int)PyLong_AsLong(result);
}
}
PyGILState_Release(state);
PyEval_RestoreThread(save);
.Py Code
def PythonFuncName(image=None):
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
pil_image = Image.fromarray(image)
np_image = np.array(pil_image).astype('float32')/255
np_image = transform.resize(np_image, (100, 100, 3))
np_image = np.expand_dims(np_image, axis=0)
global model
if(model == 0):
return -1
cv2.imshow('asdasd', image)
cv2.waitKey(delay=300)
startTime = time.time()
out = model.predict(np_image) # << ????
endTime = time.time()
tackTime = endTime - startTime
print("ptime : " + str(tackTime))
print("out : " + str(out))
print("---------------- Predict Complite ----------------\n")
if (out > 0.5):
return 1
else:
return 0
Однажды этот код обычно работает хорошо.
Но, когда я вызываю функцию из потока (std :: thread),
out = model.predict(np_image)
Эта строка нене работает.
cv2.imshow('asdasd', image)
cv2.waitKey(delay=300)
imshow работает.
Я думаю ... std :: Кажется, есть проблема при вызове связанной с Keras функции из потока. У вас есть информация об этом?