使用 Python 的 OpenCV 绘制矩形并提取对象
OpenCV是一个开源计算机视觉和机器学习软件库。可以在它的帮助下完成各种图像处理操作,例如操纵图像和应用大量滤镜。它广泛用于对象检测、人脸检测和其他图像处理任务。
让我们看看如何使用 OpenCV 在图像上绘制矩形并提取对象。
编写代码
# Python program to extract rectangular
# Shape using OpenCV in Python3
import cv2
import numpy as np
drawing = False # true if mouse is pressed
mode = True # if True, draw rectangle.
ix, iy = -1, -1
# mouse callback function
def draw_circle(event, x, y, flags, param):
global ix, iy, drawing, mode
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
ix, iy = x, y
elif event == cv2.EVENT_MOUSEMOVE:
if drawing == True:
if mode == True:
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)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
if mode == True:
cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 2)
else:
cv2.circle(img, (x, y), 5, (0, 0, 255), -1)
img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)
while(1):
cv2.imshow('image', img)
k = cv2.waitKey(1) & 0xFF
if k == ord('m'):
mode = not mode
elif k == 27:
break
cv2.destroyAllWindows()
输出:
上面的代码仅适用于黑色背景图像。但矩形可以绘制到任何图像上。我们可以编写一个程序,允许我们选择图像中所需的部分并提取该所选部分。任务包括以下内容
- 在任何图像上绘制形状
- 重新选择提取部分以防选择错误
- 从图像中提取特定对象
代码实现
# Write Python code here
# import the necessary packages
import cv2
import argparse
# 现在让我们初始化参考点列表
ref_point = []
crop = False
def shape_selection(event, x, y, flags, param):
# 抓取对全局变量的引用
global ref_point, crop
# 如果点击了鼠标左键,则记录起始的
# (x, y) 坐标,并表示正在进行裁剪
if event == cv2.EVENT_LBUTTONDOWN:
ref_point = [(x, y)]
# 检查鼠标左键是否被释放
elif event == cv2.EVENT_LBUTTONUP:
# 记录终点(x、y)坐标,并指出
# 裁剪操作已完成
ref_point.append((x, y))
# 在感兴趣的区域周围画一个矩形
cv2.rectangle(image, ref_point[0], ref_point[1], (0, 255, 0), 2)
cv2.imshow("image", image)
# 构建参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help ="Path to the image")
args = vars(ap.parse_args())
# 加载图像,克隆它,并设置鼠标回调函数
image = cv2.imread(args["image"])
clone = image.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", shape_selection)
# 继续循环,直到按下 "q "键
while True:
# 显示图像并等待按键
cv2.imshow("image", image)
key = cv2.waitKey(1) & 0xFF
# 按 "r "重置窗口
if key == ord("r"):
image = clone.copy()
# 如果按下 "c "键,则跳出循环
elif key == ord("c"):
break
if len(ref_point) == 2:
crop_img = clone[ref_point[0][1]:ref_point[1][1], ref_point[0][0]:
ref_point[1][0]]
cv2.imshow("crop_img", crop_img)
cv2.waitKey(0)
# 关闭所有打开的窗口
cv2.destroyAllWindows()
运行:将文件保存为capture_events.py并选择位于同一目录中的演示图片进行测试。现在,执行以下命令 –
python capture_events.py --image demo.jpg
输出
首先从图像中选择所需的部分。此外,我们可以按编程按“r”来删除错误的选择,以进行新的正确选择。
图:所选部分
现在,在像上面这样选择正确的选项后,只需按“c”即可按照编程进行提取。
图:切开部分