Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create a new camera source using OpenCV Python (Camera Driver Using Python)

Does anyone know a way to create a camera source using python? So for example I have 2 cameras:

  1. Webcam
  2. USB Cam

Whenever I use any web application or interface which requires camera, I have an option to select a camera source from the above two mentioned.

What I want to achieve is that I am processing real time frames in my python program with a camera portal of my own like this:

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)

Now I want to use this frame as a camera source so next time whenever I open a software or web app which requires camera then it show option as follows:

  1. Webcam
  2. USB Cam
  3. Python Cam (Or whatever be the name)

Does anyone has any advice or hint on how to go about that? I have seen some premium softwares which generate their own camera source but they're written in c++. I was wondering if this could happen in python or not.

Here is an example of the same:

enter image description here

As you can see there are multiple camera source there. I want to add one camera source which displays the frames processed by python in its feed.

like image 207
Shivam Sahil Avatar asked Sep 11 '20 07:09

Shivam Sahil


People also ask

How do I import a camera into Python?

Compile and install: The following sample OpenCV python code explain how to open the device video node, set the resolution, grab the frame and then display the frame in preview window. # Check whether user selected camera is opened successfully. Release the camera, then close all of the imshow() windows.

How do you make a Python camera app?

Back-End Implementation Steps :Create a path variable and set it currently to blank. Add available cameras to the combo box and set the first camera as default. Add action to the Take Photo button. Inside the click action, capture the photo at the given path with name as a timestamp and increment the count.


1 Answers

You can use v4l2loopback (https://github.com/umlaeute/v4l2loopback) for that. It is written in C but there are some python wrappers. I've used virtualvideo (https://github.com/Flashs/virtualvideo).
The virtualvideo README is pretty straight forward but here is my modification of their github example to match your goal:

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()

in init_output the first argument is the virtual camera resource thar i've created when adding the kernel module:

sudo modprobe v4l2loopback video_nr=2 exclusive_caps=1

the last arguments are my webcam size and the pixel format.

You should see this option in hangouts:

hangoutOption

like image 126
Guilherme Sant'Ana Avatar answered Sep 20 '22 15:09

Guilherme Sant'Ana