【问题标题】:How to use cursor to move video with OpenCV?如何使用光标在 OpenCV 中移动视频?
【发布时间】:2020-08-11 08:14:29
【问题描述】:

我目前正在尝试实现一个功能,该功能允许我使用光标“抓取”视频并四处移动。我希望能够仅在按住并移动光标时移动视频。我已经定义了鼠标事件,捕获了光标的坐标,但我不知道如何编写函数来裁剪视频。

x1, x2, y1, y2 = 0, 0, 0, 0
mouse_down = False

def mouse_event_callback(event, x, y, flags, param):
    global x1, x2, y1, y2, mouse_down

    if event == cv2.EVENT_LBUTTONDOWN:
        x1, y1 = x, y
        mouse_down = True

    elif event == cv2.EVENT_MOUSEMOVE:
        if mouse_down:
            x2, y2 = x, y
            mouse_grab_video(x1, x2, y1, y2)

    elif event == cv2.EVENT_LBUTTONUP:
        mouse_down = False

def mouse_grab_video(x1, x2, y1, y2):
    ...

任何帮助将不胜感激!

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    您可以根据从鼠标事件获得的坐标直接裁剪图像。

    #!/usr/bin/env python3
    import argparse
    import cv2
    import numpy as np
    from PIL import Image
    
    drawing = False # true if mouse is pressed
    ix,iy = -1,-1
    refPt = []
    img = ""
    clone = ""
    ROIRegion = []
    
    # mouse callback function
    def draw_rectangle(event,x,y,flags,param):
        global ix,iy,drawing,img,clone,refPt, ROIRegion
        if event == cv2.EVENT_LBUTTONDOWN:
            drawing = True
            ix,iy = x,y
            refPt = [(x, y)]
            ROIRegion.append(refPt)
            #clone = img.copy()
    
        elif event == cv2.EVENT_MOUSEMOVE:
            if drawing == True:
                img = clone.copy()
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),3)
                a=x
                b=y
                if a != x | b != y:
                    cv2.rectangle(img,(ix,iy),(x,y),(0,0,0),-1)
    
        elif event == cv2.EVENT_LBUTTONUP:
            drawing = False
            refPt.append((x,y))
            img = clone.copy()
            cv2.rectangle(img, (ix,iy),(x,y), (0, 255, 0), 2)
    
    
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--image", required=True, help="Path to the image")
    args = vars(ap.parse_args())
    img = cv2.imread(args["image"])
    img = np.array(img)
    clone = img.copy()
    
    cv2.namedWindow('image')
    cv2.setMouseCallback('image',draw_rectangle)
    while(1):
        cv2.imshow('image',img)
    
        k = cv2.waitKey(1) & 0xFF
        if k == ord("r"):
            del ROIRegion[-1]
            del refPt[-1]
            img = clone.copy()
    
        elif k == 27:
            break
    
    #Crop image to ROI
    for region in range(len(ROIRegion)):
        cv2.rectangle(img, ROIRegion[region][0],ROIRegion[region][1], (0, 255, 0), 2)
        roi = clone[ROIRegion[region][0][1]:ROIRegion[region][1][1], ROIRegion[region][0][0]:ROIRegion[region][1][0]]
    

    对于缩放,您可以使用 EVENT_MOUSEWHEEL 来增加比例并根据比例调整图像大小。更新 imshow 以获取您缩放的最新图像。你可以参考这个link

    【讨论】:

    • 我知道如何处理图像,但是在 OpenCV 窗口中移动放大的视频呢?
    • 对于缩放,您可以使用鼠标滚轮事件来重新缩放图像。放大部分参考此链接stackoverflow.com/questions/50870405/…
    • 嗨,我已经知道如何使用鼠标滚轮事件进行放大和缩小,但我现在遇到的问题是使用鼠标单击并按住在窗口内移动视频帧视频播放时。这可能吗?
    • 顺便说一句,我注意到你和我之前的帖子回复的是同一个人。感谢您的帮助!
    • 我还没有尝试这种方法来实现你想要的,但你可以试试这个 RBUTTONDBLCLK / LBUTTONDBLCLK 然后只使用 EVENT_MOUSEMOVE 来裁剪图像
    猜你喜欢
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-05
    • 2014-11-01
    相关资源
    最近更新 更多