下面的代码仅在拖动鼠标时才绘制矩形,但是我只想模糊从鼠标绘制的矩形区域。
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()
答案 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)
如果“从右到左”或“从下到上”绘制矩形,则必须交换两个记录点的x
和y
坐标才能进行适当的切片。
希望有帮助!