日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python读取摄像头或者视频文件、并在gui中实时显示_python:tkinter显示来自网络摄像头的视频并执行QR扫描...

發布時間:2023/12/14 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python读取摄像头或者视频文件、并在gui中实时显示_python:tkinter显示来自网络摄像头的视频并执行QR扫描... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我一直在嘗試創建一個tkinter頂級窗口,用于流式傳輸視頻表單攝像頭并執行QR掃描。我從SO和another code得到這個QR掃描代碼,它只是從網絡攝像頭更新圖像,而不是在tkinter標簽上流式傳輸視頻。python:tkinter顯示來自網絡攝像頭的視頻并執行QR掃描

我試圖將這兩者結合起來,這樣一個頂層窗口帶有標簽,可以從網絡攝像頭更新圖像,關閉按鈕可以關閉頂層窗口。當它傳輸圖像時,它可以掃描QR碼,如果掃描成功,攝像頭和頂層窗口會關閉。

這是我試過的。

import cv2

import cv2.cv as cv

import numpy

import zbar

import time

import threading

import Tkinter

from PIL import Image, ImageTk

class BarCodeScanner(threading.Thread, Tkinter.Toplevel):

def __init__(self):

# i made this as a global variable so i can access this image

# outside ie,. beyond the thread to update the image on to the tkinter window

global imgtk

imgtk = None

threading.Thread.__init__(self)

self.WINDOW_NAME = 'Camera'

self.CV_SYSTEM_CACHE_CNT = 5 # Cv has 5-frame cache

self.LOOP_INTERVAL_TIME = 0.2

cv.NamedWindow(self.WINDOW_NAME, cv.CV_WINDOW_NORMAL)

self.cam = cv2.VideoCapture(-1)

self.confirm = 0

def scan(self, aframe):

imgray = cv2.cvtColor(aframe, cv2.COLOR_BGR2GRAY)

# to show coloured image, as from the other code mentioned in the other code

imgcol = cv2.cvtColor(aframe, cv2.COLOR_BGR2RGBA)

imgcol_array = Image.fromarray(imgcol)

imgtk = ImageTk.PhotoImage(image=imgcol_array)

raw = str(imgray.data)

scanner = zbar.ImageScanner()

scanner.parse_config('enable')

width = int(self.cam.get(cv.CV_CAP_PROP_FRAME_WIDTH))

height = int(self.cam.get(cv.CV_CAP_PROP_FRAME_HEIGHT))

imageZbar = zbar.Image(width, height,'Y800', raw)

scanner.scan(imageZbar)

for symbol in imageZbar:

print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data

return symbol.data

def run(self):

self.datalst = []

print 'BarCodeScanner run', time.time()

while True:

for i in range(0,self.CV_SYSTEM_CACHE_CNT):

self.cam.read()

img = self.cam.read()

self.data = self.scan(img[1])

cv2.imshow(self.WINDOW_NAME, img[1])

cv.WaitKey(1)

time.sleep(self.LOOP_INTERVAL_TIME)

if self.data:

self.datalst.append(self.data)

# i have added this section so that it waits for scan

# if a scan is made it and if gets same value after 2 scans

# it has to stop webcam

if len(self.datalst) == 2 and len(set(self.datalst)) <= 1:

# I want to close the webcam before closing the toplevel window

#self.cam.release()

#cv2.destroyAllWindows()

break

self.cam.release()

def Video_Window():

video_window = Tkinter.Toplevel()

video_window.title('QR Scan !!')

img_label = Tkinter.Label(video_window)

img_label.pack(side=Tkinter.TOP)

close_button = Tkinter.Button(video_window, text='close', command = video_window.destroy)

close_button.pack(side=Tkinter.TOP)

def update_frame():

global imgtk

img_label.configure(image=imgtk)

img_label.after(10,update_frame)

update_frame()

def main():

root = Tkinter.Tk()

button_scanQr = Tkinter.Button(root, text='QR Scan', command=start_scan)

button_scanQr.pack()

root.mainloop()

def start_scan():

scanner = BarCodeScanner()

scanner.start()

Video_Window()

#scanner.join()

main()

問題是,

我其實是想顯示頂層窗口上的視頻,而不是OpenCV的窗口

在同一時間做了QR掃描,如果閱讀是成功的,Toplevel窗口應該關閉而不會突然關閉攝像頭(因為,當我嘗試使用self.cam.release()或cv2.destroyAllWindows()我的攝像頭指示燈亮起,即使我強制終止程序編譯)。

現在我所得到的是一個由OpenCV創建的獨立窗口,可以將視頻內部進行流式傳輸。但我不想要那個窗口,而是我想讓視頻顯示在tkinter的頂層窗口中。當有一個成功的閱讀時,網絡攝像機就會讀取它讀取的最終圖像。

