所以我想做的是显示原始帧(来自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()
答案 0 :(得分:2)
cv2
始终以frame
的形式BGR
给出blue
,如果您不将其转换为RGB
。
只有cv2.imshow()
正确显示BGR
而不进行转换。
要在其他工具中正确显示,必须使用
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)