使用鼠标事件绘制模糊的矩形

时间:2019-11-26 05:06:03

标签: python opencv image-processing

下面的代码仅在拖动鼠标时才绘制矩形,但是我只想模糊从鼠标绘制的矩形区域。

import cv2
import argparse

ref_point = []


def shape_selection(event,x,y,flags,param):
    global ref_point, crop

    if event == cv2.EVENT_LBUTTONDOWN:
        ref_point = [(x,y)]


    elif event == cv2.EVENT_LBUTTONUP:
        ref_point.append((x,y))
        #cv2.GaussianBlur(image,(9,9),0)
        cv2.rectangle(image,ref_point[0],ref_point[1],(0,255,0),2)
        #cv2.GaussianBlur(images,(9,9),0)
        cv2.imshow("image",image)

ap=argparse.ArgumentParser()
ap.add_argument("-i","--image",required=True,help="Path to image")
args=vars(ap.parse_args())

image = cv2.imread(args["image"])
clone=image.copy()
#cv2.GaussianBlur(image,(9,9),0)
cv2.namedWindow("image")
cv2.setMouseCallback("image",shape_selection)

while True:
    cv2.imshow("image",image)
    key = cv2.waitKey(1) & 0xFF
    if key == ord("r"):
        image=clone.copy()
    elif key == ord("c"):
        break

cv2.destroyAllWindows()

1 个答案:

答案 0 :(得分:1)

主要的“技巧”是仅在图像的感兴趣区域(ROI)上使用GaussianBlur方法。通过适当的NumPy array indexing and slicing可以访问“ Python OpenCV图像”中的矩形ROI。大多数OpenCV函数(Python API)支持仅在这些ROI上进行操作。

因此,这可能是您的shape_selection方法的修改版本:

def shape_selection(event, x, y, flags, param):
    global image, ref_point

    if (event == cv2.EVENT_LBUTTONDOWN):
        ref_point = [(x, y)]

    elif (event == cv2.EVENT_LBUTTONUP):
        (x_ref, y_ref) = ref_point[0]

        if (x_ref > x):
            (x, x_ref) = (x_ref, x)
        if (y_ref > y):
            (y, y_ref) = (y_ref, y)

        image[y_ref:y, x_ref:x] = cv2.GaussianBlur(image[y_ref:y, x_ref:x], (9, 9), 0)
        image = cv2.rectangle(image, (x_ref, y_ref), (x, y), (0, 255, 0), 2)
        cv2.imshow('image', image)

如果“从右到左”或“从下到上”绘制矩形,则必须交换两个记录点的xy坐标才能进行适当的切片。

希望有帮助!

相关问题