74人参与 • 2024-08-06 • pygame
做目标检测的时候,设置检测区域可以有效减少误识别。之前画区域比较少,都是通过ps一点点取坐标,画面一变动就得重新画区域,一直想着自己开发一个脚本来方便取坐标。
使用的是pygame库,在窗口加载图片,设置窗口的大小为图片的宽高。监听窗口内鼠标点击的坐标,最后关闭窗口的时候保存坐标到指定文件。
import sys
import pygame
from pil import image
if __name__ == '__main__':
# 输入图片文件
input = sys.argv[1]
# 输出坐标保存文件
ouput = sys.argv[2]
image = image.open(input).convert('rgb')
width = image.size[0]
height = image.size[1]
pygame.init()
# 创建surface屏幕对象,大小为图片的宽高
screen = pygame.display.set_mode([width, height])
# 加载图片
back_image = pygame.image.load(input)
# 绘制图像
screen.blit(back_image, [0, 0])
# 用来存储单个框和所有框的坐标点
points = []
total_points = []
while true:
for event in pygame.event.get():
# 通过监听esc按键来判断一个框的结束,并清空数组重新记录另一个框
if event.type == pygame.keydown:
total_points.append(points)
points = []
if event.type == pygame.quit:
# 点击关闭窗口的时候,把坐标点都保存到指定的文件
with open('1.txt', mode='+w') as fs:
fs.write(str(total_points))
fs.close()
# 退出程序
sys.exit()
if event.type == pygame.mousebuttondown:
# 重新加载图片,是为了把每次都重新按照顺序画线,不然会出现三点一闭合,不连贯问题
back_image = pygame.image.load(input)
# 绘制图像
screen.blit(back_image, [0, 0])
pos = event.pos
points.append([pos[0], pos[1]])
# 绘画多个框
if len(total_points) > 0:
for poly in total_points:
pygame.draw.polygon(screen, (255, 0, 0), poly, 3)
# 两点成线,这里必须有两个坐标以上才能划线
if len(points) > 1:
pygame.draw.polygon(screen, (255, 0, 0), points, 3)
# 在窗口的顶部实时显示鼠标所在坐标
position = pygame.mouse.get_pos()
pygame.display.set_caption(str(position))
# 将内容显示到屏幕上
pygame.display.flip()
import cv2
import sys
import numpy as np
if __name__ == '__main__':
file = sys.argv[1]
input = sys.argv[2]
ouput = sys.argv[3]
# 读取文件中的坐标点
with open(file) as fs:
poly_list = eval(fs.read())
fs.close()
img = cv2.imread(input)
for poly in poly_list:
pts = np.array(poly, np.int32)
# 画线
cv2.polylines(img, [pts], isclosed=true, color=(0, 0, 255), thickness=2)
cv2.imwrite(ouput, img)
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论