tkinter显示C语言动态库获取的视像头视频信号
时间:2019-10-11
本文章向大家介绍tkinter显示C语言动态库获取的视像头视频信号,主要包括tkinter显示C语言动态库获取的视像头视频信号使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.显示视频先从显示单帧图片开始
#!/usr/bin/python from Tkinter import * from PIL import Image, ImageTk def main(): t = Tk() t.title('showVideo') frmT = Frame(width = 769, height = 577) frmB = Frame(width = 769, height = 30) f = open('frame.rgb','rb') str1 = f.read() im = Image.fromstring('RGB',(768,576),str1) photo = ImageTk.PhotoImage(im) # imgInfo = PhotoImage(file = photo) ToplImage = Label(frmT,image = photo) ToplImage.image = photo ToplImage.pack() frmT.grid(row=0,column=0) frmB.grid(row=1,column=0) ToplImage.grid() t.mainloop() if __name__=='__main__': main()
2.然后用普通插入图片然后刷新的方式实现,视屏是可以显示了,但是运行5分钟后内存就因为while True爆掉了,而且还没查出来怎么爆掉的,手动清理内存都没作用
#!/usr/bin/python import sys import gc from Tkinter import * from PIL import Image, ImageTk from ctypes import * from threading import Thread import time def show(): result = cdll.LoadLibrary("./libvideodev.so") buff = create_string_buffer(768*576*3) # t1 = Thread(target=video) # t1.start() # video() # time.sleep(1) len = 768*576*3 retCode = result.VideoDeviceInit() print("VideoDeviceInit:",retCode) retCode = result.SetVideoSource("0") print("SetVideoSource:",retCode) # retCode = result.CaptureParamSet(516,378,7) retCode = result.CaptureParamSet(768,576,7) print("CaptureParamSet:",retCode) print("CaptureParamSet:",retCode) retCode = result.StartCapture() print("StartCapture:",retCode) # retCode = result.GetFrame(buff,len) # print("GetFrame:",retCode) # print(buff.value) # print(sizeof(buff)) # time.sleep(1) # print(repr(buff.raw)) print("buffvalue") t = Tk() t.title('showVideo') while True: frmT = Frame(width = 769, height = 577) frmB = Frame(width = 769, height = 30) # f = open('frame.rgb','rb') # str1 = f.read() retCode = result.GetFrame(buff,len) print(sizeof(buff)) # str1 = buff.raw if (sizeof(buff)==1327104): # im = Image.fromstring('RGB',(516,378),str1) im = Image.fromstring('RGB',(768,576),buff.raw) photo = ImageTk.PhotoImage(im) # imgInfo = PhotoImage(file = photo) ToplImage = Label(frmT,image = photo) ToplImage.image = photo # ToplImage.pack() frmT.grid(row=0,column=0) frmB.grid(row=1,column=0) ToplImage.grid() print(sys.getrefcount(ToplImage)) print(sys.getrefcount(photo)) print(sys.getrefcount(im)) print(sys.getrefcount(frmT)) print(sys.getrefcount(frmB)) print(sys.getrefcount(retCode)) del ToplImage del(photo) del(im) del frmT del frmB del retCode print('gc') print(gc.collect()) print(gc.get_count()) print(time.strftime("%Y-%m-%d %H:%M:%S")) t.update() t.mainloop() if __name__=='__main__': show()
3.参考了 https://blog.csdn.net/qq_41979513/article/details/89306878 的代码 终于解决了爆内存的问题可以长期显示视屏了
#!/usr/bin/python import sys import gc from Tkinter import * from PIL import Image from PIL import ImageTk from ctypes import * from threading import Thread import time class Extractor_GUI(): def __init__(self): self.length = 768*576*3 self.result = cdll.LoadLibrary("./libvideodev.so") self.buff = create_string_buffer(768*576*3) self.__init_video() self.__init_gui() def __init_video(self): retCode = self.result.VideoDeviceInit() print("VideoDeviceInit:",retCode) retCode = self.result.SetVideoSource("0") print("SetVideoSource:",retCode) # retCode = result.CaptureParamSet(516,378,7) retCode = self.result.CaptureParamSet(768,576,7) print("CaptureParamSet:",retCode) retCode = self.result.StartCapture() print("StartCapture:",retCode) def __init_gui(self): self.window = Tk() self.window.title('showVideo') self.canv = Canvas(self.window, width = 769, height = 577) self.frmB = Frame(width = 769, height = 30) self.canv.grid(row=0,column=0) self.frmB.grid(row=1,column=0) self.__action_read_frame() def __action_read_frame(self): while True: retCode = self.result.GetFrame(self.buff,self.length) print(sizeof(self.buff)) if (sizeof(self.buff)==1327104): # im = Image.fromstring('RGB',(516,378),str1) im = Image.fromstring('RGB',(768,576),self.buff.raw) photo = ImageTk.PhotoImage(im) self.canv.create_image(0,0,anchor=NW,image=photo) self.window.update_idletasks() # self.window.update() def launch(self): self.window.mainloop() if __name__ == '__main__': ext = Extractor_GUI() ext.launch()
原文地址:https://www.cnblogs.com/qijunzifeng/p/11655148.html
- HDUOJ--Strange fuction
- HDUOJ---Can you solve this equation?
- HDUOJ---A + B Again
- C++知识整理(进制)
- Oracle 12c数据字典的小问题(r11笔记第49天)
- 位运算的方法,大结
- 位运算的方法,小结
- Golang语言--多线程求和
- AlphaGo Zero代码迟迟不开源,TF等不及自己推了一个
- nyoj---快速查找素数
- 转--Golang图像处理工具库,图像相似度计算,图像二值化
- HDUOJ----湫湫系列故事——减肥记I
- HDUOJ----Eddy's research I
- 【亚马逊加盟对抗谷歌联盟ONNX】微软Facebook深度学习开源联盟再添盟友
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法