Есть ли способ проверить, подключена ли камера без cap = cv2.videocapture - PullRequest
0 голосов
/ 02 октября 2019

Я делаю программу, которая проверяет, подключена ли камера, и если да, покажите отснятый материал веб-камеры. Проблема заключается в следующем: как я структурировал свою программу, у меня не может быть cap = cv2.videocapture() на время, необходимое для выполнения команды,Это делает саботаж для функции showframe и заставляет показывать кадр только ~ 1 секунду. Есть ли другой способ проверить, подключена ли камера, а не cap = cv2.videocapture() и cap.isOpened()?

У меня также не может быть цикла while в моей программе из-за команды root.mainloop для tkinter, однакоесли нет способа проверить состояние моей камеры, а не cap.isOpened(), могу ли я переместить команду root.mainloop куда-нибудь, где в моей программе может быть цикл while True?

Я пробовал обе мультипроцессорыи Threading без дальнейшего успеха.

Вот какой-то код:

from tkinter import *  # Import the tkinter module (For the Graphical User Interface)
import cv2  # Import the cv2 module for web camera footage
import PIL  # Import the pillow library for image configuration.
from PIL import Image, ImageTk  # Import the specifics for Image configuration.

print("[INFO] Imports done")

width, height = 800, 600  # Define The width and height widget for cap adjustment
RootGeometry = str(width) + "x" + str(height)  # Make a variable to adjust tkinter frame
print("[INFO] Geometries made")

ImageSource = 0
cap = cv2.VideoCapture(ImageSource)  # First VideoCapture
cap.set(cv2.CAP_PROP_FRAME_WIDTH, width)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
print("[INFO] Cap set")

root = Tk()
print("[INFO] Window made")

root.title("Main Window")
root.configure(background="white")
root.geometry(RootGeometry)
root.bind('<Escape>', lambda e: root.quit())
lmain = Label(root)
lmain.pack()
print("[INFO] Configuration of cap done.")


def ShowFrame():
    ok, frame = cap.read()
    if ok:
        print("[INFO] Show frame Initialized.")

        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = PIL.Image.fromarray(cv2image)
        imgtk = ImageTk.PhotoImage(image=img)
        lmain.imgtk = imgtk
        lmain.configure(image=imgtk)
        print("[INFO] After 10 initializing")
        lmain.after(10, ShowFrame)
        print("[INFO] Showed image")

    else:
        lmain.after(10, CheckSource)


def CheckSource():

    print("[INFO] CheckSource Triggered.")
    cap = cv2.VideoCapture(ImageSource)

    if cap.isOpened():
        print("[INFO] [DEBUG] if Ok initialized")
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            cv2.waitKey(0)
            print("[WARNING] Exiting app after command")

        ShowFrame()

    else:
        print("[WARNING] No source found. Looking for source.")
        lmain.after(10, CheckSource)


CheckSource()
root.mainloop()
print("[INFO] [DEBUG] Root.Mainoop triggered")

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы не должны делать VideoCapture каждый кадр, вам нужно только проверить, существует ли он. isOpened() - правильная функция для этого. Если он еще не существует, повторите попытку.

Я изменил ваш код:

def CheckSource():

    print("[INFO] CheckSource Triggered.")

    # check if cam is open, if so,  do showFrame   
    if cap.isOpened():
        print("[INFO] [DEBUG] if Ok initialized")
        if cv2.waitKey(1) & 0xFF == ord('q'):
            cv2.destroyAllWindows()
            cv2.waitKey(0)
            print("[WARNING] Exiting app after command")

        ShowFrame()
    else:
        # cam is not open, try VideoCapture
        print("[WARNING] No source found. Looking for source.")
        cap = cv2.VideoCapture(ImageSource)
        lmain.after(10, CheckSource)
1 голос
/ 03 октября 2019

Если веб-камера / источник изображения отсутствуют, cap.read() будет (False, none). Поэтому вы можете проверить, подключена ли веб-камера, если вы делаете что-то вроде:

import cv2
cap=cv2.VideoCapture(ImageSource)
while True:
    if cap.read()[0]==False:
        print("Not connected")
        cap=cv2.VideoCapture(imageSource)
    else:
        ret, frame=cap.read()
        cv2.imshow("webcam footage",frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

Надеюсь, это поможет:)

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