Python 有人能告诉我如何从鼠标处理程序中显示具有给定hsv边界的跟踪矩形吗?

Python 有人能告诉我如何从鼠标处理程序中显示具有给定hsv边界的跟踪矩形吗?,python,python-3.x,opencv,opencv3.0,opencv-contour,Python,Python 3.x,Opencv,Opencv3.0,Opencv Contour,我在教程的帮助下编写了这个程序,并进行了大学练习,但现在我被困在如何使用给定的遮罩显示轮廓矩形上。有人能解释吗?我在鼠标手柄中收集HSV数据,并计算要跟踪的对象颜色的边界。有了它,我想创建一个遮罩,并在视频上显示轮廓矩形,但我不知道如何将这些轮廓的功能移到while循环中 import argparse import cv2 import numpy as np FRAME = None NEXT = None LOW = None HIGH = None MASK = None def

我在教程的帮助下编写了这个程序,并进行了大学练习,但现在我被困在如何使用给定的遮罩显示轮廓矩形上。有人能解释吗?我在鼠标手柄中收集HSV数据,并计算要跟踪的对象颜色的边界。有了它,我想创建一个遮罩,并在视频上显示轮廓矩形,但我不知道如何将这些轮廓的功能移到while循环中

import argparse
import cv2
import numpy as np

FRAME = None
NEXT = None
LOW = None
HIGH = None
MASK = None


def mouseHandler(event, x, y, flags, params):
    global MASK
    # if the left button is clicked
    if event == cv2.EVENT_LBUTTONDOWN:

        hsv_frame = cv2.cvtColor(FRAME, cv2.COLOR_BGR2HSV)
        hue = hsv_frame[y, x, 0]
        saturation = hsv_frame[y, x, 1]
        value = hsv_frame[y, x, 2]
        print('Hue: ', hue)
        print('Saturation: ', saturation)
        print('Value: ', value)
        print('X,Y Coordinates: [', x, ',', y, ']')

        # checks the boundaries of h, s, v
        if hue < 10:
            hue = 10
        elif hue > 169:
            hue = 169
        if saturation < 30:
            saturation = 30
        elif saturation > 225:
            saturation = 225
        if value < 30:
            value = 30
        elif value > 225:
            value = 225

        # calculates mask boundaries
        LOW = np.array([hue - 10, saturation - 30, value - 30])
        print('Lower boundary: ', LOW)
        HIGH = np.array([hue + 10, saturation + 30, value + 30])
        print('Higher boundary: ', HIGH)




