通过孪生神经网络实现在一幅或两幅图像中利用鼠标单击方式采集样本。 (1)若两区域特征相同,则在两区域的中心分别单击鼠标,然后将以鼠标为中心的两区域保存并设置为相同类别(可保存多个尺寸)。 (2)以同样的方式保存不同的区域并设置为不同类别。用python实现并输出代码
时间: 2024-02-01 08:15:10 浏览: 73
以下是一个简单的 Python 实现,实现了利用鼠标单击方式采集样本,保存并设置为相同或不同类别的功能。本实现使用了Tkinter库来创建GUI界面,使用OpenCV库来处理图像。
```python
import cv2
import tkinter as tk
from tkinter import filedialog
class SampleCollector:
def __init__(self, master):
self.master = master
self.master.title("Sample Collector")
# 设置GUI界面
self.image_frame = tk.Frame(self.master)
self.image_frame.pack(side=tk.TOP, padx=10, pady=10)
self.btn_frame = tk.Frame(self.master)
self.btn_frame.pack(side=tk.BOTTOM, padx=10, pady=10)
self.img_label1 = tk.Label(self.image_frame)
self.img_label1.pack(side=tk.LEFT, padx=10, pady=10)
self.img_label2 = tk.Label(self.image_frame)
self.img_label2.pack(side=tk.RIGHT, padx=10, pady=10)
self.save_same_btn = tk.Button(self.btn_frame, text="Save Same", command=self.save_same)
self.save_same_btn.pack(side=tk.LEFT, padx=10, pady=10)
self.save_diff_btn = tk.Button(self.btn_frame, text="Save Different", command=self.save_diff)
self.save_diff_btn.pack(side=tk.RIGHT, padx=10, pady=10)
# 初始化变量
self.img1 = None
self.img2 = None
self.img1_rect = None
self.img2_rect = None
self.same_class = False
# 打开图片文件
self.open_image()
# 绑定鼠标事件
self.img_label1.bind("<Button-1>", lambda event: self.select_region(event, 1))
self.img_label2.bind("<Button-1>", lambda event: self.select_region(event, 2))
def open_image(self):
# 打开图片文件
file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png;*.jpg;*.jpeg")])
if file_path:
# 读取图片文件
img = cv2.imread(file_path)
# 转换为RGB格式并显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.img1 = img
self.img2 = img.copy()
self.show_image()
def show_image(self):
# 将图片转换为Tkinter格式并显示
img1_tk = self.convert_to_tk(self.img1)
img2_tk = self.convert_to_tk(self.img2)
self.img_label1.config(image=img1_tk)
self.img_label1.image = img1_tk
self.img_label2.config(image=img2_tk)
self.img_label2.image = img2_tk
def select_region(self, event, label):
# 获取鼠标单击的位置
x, y = event.x, event.y
# 在对应的图片上绘制矩形
if label == 1:
if self.img1_rect:
self.img1 = self.img1_rect.copy()
self.img1_rect = self.img1.copy()
cv2.rectangle(self.img1_rect, (x-50, y-50), (x+50, y+50), (0, 255, 0), 2)
self.show_image()
elif label == 2:
if self.img2_rect:
self.img2 = self.img2_rect.copy()
self.img2_rect = self.img2.copy()
cv2.rectangle(self.img2_rect, (x-50, y-50), (x+50, y+50), (0, 255, 0), 2)
self.show_image()
def save_same(self):
# 保存相同类别的样本
if self.img1_rect is not None and self.img2_rect is not None:
# 将两个矩形合并为一个大矩形
x1, y1, x2, y2 = self.get_combined_rect(self.img1_rect, self.img2_rect)
# 保存矩形区域
region1 = self.img1[y1:y2, x1:x2]
region2 = self.img2[y1:y2, x1:x2]
# 保存为同一个文件
file_path = filedialog.asksaveasfilename(defaultextension=".jpg")
if file_path:
cv2.imwrite(file_path, region1)
cv2.imwrite(file_path, region2)
def save_diff(self):
# 保存不同类别的样本
if self.img1_rect is not None and self.img2_rect is not None:
# 将两个矩形合并为一个大矩形
x1, y1, x2, y2 = self.get_combined_rect(self.img1_rect, self.img2_rect)
# 保存矩形区域
region1 = self.img1[y1:y2, x1:x2]
region2 = self.img2[y1:y2, x1:x2]
# 保存为不同的文件
file_path1 = filedialog.asksaveasfilename(defaultextension=".jpg")
file_path2 = filedialog.asksaveasfilename(defaultextension=".jpg")
if file_path1 and file_path2:
cv2.imwrite(file_path1, region1)
cv2.imwrite(file_path2, region2)
def get_combined_rect(self, rect1, rect2):
# 获取两个矩形的位置信息
x1_1, y1_1, x2_1, y2_1 = self.get_rect_coords(rect1)
x1_2, y1_2, x2_2, y2_2 = self.get_rect_coords(rect2)
# 获取合并后的矩形的位置信息
x1 = min(x1_1, x1_2)
y1 = min(y1_1, y1_2)
x2 = max(x2_1, x2_2)
y2 = max(y2_1, y2_2)
return x1, y1, x2, y2
def get_rect_coords(self, rect):
# 获取矩形的位置信息
x1, y1, x2, y2 = rect.shape[1], rect.shape[0], 0, 0
for row in range(rect.shape[0]):
for col in range(rect.shape[1]):
if rect[row, col, 1] == 255:
if col < x1:
x1 = col
if col > x2:
x2 = col
if row < y1:
y1 = row
if row > y2:
y2 = row
return x1, y1, x2, y2
def convert_to_tk(self, img):
# 将OpenCV格式的图片转换为Tkinter格式
img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
img = cv2.resize(img, (400, 400))
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = Image.fromarray(img)
img = ImageTk.PhotoImage(img)
return img
if __name__ == '__main__':
root = tk.Tk()
app = SampleCollector(root)
root.mainloop()
```
该实现包括以下功能:
1. 打开图片文件
2. 在图片上选择矩形区域
3. 将两个矩形合并为一个大矩形
4. 保存矩形区域为同一类别或不同类别的样本
您可以根据自己的需求进行修改和扩展。
阅读全文