0
点赞
收藏
分享

微信扫一扫

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象

使用 Python 的 OpenCV 绘制矩形并提取对象

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象_ci

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

输出:

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象_OpenCV_02

上面的代码仅适用于黑色背景图像。但矩形可以绘制到任何图像上。我们可以编写一个程序,允许我们选择图像中所需的部分并提取该所选部分。任务包括以下内容

  • 在任何图像上绘制形状
  • 重新选择提取部分以防选择错误
  • 从图像中提取特定对象

代码实现

# 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”来删除错误的选择,以进行新的正确选择。

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象_Python_03


图:所选部分

现在,在像上面这样选择正确的选项后,只需按“c”即可按照编程进行提取。
图:切开部分

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象_OpenCV_04

举报

相关推荐

0 条评论