def main(args):
    global FRAME, MASK
    global NEXT

    if args.input_video is None:

        print('There is no such video: {args.input_video}')
        video = cv2.VideoCapture(0)

        INTERACTIVE_WINDOW = 'Colour Extraction'
        cv2.namedWindow(INTERACTIVE_WINDOW)
        cv2.setMouseCallback(INTERACTIVE_WINDOW, mouseHandler)

        frame_grabbed, frame = video.read()
        FRAME = frame
        next_grabbed, next_f = video.read()
        NEXT = next_f

        while frame_grabbed:

            cv2.imshow(INTERACTIVE_WINDOW, frame)

            if cv2.waitKey(18) & 0xFF == ord('q'):
                print('Video ended')
                break

            if cv2.waitKey(18) == ord('p'):
                cv2.waitKey(-1)

            frame_grabbed, frame = video.read()

        video.release()
        cv2.destroyAllWindows()

    else:

        video = cv2.VideoCapture(args.input_video)

        INTERACTIVE_WINDOW = 'Color Extraction'

        cv2.namedWindow(INTERACTIVE_WINDOW)
        cv2.setMouseCallback(INTERACTIVE_WINDOW, mouseHandler)

        frame_grabbed, frame = video.read()
        FRAME = frame
        next_grabbed, next_frame = video.read()

        while frame_grabbed:


            if MASK != None:

                hsv_f = cv2.cvtColor(next_frame, cv2.COLOR_BGR2HSV)

                 # handler mask creation with matrix
                kernel_open = np.ones((5, 5), np.uint8)
                kernel_close = np.ones((20, 20), np.uint8)

                masked = cv2.inRange(hsv_f, LOW, HIGH)
                mask_open = cv2.morphologyEx(masked, cv2.MORPH_OPEN, kernel_open)

                mask_close = cv2.morphologyEx(masked, cv2.MORPH_CLOSE, kernel_close)
                MASK = mask_close

                contours, h = cv2.findContours(MASK.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
                cv2.drawContours(FRAME, contours, -1, (255, 0, 0), 3)

                for i in range(len(contours)):
                    x, y, w, h = cv2.boundingRect(contours[i])
                    cv2.rectangle(FRAME, (x, y), (x + w, y + h), (0, 0, 255), 2)
                    cv2.imshow(INTERACTIVE_WINDOW, FRAME)
                    cv2.imshow('mask', masked)

            elif MASK == None:

                    cv2.imshow(INTERACTIVE_WINDOW, frame)

                    if cv2.waitKey(18) & 0xFF == ord('q'):
                        print('Video ended')
                        break

                    if cv2.waitKey(18) == ord('p'):
                        cv2.waitKey(-1)

            if cv2.waitKey(18) & 0xFF == ord('q'):
                print('Video ended')
                break

            if cv2.waitKey(18) == ord('p'):
                cv2.waitKey(-1)

            frame_grabbed, frame = video.read()

    video.release()
    cv2.destroyAllWindows()


def parse_arguments():
    parser = argparse.ArgumentParser(description=('This script extracts colours from video and tracks selected colour'))
    parser.add_argument('-i', '--input-video', type=str, required=False, help=('A video file that will be processed'))
    return parser.parse_args()


if __name__ == '__main__':
    main(parse_arguments())
import argparse
进口cv2
将numpy作为np导入
帧=无
下一个=无
低=无
高=无
掩码=无
def鼠标手柄(事件、x、y、标志、参数):
全局掩码
#如果单击了左按钮
如果event==cv2.event\u LBUTTONDOWN:
hsv_frame=cv2.cvt颜色(frame,cv2.COLOR_BGR2HSV)
色调=hsv_帧[y,x,0]
饱和度=hsv_帧[y,x,1]
值=hsv_帧[y,x,2]
打印('色调:',色调)
打印('饱和度:',饱和度)
打印('值:',值)
打印('X,Y坐标:[',X',',',Y',]')
#检查h、s、v的边界
如果色调<10:
色调=10
elif色调>169:
色调=169
如果饱和度<30:
饱和度=30
elif饱和度>225:
饱和度=225
如果值<30:
值=30
elif值>225:
值=225
#计算遮罩边界
低=np.数组([色调-10,饱和度-30,值-30])
打印('下边界:',低)
高=np.数组([色调+10,饱和度+30,值+30])
打印('较高边界:',较高)
def主(args):
全局帧、掩码
全球下一个
如果args.input\u video为无:
print('没有这样的视频:{args.input\u video}')
视频=cv2。视频捕获(0)
交互式_窗口='颜色提取'
cv2.namedWindow(交互式窗口)
cv2.setMouseCallback(交互式窗口,鼠标手柄)
frame\u,frame=video.read()
帧=帧
next\u抓取,next\u f=video.read()
下一个=下一个
当frame_抓取时:
cv2.imshow(交互式窗口、框架)
如果cv2.waitKey(18)&0xFF==ord('q'):
打印('视频结束')
打破
如果cv2.waitKey(18)=ord('p'):
cv2.等待键(-1)
frame\u,frame=video.read()
video.release()
cv2.destroyAllWindows()
其他:
视频=cv2.VideoCapture(参数输入\视频)
交互式_窗口='颜色提取'
cv2.namedWindow(交互式窗口)
cv2.setMouseCallback(交互式窗口,鼠标手柄)
frame\u,frame=video.read()
帧=帧
next\u抓取,next\u frame=video.read()
当frame_抓取时:
如果面具!=无:
hsv\u f=cv2.cvt颜色(下一帧,cv2.COLOR\u BGR2HSV)
#使用矩阵创建处理程序掩码
kernel_open=np.ones((5,5),np.uint8)
kernel_close=np.one((20,20),np.uint8)
屏蔽=cv2.inRange(hsv_f,低,高)
mask\u open=cv2.morphologyEx(masked,cv2.MORPH\u open,kernel\u open)
mask\u close=cv2.morphologyEx(masked,cv2.MORPH\u close,kernel\u close)
遮罩=遮罩关闭
轮廓,h=cv2.findContours(MASK.copy(),cv2.RETR\u外部,cv2.CHAIN\u近似值\u无)
cv2.绘制等高线(框架,等高线,-1,(255,0,0),3)
对于范围内的i(透镜(轮廓)):
x、 y,w,h=cv2.boundingRect(等高线[i])
矩形(框架,(x,y),(x+w,y+h),(0,0,255),2)
cv2.imshow(交互式窗口、框架)
cv2.imshow(“遮罩”,遮罩)
elif掩码==无:
cv2.imshow(交互式窗口、框架)
如果cv2.waitKey(18)&0xFF==ord('q'):
打印('视频结束')
打破
如果cv2.waitKey(18)=ord('p'):
cv2.等待键(-1)
如果cv2.waitKey(18)&0xFF==ord('q'):
打印('视频结束')
打破
如果cv2.waitKey(18)=ord('p'):
cv2.等待键(-1)
frame\u,frame=video.read()
video.release()
cv2.destroyAllWindows()
def parse_参数():
parser=argparse.ArgumentParser(description=(“此脚本从视频中提取颜色并跟踪所选颜色”))
add_参数('-i','-input video',type=str,required=False,help=('A video file that will processed'))
返回parser.parse_args()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main(parse_arguments())