Python+OpenCV:左键点击选ROI点、双击结束,显示原始与采集ROI图像
要实现左键点击选取ROI点并显示ROI多边形,双击左键结束选择,并将原始图片与采集的ROI图像显示出来,可以使用Python和OpenCV库。以下是一个示例代码: ```python import cv2 import numpy as np # 全局变量 points = [] drawing = False image = None original_image = None def click_event(event, x, y, flags, param): global points, drawing, image if event == cv2.EVENT_LBUTTONDOWN: if not drawing: drawing = True points = [(x, y)] else: points.append((x, y)) if len(points) > 1: cv2.line(image, points[-2], points[-1], (0, 255, 0), 2) if len(points) > 2: cv2.fillPoly(image, [np.array(points)], (0, 255, 0)) cv2.imshow('Image', image) elif event == cv2.EVENT_LBUTTONDBLCLK: if drawing: drawing = False if len(points) > 2: # 闭合多边形 cv2.line(image, points[-1], points[0], (0, 255, 0), 2) cv2.fillPoly(image, [np.array(points)], (0, 255, 0)) # 提取ROI mask = np.zeros(image.shape[:2], dtype=np.uint8) cv2.fillPoly(mask, [np.array(points)], 255) roi_image = cv2.bitwise_and(original_image, original_image, mask=mask) # 显示原始图片和ROI图片 combined = np.hstack((original_image, roi_image)) cv2.imshow('Original and ROI Image', combined) # 读取图像 original_image = cv2.imread('path_to_your_image.jpg') image = original_image.copy() # 创建窗口 cv2.namedWindow('Image') cv2.setMouseCallback('Image', click_event) # 显示图像 cv2.imshow('Image', image) # 等待按键 while True: key = cv2.waitKey(1) & 0xFF if key == 27: # 按ESC键退出 break # 关闭所有窗口 cv2.destroyAllWindows() ``` 代码说明: 1. 全局变量:`points`用于存储用户点击的点,`drawing`用于标记是否正在绘制多边形,`image`用于显示当前状态的图像,`original_image`用于保存原始图像。 2. 鼠标事件回调函数:`click_event`处理鼠标事件。单击左键时添加点并绘制线段,双击左键时结束绘制并提取ROI。 3. 读取图像:从指定路径读取图像,并创建一个副本用于显示。 4. 创建窗口:创建一个窗口并设置鼠标事件回调函数。 5. 显示图像:显示初始图像。 6. 等待按键:进入循环等待用户按键,按ESC键退出程序。 使用方法: 1. 运行代码。 2. 在打开的图像窗口中,单击左键选择多边形的顶点。 3. 双击左键结束选择,程序会显示原始图像和提取的ROI图像。 4. 按ESC键退出程序。 请确保你已经安装了OpenCV库,可以使用以下命令安装: ```bash pip install opencv-python ``` 希望这个示例对你有帮助!如果有任何问题,请随时提问。 ######[AI写代码神器 | 784点数解答 | 2024-11-09 13:23:52]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)498
- Java 继承实现:重温经典剪刀石头布游戏(字节豆包 | 451点数解答 | 2024-10-20 19:57:58)485
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)451
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)443
- OpenCV.js 轻松实现图片识别:详细步骤全解析 ( | 824点数解答 | 2024-03-22 16:22:16)209
- OpenCV.js 实战:轻松识别图片中电梯轮廓( | 1193点数解答 | 2024-03-22 16:23:32)224
- 用 C++ 和 OpenCV 生成带随机偏移的圆周上的点:代码剖析(字节豆包 | 29点数解答 | 2024-11-06 23:40:42)277
- 易语言携手大漠插件:多窗口多线程单控脚本完整实现,含信息获取与模拟按键功能!(DeepSeek | 1541点数解答 | 2025-08-01 07:14:07)192
- 易语言+大漠插件:多窗口多线程单控脚本实现,含信息获取与模拟按键功能(字节豆包 | 949点数解答 | 2025-08-01 07:15:59)190
- 易语言结合大漠插件:多窗口多线程单控脚本开发全解析(阿里通义 | 1131点数解答 | 2025-08-01 07:16:58)178
- 单机版保质期管理系统 HTML 实现及开发要点(字节豆包 | 2458点数解答 | 2026-04-01 06:49:18)34
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)421