首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >开源项目|今天不当拼图仔,机器视觉来拼图

开源项目|今天不当拼图仔,机器视觉来拼图

作者头像
keyle
发布2024-11-01 12:19:54
发布2024-11-01 12:19:54
3250
举报
文章被收录于专栏:礼拜八不工作礼拜八不工作

左侧为示例图,右侧为子图,绿框区域为机器视觉识别到的位置。

这两天有个脑洞想要实现一下,现在有了一点眉目在这边报个喜。

传统项目开发过程中UI出图之后,进行切图。然后由UE或者程序去进行游戏引擎内的拼接,这个过程虽然伤害不大但是费眼神。那么有办法解决吗?

有,还不少,PSD to Unity 的类似方案。实际上这部分拼图的工作让UI承担了。笑容只是从UI的脸上转移到了别人脸上。工作量仍然存在。

既然如此,我们不妨换个思路,旧的流程不变,仍旧是UI出layer(底板图)以及切片过的UI。我们通过机器视觉将切片定位到layer图的精确坐标。

算法如下:

代码语言:javascript
复制
    def match(self, single_image_path, mode=cv2.TM_CCOEFF_NORMED, show_preview=False):
        single_image = cv2.imread(single_image_path)
        result = cv2.matchTemplate(self.big_image, single_image, mode)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
        
        # 如果最大匹配值小于阈值,则认为没有找到匹配的位置
        threshold = 0.8  # 设置阈值
        if max_val < threshold:
            return None, None
        
        top_left = max_loc
        
        if len(single_image.shape) == 2:
            h, w = single_image.shape
        else:
            h, w, _ = single_image.shape
        
        bottom_right = (top_left[0] + w, top_left[1] + h)
        
        if show_preview:
            # 在大图中标记出单独图像的位置
            marked_image = self.big_image.copy()
            cv2.rectangle(marked_image, top_left, bottom_right, (0, 255, 0), 2)
            # 显示标记后的大图
            cv2.imshow('Located Image', marked_image)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
        
        return top_left, bottom_right

最后将这个坐标保存,以及定义一些切片图的命名后缀。

接下来要做的工作就是拿到坐标信息,在不同的UI环境下自动生成摆放好的UI界面。

现在我已经做了如下工作:

路径扫描,图片识别,按照文件大小排序记录位置信息保存在当前文件夹下,如果有深一层路径继续往下扫描。

目前看下来准确率非常高,后面有空就在fairygui,或者ugui中实现一版,自动拼图工具。

代码会对其他图片按照像素尺寸进行排序,以确保先处理尺寸较大的图片。

源代码我放github了,关注公众号发送 001 即可获取地址

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 礼拜八不工作 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档