鱼C论坛

 找回密码
 立即注册
查看: 1884|回复: 5

Canvas窗口组件显示摄像头采集图像不流畅问题求助

[复制链接]
发表于 2019-6-18 16:37:16 | 显示全部楼层 |阅读模式
2鱼币
各位大大,主要问题是画面时常闪烁,我想了解一下是什么原因,有什么办法处理吗?另外在canvas组件上刷新画面需要把旧图删除吗?

以下是程序:
import cv2
from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk
import threading

#window define
window = Tk()
window.title('xxx')
window.attributes("-topmost", True)

sw = window.winfo_screenwidth()
sh = window.winfo_screenheight()
print(sw,sh)
wx = 640
wh = 640
window.geometry("%dx%d+%d+%d" % (wx*2, wh, 100, 100) )

canvas = Canvas(window, bg='#c4c2c2', height = 480,width = 640*2)
canvas.place(x=0,y=160)

def dd():
    capture = cv2.VideoCapture(0)
    while True:
        ret, frame = capture.read()
        #image shefter
        #frame = cv2.flip(frame, 1)
        #image formate change
        cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
        img = Image.fromarray(cv2image)
        image_file=ImageTk.PhotoImage(img)
        #draw shefter image
        canvas.create_image(0,0,anchor='nw',image=image_file)
        canvas.create_text(10,10,text='Shefter image',anchor=NW,fill='red',font='14')
        canvas.create_text(20,470,text='Scale:20*5 pixel',anchor=SW,fill='red',font='14')
        #draw orginal image
        canvas.create_image(640,0,anchor='nw',image=image_file)
        canvas.create_text(650,10,text='Orginal image',anchor=NW,fill='green',font='14')
        if( cv2.waitKey(500) >= 0):
            break
  
t1=threading.Thread(target=dd)
t1.start()

mainloop()

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-18 17:00:31 | 显示全部楼层
500你是想做啥
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-18 17:14:42 | 显示全部楼层
改10也没用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-18 17:15:44 | 显示全部楼层
数字小了闪的眼花
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-18 17:48:36 | 显示全部楼层
线程的锅,我忘了事件是什么了,给个左键的
  1. import cv2
  2. from tkinter import *
  3. from tkinter import filedialog
  4. from PIL import Image, ImageTk
  5. import threading

  6. #window define
  7. window = Tk()
  8. window.title('xxx')
  9. window.attributes("-topmost", True)

  10. sw = window.winfo_screenwidth()
  11. sh = window.winfo_screenheight()
  12. print(sw,sh)
  13. wx = 640
  14. wh = 640
  15. window.geometry("%dx%d+%d+%d" % (wx*2, wh, 100, 100) )

  16. canvas = Canvas(window, bg='#c4c2c2', height = 480,width = 640*2)
  17. canvas.place(x=0,y=160)
  18. def dd(event):
  19.     capture = cv2.VideoCapture(0)
  20.     while True:
  21.         ret, frame = capture.read()
  22.         #image shefter
  23.         #frame = cv2.flip(frame, 1)
  24.         #image formate change
  25.         cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
  26.         img = Image.fromarray(cv2image)
  27.         image_file=ImageTk.PhotoImage(img)
  28.         #draw shefter image
  29.         canvas.create_image(0,0,anchor='nw',image=image_file)
  30.         canvas.create_text(10,10,text='Shefter image',anchor=NW,fill='red',font='14')
  31.         canvas.create_text(20,470,text='Scale:20*5 pixel',anchor=SW,fill='red',font='14')
  32.         #draw orginal image
  33.         canvas.create_image(640,0,anchor='nw',image=image_file)
  34.         canvas.create_text(650,10,text='Orginal image',anchor=NW,fill='green',font='14')
  35.         canvas.update()
  36.         if( cv2.waitKey(40) >= 0):
  37.             break
  38. canvas.bind('<Button-1>',dd)



  39. mainloop()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-19 15:57:34 | 显示全部楼层
感谢大大,修改程序后点左键能显示一张图片,再点左键程序死了,我需要做到动态显示摄像头拍到的内容;
早前我用cv2.imshow('src', frame)的命令动态刷新没有闪烁的问题,但现在我要用tkinter做界面,改用的canvas + Thread的方式,就有这个问题;
我注意到新的程序多了下面3行格式转换,无法直接用从摄像头读到的数据,闪烁是因为转换时间太长引起的吗?写个程序测试一下,谢谢!
cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
img = Image.fromarray(cv2image)
image_file=ImageTk.PhotoImage(img)

图片大小是640*480的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 14:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表