Я прочитал этот [пост] ( Правильный способ поделиться видеокадром opencv в виде массива Numpy между многопроцессорными процессами ) и попытался завершить реализацию.Камера снимает только что найденные изображения, формы изображений, буферы и полученное изображение в другом процессе совпадают.Но полученное изображение показывает черно-белые шумовые линии.Я пытался добавить блокировки перед массивом чтения / записи, но безрезультатно.
Вот код.По сути, я хочу поместить изображение в клочок, а затем в массив, чтобы другой процесс мог прочитать изображение:
class VideoWorker(Process):
def __init__(self, shared_Array, shape,width, height, fps):
super(VideoWorker, self).__init__()
# passing width /height as want to write video file later...
self.width = width
self.height = height
self.fps = fps
self.shared_Array = shared_Array
self.shape = shape
def run(self):
name = "VideoWorker"
print ('%s %s' % (name, self.name))
cv2.namedWindow(name,cv2.WINDOW_NORMAL)
cv2.resizeWindow(name,640,480)
while True:
img = np.frombuffer(self.shared_Array,dtype=ctypes.c_uint8)
print("%s : got img shape %s " % (name, str(img.shape)))
cv2.imshow(name, img)
if cv2.waitKey(20) & 0xFF == ord('q'):
break
print("%s: done" %name)
if __name__ == '__main__':
camera = cv2.VideoCapture(0)
camera.set(cv2.CAP_PROP_FRAME_WIDTH,1280)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT,720)
width = camera.get(cv2.CAP_PROP_FRAME_WIDTH)
height = camera.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = camera.get(cv2.CAP_PROP_FPS)
cv2.namedWindow("orig",cv2.WINDOW_NORMAL)
cv2.resizeWindow("orig",640,480)
cv2.namedWindow("loop",cv2.WINDOW_NORMAL)
cv2.resizeWindow("loop",640,480)
grabbed, frame = camera.read()
shape = frame.shape
cv2.imshow("orig",frame)
print("main: shape ",shape, "size ", frame.size, "fps ",fps)
# size is L x W x channels
shared_Array = Array(ctypes.c_uint8, shape[0] * shape[1] *shape[2], lock=False)
worker = VideoWorker(shared_Array, shape, width, height, fps )
worker.start()
print("main: reshape size ",shape[0]*shape[1]*shape[2])
while True:
buf = np.frombuffer(shared_Array,dtype=np.uint8)
print("main: frombuffer shape ",buf.shape)
buf = buf.reshape(shape)
print("main: loop buf reshape ",buf.shape)
grabbed, frame = camera.read()
cv2.imshow("loop",frame)
print ("main: frame shape ",frame.shape)
if not grabbed:
break
buf[:] = frame
if worker.is_alive() == False:
break
if cv2.waitKey(20) & 0xFF == ord('q'):
break
print("Main process done")
worker.join()
camera.release()
cv2.destroyAllWindows()
На выходе получаются два хороших окна и одно черно-белое раздетое окно, а также следующие(обрезано):
VideoWorker VideoWorker-1
VideoWorker : got img shape (2764800,)
VideoWorker: done
main: shape (720, 1280, 3) size 2764800 fps 30.0
main: reshape size 2764800
main: frombuffer shape (2764800,)
main: loop buf reshape (720, 1280, 3)
main: frame shape (720, 1280, 3)
main: frombuffer shape (2764800,)
main: loop buf reshape (720, 1280, 3)
main: frame shape (720, 1280, 3)
main: frombuffer shape (2764800,)
main: loop buf reshape (720, 1280, 3)
main: frame shape (720, 1280, 3)
main: frombuffer shape (2764800,)
main: loop buf reshape (720, 1280, 3)
main: frame shape (720, 1280, 3)
Main process done
Немного застрял при совместном использовании кадров в массивах.У меня очереди работают просто отлично.Первый пост в stackoverflow.Предложения?