python - 使用鼠标事件绘制模糊矩形
问题描述
下面的代码只是在拖动鼠标时绘制矩形,但我只想模糊从鼠标绘制的矩形区域。
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()
解决方案
主要的“技巧”是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
希望有帮助!
推荐阅读
- c - 函数'write'的隐式声明;您指的是 'fwrite' 吗?
- sql - 查找连续事件之间的最大天数
- terratest - 需要有关使用 terratest 完成管道后如何测试 Vertex AI 端点的信息
- batch-file - 按顺序将多个 .ts 文件批量连接到单个文件
- python - 我可以使用字典来跟踪 Python 中的对象吗?
- pine-script - 计算锯齿线的斜率/导数值
- asp.net-core - Octopus:appsettings.json 变量替换 3 级层次结构
- javascript - 如何将 Python 程序添加到 Web 项目中?
- postgresql - TypeORM中的Postgres OVERLAPS日期函数
- python - 在熊猫中像树方法一样迭代