OpenCV Python을 사용하여 새 카메라 소스 만들기 (Python을 사용하는 카메라 드라이버)

Sep 11 2020

누구든지 파이썬을 사용하여 카메라 소스를 만드는 방법을 알고 있습니까? 예를 들어 2 개의 카메라가 있습니다.

  1. 웹캠
  2. USB 캠

카메라가 필요한 웹 애플리케이션이나 인터페이스를 사용할 때마다 위에서 언급 한 두 가지 중에서 카메라 소스를 선택할 수있는 옵션이 있습니다.

내가 달성하고 싶은 것은 다음과 같이 내 자신의 카메라 포털을 사용하여 파이썬 프로그램에서 실시간 프레임을 처리하고 있다는 것입니다.

import numpy as np
import cv2

    while True:
        _,frame = self.cam.read()
        k = cv2.waitKey(1)
        if k & 0xFF == ord('q'):
            self.cam.release()
            cv2.destroyAllWindows()
            break
        else:
            cv2.imshow("Frame",frame)

이제 이것을 frame카메라 소스로 사용하고 싶으 므로 다음에 카메라가 필요한 소프트웨어 또는 웹 앱을 열 때마다 다음과 같은 옵션이 표시됩니다.

  1. 웹캠
  2. USB 캠
  3. Python Cam (또는 이름이 무엇이든)

누구든지 그것에 대해 어떻게할지에 대한 조언이나 힌트가 있습니까? 자체 카메라 소스를 생성하는 프리미엄 소프트웨어를 보았지만 C ++로 작성되었습니다. 이것이 파이썬에서 일어날 수 있는지 궁금합니다.

다음은 동일한 예입니다.

보시다시피 여러 카메라 소스가 있습니다. 피드에 파이썬으로 처리 된 프레임을 표시하는 카메라 소스 하나를 추가하고 싶습니다.

답변

2 GuilhermeSant'Ana Sep 21 2020 at 21:03

당신은 사용할 수 있습니다 v4l2loopback (https://github.com/umlaeute/v4l2loopback) 그에 대한. C로 작성되었지만 일부 파이썬 래퍼가 있습니다. 나는 가상 비디오 (https://github.com/Flashs/virtualvideo).
virtualvideo README는 매우 간단하지만 목표에 맞게 github 예제를 수정했습니다.

import virtualvideo
import cv2


class MyVideoSource(virtualvideo.VideoSource):
    def __init__(self):
        self.cam = cv2.VideoCapture(0)
        _, img = self.cam.read()
        size = img.shape
        #opencv's shape is y,x,channels
        self._size = (size[1],size[0])

    def img_size(self):
        return self._size

    def fps(self):
        return 30

    def generator(self):
        while True:
            _, img = self.cam.read()
            yield img


vidsrc = MyVideoSource()
fvd = virtualvideo.FakeVideoDevice()
fvd.init_input(vidsrc)
fvd.init_output(2, 640, 480, pix_fmt='yuyv422')
fvd.run()

에서 init_output 첫 번째 인수는 커널 모듈을 추가 할 때 내가 만든 타르 가상 카메라 자원이다 :

sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1

마지막 인수는 내 웹캠 크기와 픽셀 형식입니다.

행 아웃에 다음 옵션이 표시됩니다.

DrBwts Sep 11 2020 at 14:32

먼저 사용 가능한 카메라 목록을 가져와야합니다. 코드는 여기 에서 찾을 수 있습니다.

그런 다음 카메라를 선택하면 camera = cv2.VideoCapture(chosen_port)