我試圖刪除負責OpenCV的窗口行,方法BarcodeScannerrun類 ??

它仍然沒有輸出不同的窗口出現了里面,如果我嘗試關閉窗口,它創建了另一個類似的和遞歸的。

UPDATE:

正如我發現我在cv2取得了一些愚蠢的錯誤在沒有一些線的理解,我通過將頂層窗口代碼插入到類的run方法制造上的代碼的某些變化(我不知道這是否是一種正確的方式)。

import cv2

import cv2.cv as cv

import numpy

import zbar

import time

import threading

import Tkinter

from multiprocessing import Process, Queue

from Queue import Empty

from PIL import Image, ImageTk

class BarCodeScanner(threading.Thread, Tkinter.Toplevel):

def __init__(self):

threading.Thread.__init__(self)

#self.WINDOW_NAME = 'Camera'

self.CV_SYSTEM_CACHE_CNT = 5 # Cv has 5-frame cache

self.LOOP_INTERVAL_TIME = 0.2

#cv.NamedWindow(self.WINDOW_NAME, cv.CV_WINDOW_NORMAL)

self.cam = cv2.VideoCapture(-1)

# check if webcam device is free

self.proceede = self.cam.isOpened()

if not self.proceede:

return

self.confirm = 0

def scan(self, aframe):

imgray = cv2.cvtColor(aframe, cv2.COLOR_BGR2GRAY)

raw = str(imgray.data)

scanner = zbar.ImageScanner()

scanner.parse_config('enable')

width = int(self.cam.get(cv.CV_CAP_PROP_FRAME_WIDTH))

height = int(self.cam.get(cv.CV_CAP_PROP_FRAME_HEIGHT))

imageZbar = zbar.Image(width, height,'Y800', raw)

scanner.scan(imageZbar)

for symbol in imageZbar:

print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data

return symbol.data

def run(self):

if not self.proceede:

return

def show_frame():

_, img = self.cam.read()

img = cv2.flip(img,1)

cv2image = cv2.cvtColor(img, cv2.COLOR_BGR2RGBA)

img = Image.fromarray(cv2image)

imgtk = ImageTk.PhotoImage(image=img)

img_label.imgtk = imgtk

img_label.configure(image=imgtk)

video_window.after(250, show_frame)

def destroy_video_window():

self.cam.release()

video_window.destroy()

# Toplevel GUI

video_window = Tkinter.Toplevel()

video_window.title('QR Scan !!')

img_label = Tkinter.Label(video_window)

img_label.pack(side=Tkinter.TOP)

close_button = Tkinter.Button(video_window, text='close', command = destroy_video_window)

close_button.pack(side=Tkinter.RIGHT)

show_frame()

self.datalst = []

print 'BarCodeScanner run', time.time()

while True:

for i in range(0,self.CV_SYSTEM_CACHE_CNT):

self.cam.read()

img = self.cam.read()

self.data = self.scan(img[1])

time.sleep(self.LOOP_INTERVAL_TIME)

if self.data:

self.datalst.append(self.data)

if len(self.datalst) == 2 and len(set(self.datalst)) <= 1:

video_window.destroy()

break

self.cam.release()

def main():

root = Tkinter.Tk()

button_scanQr = Tkinter.Button(root, text='QR Scan', command=scaner)

button_scanQr.pack()

root.mainloop()

def scaner():

scanner = BarCodeScanner()

scanner.start()

main()

現在,我可以在Toplevel窗口獲取圖像,但我不知道如何關閉攝像頭。

條件1:當我顯示的QR碼進行掃描,它成功地讀出它并且攝像頭退出沒有任何錯誤。

條件2:當我點擊了頂層窗口上的關閉按鈕(說,如果用戶不希望做任何掃描,只是想關閉攝像頭)我得到錯誤說

libv4l2: error dequeuing buf: Invalid argument

VIDIOC_DQBUF: Invalid argument

select: Bad file descriptor

VIDIOC_DQBUF: Bad file descriptor

select: Bad file descriptor

VIDIOC_DQBUF: Bad file descriptor

Segmentation fault (core dumped)

我正在為Linux,Mac和Windows機寫這個應用程序。我怎樣才能安全地關閉或終止攝像頭。

2016-05-07

arvindh

+0

[使用的OpenCV與Tkinter的]的可能的復制(http://stackoverflow.com/questions/32342935/using-opencv-with-tkinter) –

+0

@tfv。它看起來相似,但不一樣。在那里使用函數將視頻顯示到窗口上,但是由于我在同時進行QR掃描以及顯示視頻的同時,使用類和線程將它們組合起來使得更難以通過 –

總結

以上是生活随笔為你收集整理的python读取摄像头或者视频文件、并在gui中实时显示_python:tkinter显示来自网络摄像头的视频并执行QR扫描...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。