python:将共享内存数组传递给多处理线程中的C ++函数

时间:2016-02-26 17:03:41

标签: python c++ opencv shared-memory python-multiprocessing

我真的很绝望。

我正在使用Boost.Python在c ++中编写一些OpenCV方法,并从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中的另一个数组中。然后我没有收到任何错误消息,但它没有显示任何内容。

0 个答案:

没有答案