基于pygame 图片多边形坐标获取


简介

做目标检测的时候,设置检测区域可以有效减少误识别。之前画区域比较少,都是通过ps一点点取坐标,画面一变动就得重新画区域,一直想着自己开发一个脚本来方便取坐标。


视频效果预览

基于pygame 图片多边形坐标获取

使用的是pygame库,在窗口加载图片,设置窗口的大小为图片的宽高。监听窗口内鼠标点击的坐标,最后关闭窗口的时候保存坐标到指定文件。


一、取坐标点 draw.py

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()

执行命令 python draw.py 1.jpg 1.txt

二、检测生成的坐标点是否正确 test.py

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)

执行命令 python test.py 1.txt 1.jpg 2.jpg


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Pygame是一个开源的Python游戏开发库,它提供了丰富的功能和工具,使开发者能够创建各种类型的游戏。其中六边形地图是Pygame中非常常见的一种地图类型。 六边形地图是由一系列六边形组成的二维平面。每个六边形都有六个相邻的六边形,使得地图的连接具有很好的连续性和平滑性。因此,六边形地图常用于策略类游戏、角色扮演游戏以及地图展示等领域。 在Pygame中创建六边形地图可以通过一系列的计算和绘制操作来实现。首先,我们需要确定地图的大小以及六边形的尺寸和边长。然后,可以通过循环嵌套的方式来创建每个六边形,并为其设置合适的位置和颜色。 在绘制六边形地图时,我们可以使用Pygame的图形绘制函数,如pygame.draw.polygon()来绘制每个六边形的边框。同时,我们也可以使用pygame.draw.circle()函数来绘制六边形的中心点,以及pygame.draw.line()函数来绘制连接相邻六边形的边界线。 除了绘制地图,我们还可以为每个六边形赋予特定的属性,如地形类型、可通行性、资源等。这样,在游戏中我们可以根据六边形的属性来进行路径规划、单位移动以及资源采集等操作。 总的来说,Pygame提供了丰富的图形绘制和计算功能,可以很方便地创建和操作六边形地图。通过合理的设计和开发,我们可以实现各种各样的游戏场景,给玩家带来更加丰富多样的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会代码的小林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值