Получение изображения с камеры в многопроцессорном режиме приводит к поломке трубы - PullRequest
0 голосов
/ 13 октября 2019

Я использую камеру для обнаружения объектов. Я сделал многопроцессный запуск этой камеры независимо от основной программы, которая будет выполнять некоторые другие действия, пока камера обновляет переменную frame (поэтому она всегда будет самой новой, если основная программа запросит ее).

Процесс такой:

def camera_capture(mlist):
    while True:
        print("Running camera!")

        time.sleep(1)   # just for testing
        sp.write(b"snap")
        sp.flush()

        key = ord('a')

        size = struct.unpack("<L", sp.read(4))[0]

        bytesize = sp.in_waiting # changing number - why?
        print(bytesize)          # shouldnt the camera return same number of bytes? 320x240 camera
        frame = sp.read(size)

        # # calculate image size
        # nparr = np.fromstring(frame, np.uint8)
        # frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
        #
        # (H, W) = frame.shape[:2]

        mlist[:] = frame

Этот процесс выполняется 3-4 раза, после чего в последней строке mlist[:] = frame возникает ошибка прерванной трубы. BrokenPipeError: [Errno 32] Broken pipe

Процесс определяется следующим образом:

cam = Process(target=camera_capture, args=[mlist])
cam.start()

Затем в цикле, где я ищу элемент на изображении, я запрашиваю этот список:

frame = np.asarray(mlist)

Вся ошибка:

Traceback (most recent call last):
  File "/usr/lib/python3.6/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python3.6/multiprocessing/process.py", line 93, in run
    self._target(*self._args, **self._kwargs)
  File "/home/filip/Desktop/Diplo/source/maincv.py", line 40, in camera_capture
    mlist[:] = frame
  File "<string>", line 2, in __setitem__
  File "/usr/lib/python3.6/multiprocessing/managers.py", line 756, in _callmethod
    conn.send((self._id, methodname, args, kwds))
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 404, in _send_bytes
    self._send(header + buf)
  File "/usr/lib/python3.6/multiprocessing/connection.py", line 368, in _send
    n = write(self._handle, buf)
BrokenPipeError: [Errno 32] Broken pipe

Это может привести к ошибке imshow, вот весь консольный журнал до этой ошибки:

Running camera!
398
Running camera!
308
Running camera!
185
Running camera!
Traceback (most recent call last):
  File "/home/filip/Desktop/Diplo/source/maincv.py", line 142, in <module>
    cv2.imshow("Image", frame)
cv2.error: OpenCV(4.1.0) /io/opencv/modules/highgui/src/precomp.hpp:131: error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function 'convertToShow'

70

После последнего 70возникает ошибка сломанной трубы.

РЕДАКТИРОВАТЬ: камера OpenMV камеры. sp это серийный порт для него:

port = '/dev/ttyACM0'
sp = serial.Serial(port, baudrate=115200, bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE, xonxoff=False, rtscts=False,
    stopbits=serial.STOPBITS_ONE, timeout=None, dsrdtr=True)
sp.setDTR(True) # dsrdtr is ignored on Windows.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...