Использование блокировки в многопоточности - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь сохранить изображения с трех камер одновременно, используя muti (3) -потоки и нажимая кнопку.

Я выбрал код онлайн и создал три объектапример.Потоки работают нормально, и окна отображаются и могут сохранять изображения.Но я не уверен, правильно ли я использую «Замки» (приобретение и выпуск).Всего 4 замка.

Current Code:
#!/usr/bin/env python

from threading import Thread, Lock
import cv2

class WebcamVideoStream :
    def __init__(self, src = 0, width = 1024, height = 768) :
        # width = 320, height = 240
        self.stream = cv2.VideoCapture(src)
        self.stream.set(cv2.CAP_PROP_FRAME_WIDTH, width)
        self.stream.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
        (self.grabbed, self.frame) = self.stream.read()
        self.started = False
        self.read_lock = Lock()

    def start(self) :
        if self.started :
            print "already started!!"
            return None
        self.started = True
        self.thread = Thread(target=self.update, args=())
        self.thread.start()
        return self

    def update(self) :
        while self.started :
            #if self.stream.grab():
                #(grabbed, frame) = self.stream.retrieve()
            (grabbed, frame) = self.stream.read()
            self.read_lock.acquire()
            self.grabbed, self.frame = grabbed, frame
            self.read_lock.release()

    def read(self) :
        self.read_lock.acquire()
        frame = self.frame.copy()
        self.read_lock.release()
        return frame

    def stop(self) :
        self.started = False
        self.thread.join()

    def __exit__(self, exc_type, exc_value, traceback) :
        self.stream.release()

if __name__ == "__main__" :
    mainer_lock = Lock()
    vs = WebcamVideoStream(src = 0).start()
    vs2 = WebcamVideoStream(src = 1).start()
    vs3 = WebcamVideoStream(src = 2).start()

    while True :
        frame = vs.read()
        frame2 = vs2.read()
        frame3 = vs3.read()
        cv2.imshow('webcam', frame)
        cv2.imshow('webcam2', frame2)
        cv2.imshow('webcam3', frame3)

        if cv2.waitKey(1) == 99:
            mainer_lock.acquire()
            cv2.imwrite('cam_pics/frame.jpg', frame)
            cv2.imwrite('cam_pics/frame2.jpg', frame2)
            cv2.imwrite('cam_pics/frame3.jpg', frame3)
            mainer_lock.release()

    vs.stop()
    vs2.stop()
    vs3.stop()
    cv2.destroyAllWindows()

1 Ответ

0 голосов
/ 24 мая 2018

Я думаю, вам вообще не нужна блокировка.

Во-первых, mainer_lock не имеет смысла.Я знаю, что вы хотите использовать его для защиты frame[2, 3] от изменения vs[2, 3].Но это невозможно, так как frame[2, 3] в основном потоке является копией оригинального кадра (я полагаю, вы правильно используете copy).vs[2, 3] только изменит кадр внутри своих экземпляров и не повлияет на кадр в главном потоке.

Во-вторых, read_lock также не имеет смысла.Вы действительно возражаете, что кадр читается во время чтения?Когда вы снимаете реальные кадры, последующие кадры практически одинаковы.Допустим, вы хотите захватить кадр на 1000 мс, но из-за конкуренции потоков вы на самом деле захватывает кадр на 1002 мс.Но действительно ли это имеет значение?Насколько я думаю, это не так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...