Python多进程之间使用共享内存传递图像数据

Python中通常使用管道、队列和共享内存等方式进行多进程之间的通信,但是前两者的速度堪忧,无法进行高速数据传递,C数据类型的共享内存则可以很好的解决这个问题。

关键在于

frame = frame.flatten(order='C')
temp = np.frombuffer(self.arr, dtype=np.uint8)
temp[:] = frame

完整代码
以下为图像采集进程代码

# -*- coding: utf-8 -*-
# @Time : 2021/9/11 18:48
# @Author : 67689e4f
# @Email : 964342226@qq.com
# @File : camera.py
import ctypes

import cv2
from multiprocessing import Process,sharedctypes
import time
import numpy as np
class Camera_p(Process):
def __init__(self, arr, isGrab):
super(Camera_p, self).__init__()
self.arr = arr
self.isGrab = isGrab

def run(self):
cap = cv2.VideoCapture(0)
while self.isGrab.value:
_, frame = cap.read()
cv2.waitKey(1)
frame = frame.flatten(order='C')
# frame = np.reshape(frame, (640*480*3, 1))
# frame_send = np.recarray(shape=(1,640*480*3), dtype=ctypes.c_int8, buf=self.arr)
# np.copyto(frame_send, frame) # 需要0.5秒,不理想
t_0 = time.time()
temp = np.frombuffer(self.arr, dtype=np.uint8)
temp[:] = frame
# self.arr[:] = frame #需要0.1秒
t_1 = time.time()
print(t_1 - t_0)

以下是显示进程代码,通常可以改为检测或者其他处理进程

import numpy as np
from multiprocessing import Process, Value, Array, sharedctypes
import ctypes
from camera import Camera_p
import cv2


class Show_window():
def __init__(self):
self.camera_arr = sharedctypes.RawArray(ctypes.c_int8, 640*480*3)
self.isGrab = Value('i', True)

def showpic(self):
cam_pro = Camera_p(self.camera_arr, self.isGrab)
cam_pro.start()

while True:

frame_show = np.frombuffer(self.camera_arr, dtype=np.uint8).reshape(480, 640, 3)
# frame_show = np.array(bytearray(self.camera_arr)).reshape(480, 640, 3)

cv2.imshow('0', frame_show)
key = cv2.waitKey(50)
if key == ord('q'):
self.isGrab.value = False
break


def main():
show = Show_window()
show.showpic()

if __name__ == '__main__':
main()
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值