我一直在尝试创建一个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扫描...相关推荐

  1. Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)

    Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录

  2. python读取txt文件写入-python 读取、写入txt文件的示例

    写入文件 使用open()函数和write()函数 但是有两种写法,分别是'a'和'w' 'a' 表示写入文件 若无该文件会直接创建一个 如果存在这个文件,会接着已有的内容的后面写入 with ope ...

  3. python shp文件_对python 读取线的shp文件实例详解

    如下所示: import shapefile sf = shapefile.reader("e:\\1.2\\cs\\dx_csl.shp") shapes = sf.shapes ...

  4. 使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本

    使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本 文章目录 使用Python读取LabVIEW TDMS 格式文件转成Excel格式+多进程版本 前言: 背景 tm ...

  5. Python读取.dat后缀名文件

    Python读取.dat后缀名文件 .dat文件基本上是没有任何头的二进制文件.对于每个样本,它由(256,256,3)个uint8图像,(64,64,1)uint8深度图和1个uint8标签组成.T ...

  6. python读取C语言头文件

    在使用python编程过程中,经常需要对C语言文件进行操作,即.h文件进行读取操作,这里举例说明,python读取C语言头文件,提取其中#define 宏定义 废话少说,上代码 import os i ...

  7. python 读取mat文件,python读取并写入mat文件的方法

    先给大家介绍下python读取并写入mat文件的方法 用matlab生成一个示例mat文件: clear;clc matrix1 = magic(5); matrix2 = magic(6); sav ...

  8. pyqt5:python读取二进制文件(音频PCM文件)显示波形

    文章目录 1.使用ffmpeg生成PCM文件 1.1 用 ffprobe 查看文件信息 1.2 用 ffmpeg 命令转换 1.3 用ffplay 测试播放PCM文件 2.python读取PCM文件显 ...

  9. python画图视频_如何在视频文件的第一帧上画图,然后继续显示整个视频

    我在python中使用opencv库.我打开了一个现有的视频文件,并编写了一个小脚本,允许我在视频的任何地方画一个矩形.问题是:我想在视频的第一帧上画一个矩形,然后把它留在那里为我标记一个感兴趣的区域 ...

最新文章

  1. CV 面试问题详解宝典—目标检测篇
  2. Python入门100题 | 第064题
  3. Python基础教程:列表(list)切片详细操作
  4. Codeforces Round #315 (Div. 2)
  5. ggplot2中显示坐标轴_R可视化08|ggplot2图层标度图层(scale layer)图例篇
  6. linux将txt文件复制为bak,Linux命令:cp (copy)复制文件或目录
  7. python面向对象变成(1):类的基本概念
  8. 使用HttpClient发送WebService Security(WSS)请求
  9. 95-30-060-java.util-HashSet
  10. Android点赞头像列表
  11. Redis开发与运维之第五章持久化
  12. Linux下cuda卸载
  13. 函数在c99中隐式声明无效_C函数的隐式声明
  14. [软考]项目目标VS项目基准
  15. 高感性时代--全新思维:决胜未来的6大能力
  16. 【附源码】Python计算机毕业设计社区生鲜电商平台
  17. anaconda使用arcpy库
  18. PostgreSQL16中pg_dump的LZ4和ZSTD压缩
  19. 【csv乱码】csv文件打开乱码的情况
  20. internet time

热门文章

  1. 解决tomcat安装配置后localhost 打不开
  2. 2021-10-20-Flask-02 路由与参数解析
  3. win10系统运行sh脚本
  4. 新版标准日本语初级_第四课
  5. uniapp更换头像代码笔记
  6. 21. OP-TEE中TA与CA执行流程-------libteec介绍
  7. 操作系统——进程原理篇
  8. 面试:如何应对人事的面试
  9. 菜鸟与 cef 的邂逅之旅(三):Cef3 中 C++ 与 JavaScript 的互相调用
  10. 岁月留声的2015-F班破冰晚会