视频输出变为蓝色

时间:2019-12-19 15:30:11

标签: python python-3.x opencv tkinter

所以我想做的是显示原始帧(来自cam的视频供稿),并显示带有带有硬编码坐标的边界框的视频,但是发生的是我得到的供稿有点蓝色,看起来很奇怪,但是边界框就可以了。我也尝试了另一个脚本,只是看我的相机是否坏了,但是没有,它显示的很好。谢谢您的帮助。

import cv2
import numpy as np
import tkinter as tk
from PIL import ImageTk,Image

def keluar():
    app.destroy()
    cv2.destroyAllWindows()
    vid.release()
    print ("quiting...")

def stream1():
    global num_frames
    _, frame = vid.read()
    clone = frame.copy()
    frame = cv2.flip(frame,1)
    clone = frame.copy()
    (height, width) = frame.shape[:2]
    frame1 = frame[top:bottom, right:left]
    frame2 = cv2.cvtColor(frame1,cv2.COLOR_BGR2HSV)
    frame3 = cv2.inRange(frame2,lower,upper)
    frame4 = cv2.GaussianBlur(frame3,(5,5),0)

    if num_frames < 30:
        run_avg(frame4, aWeight)
    else:
        hand = segment(frame4)

        if hand is not None:
            (thd, segmented) = hand
            cv2.drawContours(clone, [segmented + (right, top)], -1, (0, 0, 255))
            cv2.imshow("Thesholded", thd)
        cv2.rectangle(clone, (left, top), (right, bottom), (0,255,0), 2)
        num_frames += 1

    #Show video
    img1 = Image.fromarray(clone)
    imgtk1 = ImageTk.PhotoImage(image=img1)
    lframe.imgtk = imgtk1
    lframe.configure(image=imgtk1)
    lframe.after(1,stream1)

def run_avg(image, aWeight):
    global bg
    if bg is None:
        bg = image.copy().astype("float")
        return
    cv2.accumulateWeighted(image, bg, aWeight)

def segment(image, threshold=25):
    global bg
    diff = cv2.absdiff(bg.astype("uint8"), image)
    thd = cv2.threshold(diff, threshold, 255, cv2.THRESH_BINARY)[1]
    (_, cnts, _) = cv2.findContours(thd.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    if len(cnts) == 0:
        return
    else:
        segmented = max(cnts, key=cv2.contourArea)
        return (thd, segmented)


aWeight = 0
num_frames = 0
top, right, bottom, left = 10, 350, 225, 590
bg = None
vid = cv2.VideoCapture(0)
app = tk.Tk()
kotak = tk.Frame(app,bg="white")
kotak.grid()
lframe = tk.Label(kotak)
lframe.grid(column=0,row=0)
lframe2 = tk.Label(kotak,text="Output",font=("arial",20))
lframe2.grid(column=2,row=0,rowspan=2,padx=20,pady=20)
bstart = tk.Button(kotak,text="Start")
bstart.grid(column=0,row=1,columnspan=2,ipadx=100,ipady=50,padx=20,pady=20)
bexit = tk.Button(kotak,text="Exit",command=keluar)
bexit.grid(column=1,row=1,columnspan=2,ipadx=50,ipady=30,padx=20,pady=20)
kernel = np.ones((5,5),np.uint8)
lower = np.array([0, 58, 50])
upper = np.array([30, 255, 255])

#==========================================
stream1()
app.mainloop()

1 个答案:

答案 0 :(得分:2)

cv2始终以frame的形式BGR给出blue,如果您不将其转换为RGB

只有cv2.imshow()正确显示BGR而不进行转换。

要在其他工具中正确显示,必须使用

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)