python: передача массива совместно используемой памяти в функцию C ++ в многопроцессорном потоке

Я действительно отчаялся.

Я работаю с 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. Тогда я не получил сообщение об ошибке, но он ничего не отображал.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]