使用python,在一幅或两幅图像中利用鼠标单击方式采集样本,输出代码(1)若两区域特征相同,则在两区域的中心分别单击鼠标,然后将以鼠标为中心的两区域保存并设置为相同类别(可保存多个尺寸)。以同样的方式保存
时间: 2024-02-06 18:09:49 浏览: 94
以下是一个示例代码,可以实现鼠标单击采集样本的功能,同时对于两个相同区域,可以将其保存并设置为相同类别:
```python
import cv2
# 定义全局变量
selected_regions = []
current_class = 0
# 鼠标单击回调函数
def mouse_callback(event, x, y, flags, params):
global selected_regions, current_class
# 左键单击,选择区域
if event == cv2.EVENT_LBUTTONDOWN:
roi = cv2.selectROI(params["image"])
if roi[2] > 0 and roi[3] > 0:
selected_regions.append((roi, current_class))
cv2.rectangle(params["image"], (roi[0], roi[1]), (roi[0] + roi[2], roi[1] + roi[3]), (0, 255, 0), 2)
# 右键单击,切换类别
if event == cv2.EVENT_RBUTTONDOWN:
current_class = (current_class + 1) % 2
# 加载图像
image1 = cv2.imread("image1.png")
image2 = cv2.imread("image2.png")
# 显示图像
cv2.imshow("image1", image1)
cv2.imshow("image2", image2)
# 设置回调函数
cv2.setMouseCallback("image1", mouse_callback, {"image": image1})
cv2.setMouseCallback("image2", mouse_callback, {"image": image2})
# 按下 Esc 键退出程序
while True:
key = cv2.waitKey(1) & 0xFF
if key == 27:
break
# 保存选中的区域
for i, (roi, class_id) in enumerate(selected_regions):
x, y, w, h = roi
crop = image1[y:y+h, x:x+w]
cv2.imwrite(f"{class_id}_{i}_image1.png", crop)
crop = image2[y:y+h, x:x+w]
cv2.imwrite(f"{class_id}_{i}_image2.png", crop)
# 释放窗口
cv2.destroyAllWindows()
```
这个代码使用 `cv2.selectROI()` 函数来选择感兴趣的区域,同时利用一个列表 `selected_regions` 来保存选中的区域。在每次单击鼠标时,会检查当前的类别(0 或 1),并将当前选中的区域与类别一起保存到列表中。可以利用 `cv2.rectangle()` 函数在图像上绘制矩形框来表示已选中的区域。
最后,在程序退出时,会将选中的区域分别从两个图像中裁剪出来,并保存为两个不同的文件。可以根据需要修改保存的文件名和路径。
阅读全文