Я действительно отчаялся.
Я работаю с Boost.Python, чтобы написать некоторые методы OpenCV на c ++ и получить доступ к ним из python. Упрощенно Я хочу прочитать видеопоток с моей веб-камеры в Python и отобразить их с помощью функции в C ++. Я хочу сделать это асинхронно, используя многопроцессорность модуля Python. Это должно быть в режиме реального времени, поэтому просто конвертировать это не вариант для меня (это занимает много времени, добавляя время для моих расчетов раньше).
Поэтому у меня возникла идея использовать массив разделяемой памяти из многопроцессорного модуля в Python.
То, что я получил до сих пор, выглядит почти так:
videoStream.py
import displayImage as di #shared object with access to c++ methods
import multiprocessing as mp
import cv2
import ctypes
import numpy as np
def readImage(stream, frame):
while True:
check, frame = stream.read()
if not check:
break
if cv2.waitKey(1) & 0xFF == ord('q'):
break
stream.release()
cv2.destroyAllWindows()
#Main
stream = cv2.VideoCapture(0)
displayImg = di.displayImage()
check, frame = stream.read()
array_size = frame.shape[0] * frame.shape[1] * frame.shape[2]
shared_arr = mp.Array(ctypes.c_uint8, array_size)
np_array = np.frombuffer(shared_arr.get_obj(), dtype=np.uint8)
process_read = mp.Process(target=readImage, args=(stream, np_array))
process_show = mp.Process(target=displayImg.displayImage, args=shared_arr)
process_read.start()
process_show.start()
process_show.join()
process_read.join()
displayImg.cpp
//Some functions and code
void multiThread::displayImage(PyObject* sharedArr){
Py_buffer pybuf;
PyObject_GetBuffer(sharedArr, &pybuf, PyBUF_SIMPLE);
void* vp = pybuf.buf;
unsigned char* img = (unsigned char*)vp;
while(true){
Mat image = Mat(640, 480, CV_8UC1, img);
imshow("WebCam Image", image);
if(waitKey(1) == 27){
break;
}
}
destroyAllWindows();
}
Он компилируется и не показывает никаких ошибок. Но когда я хочу запустить его, я получаю:
int, int, int ….
не соответствует сигнатуре C ++:
displayImage (multiThread {lvalue}, unsigned char *)
Итак, как я могу передать правильный указатель на этот массив совместно используемой памяти?
Спасибо за помощь!
PS:
Я также попытался упаковать массив разделяемой памяти в другой массив на python. Тогда я не получил сообщение об ошибке, но он ничего не отображал.
Задача ещё не решена.
Других решений пока нет …