首页 > 解决方案 > 使用鼠标事件绘制模糊矩形

问题描述

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

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()

标签: pythonopencvimage-processing

解决方案


主要的“技巧”是GaussianBlur仅在图像的感兴趣区域 (ROI) 上使用该方法。通过适当的 NumPy数组索引和切片来访问“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)

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

希望有帮助!


推荐阅读