首页 > 编程语言 >小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象

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

时间:2023-10-22 17:07:46浏览次数:45  
标签:img point Python True image cv2 OpenCV 小白学 ref

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

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象_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() 

输出:

小白学Python - 使用 Python 的 OpenCV 绘制矩形并提取对象_ci_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 绘制矩形并提取对象_OpenCV_03


图:所选部分

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

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

标签:img,point,Python,True,image,cv2,OpenCV,小白学,ref
From: https://blog.51cto.com/demo007x/7977329

相关文章

  • 小白学Python - 在 Python 中使用 TensorFlow 进行面部口罩检测
    在Python中使用TensorFlow进行面部口罩检测我们将使用此Python脚本来训练口罩检测器并查看结果。鉴于训练有素的COVID-19口罩检测器,我们将继续实现另外两个Python脚本,用于:检测图像中的COVID-19口罩检测实时视频流中的口罩口罩检测系统流程图 为了训练自定义口罩检测器......
  • Python第七课——函数
    记忆关键点:一、定义函数defgreet_user():"""显示简单的问候语"""print("hello!")greet_user()defgreet_user():"""显示简单的问候语"""print("hello!")greet_user()defgreet_user(username):......
  • Python 函数:定义、调用、参数、递归和 Lambda 函数详解
    函数是一段代码块,只有在调用时才会运行。您可以将数据(称为参数)传递给函数。函数可以返回数据作为结果。创建函数在Python中,使用def关键字定义函数:示例defmy_function():print("Hellofromafunction")调用函数要调用函数,请使用函数名称后跟括号:示例defmy_function......
  • Python 函数:定义、调用、参数、递归和 Lambda 函数详解
    函数是一段代码块,只有在调用时才会运行。您可以将数据(称为参数)传递给函数。函数可以返回数据作为结果。创建函数在Python中,使用def关键字定义函数:示例defmy_function():print("Hellofromafunction")调用函数要调用函数,请使用函数名称后跟括号:示例defmy_function(......
  • 【python疑难杂症】
    报错:TypeError:scatterplot()takesfrom0to1positionalargumentsbut2weregiven问题:我猜出这个报错的都是这么写的:x_data=[1,2,3]y_data=[4,5,6]sns.scatterplot(x_data,y_data)plt.show()解法:在x_data前面加x=,y_data前面加y=,即:x_data=[1,2,3]y_da......
  • Python scrapy爬虫框架爬取廖雪峰大佬官网Python教程左侧目录
    文章转载至:mob6454cc6f27a3 的PythonScrapy爬虫框架实例(一)爬虫框架scrapy简单实例吃面崩掉牙的Scrapy爬虫框架入门教程(1)——爬取廖雪峰老师的博客!!只是爬取一个字段,并不将爬取的数据存储下来。!!运行环境:window10x64系统python3.6pycharmanacondascrapy安装好以上环境、包之后,......
  • Python教程(15)——Python流程控制语句详解
    Python流程控制是Python编程中非常重要的一部分,它用于控制程序的执行流程。Python提供了多种流程控制语句,包括if语句、while循环、for循环、break和continue语句等。这种流程控制在各个语言中都是大同小异的,如果你已经学过其他的语言,那么这章节就可以直接跳过。if语句if语句用于......
  • Python教程(15)——Python流程控制语句详解
    Python流程控制是Python编程中非常重要的一部分,它用于控制程序的执行流程。Python提供了多种流程控制语句,包括if语句、while循环、for循环、break和continue语句等。这种流程控制在各个语言中都是大同小异的,如果你已经学过其他的语言,那么这章节就可以直接跳过。if语句if语句用......
  • python--猜数字游戏改编版2--用函数套用
    #猜数字游戏让游戏者决定几到几的数字,用函数做defcaishuzi_game(x,y):importrandomx=int(random.randint(x,y))b=int(input("请输入你要猜的数字"))a=1whilea<5:b=int(input("请输入你要猜的数字"))ifx==b:print("恭......
  • python遍历一个xlsx中的多个表
    遍历xlsx中的多个表:比如说如果有如下xlsx,里面有4张表,如何遍历出4张表中的数据?   步骤:(1)用load_workbook函数打开excel文件,返回一个工作簿对象(2)用工作簿对象获取所有的sheet(3)第一个for循环遍历所有sheet(4)每次遍历sheet时,先用get_sheet_by_name获取要遍历的sheet(5)开始下一个......