⭐ Unity里 用OpenCv 插件 将图片生成Gcode

现在遇到一个需求,用Unity里用图片生成Gcode

告知硬件让它去画出来

翻阅了一些资料,最后决定用OpenCV去做

下图左侧是生成的Gcode文件 右侧是要画的图片

话不多说直接上代码

using System.IO;
using UnityEngine;
using OpenCVForUnity.CoreModule;
using OpenCVForUnity.ImgprocModule;
using OpenCVForUnity.UnityUtils;
using System.Collections.Generic;
using OpenCVForUnity.ImgcodecsModule;

public class ImageToGCode : MonoBehaviour
{
    void Start()
    {
        // 加载图像
        Mat src = Imgcodecs.imread("C:/Users/Administrator/Desktop/edc86edc_E375522_2c6a6d08.png");

        // 转换为灰度图像
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);

        // 应用二值化
        Mat binary = new Mat();
        Imgproc.threshold(gray, binary, 128, 255, Imgproc.THRESH_BINARY_INV);

        // 边缘检测
        Mat edges = new Mat();
        Imgproc.Canny(binary, edges, 50, 150, 3, false);

        // 查找轮廓
        List<MatOfPoint> contours = new List<MatOfPoint>();
        Mat hierarchy = new Mat();
        Imgproc.findContours(edges, contours, hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);

        Debug.Log(contours.Count+"<=数量");
        // 将轮廓转换成G-code
        string gcode = generateGCode(contours);

        // 输出G-code到文件
        using (StreamWriter writer = new StreamWriter("C:/Users/Administrator/Desktop/output001.gcode"))
        {
            writer.Write(gcode);
        }
    }

    private static string generateGCode(List<MatOfPoint> contours)
    {
        System.Text.StringBuilder sb = new System.Text.StringBuilder();

        // G-code初始化,设置单位等
        sb.Append("G21 ; Set units to millimeters\n");
        sb.Append("G90 ; Use absolute coordinates\n");
        sb.Append("M3 S0 ; Turn off laser\n");

        for (int i = 0; i < contours.Count; i++)
        {
            MatOfPoint contour = contours[i];

            // 获取轮廓的第一个点
            Point[] points = contour.toArray();
            Point firstPoint = points[0];
            sb.Append(string.Format("G0 X{0:F3} Y{1:F3} F1500.00\n", firstPoint.x * 0.5, firstPoint.y * 0.5));
            sb.Append("M3 S1000 ; Turn on laser to start cutting\n");

            // 遍历轮廓的其他点
            for (int j = 1; j < points.Length; j++)
            {
                Point point = points[j];
                sb.Append(string.Format("G1 X{0:F3} Y{1:F3} F1500.00\n", point.x * 0.5, point.y * 0.5));
            }

            // 关闭激光并移动到下一个轮廓的起始点
            sb.Append("M3 S0 ; Turn off laser\n");
        }

        // 结束G-code
        sb.Append("M5 ; Stop laser/spindle\n");
        sb.Append("G0 X0 Y0 ; Return to home\n");

        return sb.ToString();
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/221170.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第十五届蓝桥杯模拟赛B组(第二期)C++

前言&#xff1a; 第一次做蓝桥模拟赛的博客记录&#xff0c;可能有很多不足的地方&#xff0c;现在将第十五届蓝桥杯模拟赛B组&#xff08;第二期&#xff09;的题目与代码与大家进行分享&#xff0c;我是用C做的&#xff0c;有好几道算法题当时自己做的也是一脸懵&#xff0c…

财报解读:立足海外音视频直播战场,欢聚的BIGO盾牌还需加强?

如今&#xff0c;音视频社交平台出海早已不是新鲜事&#xff0c;随着时间推移&#xff0c;一批“坚定全球化不动摇”的企业也实现突围&#xff0c;站在出海舞台中心。 若提到中国企业出海范本&#xff0c;欢聚集团定是绕不开的存在。作为最早一批出海的中国互联网企业&#xf…

CS144(2023 Spring)Lab 0:networking warmup(环境搭建 webget bytestream)

文章目录 前言其他笔记相关链接 1. Set up GNU/Linux on your computer2. Networking by hand3. Writing a network program using an OS stream socket3.1 Linux配置3.2 C规范3.3 Writing webget3.3.1 实现3.3.2 测试 4. An in-memory reliable byte stream4.1 思路分析4.2 代…

记录 | vscode设置自动换行

右上菜单栏 -> 查看 -> 打开自动换行 或者还有种方式&#xff0c;如下&#xff0c; 左下角小齿轮&#xff0c;点击设置 然后输入 Editor: Word Wrap &#xff0c;把开关打开为 on

扩散模型实战(十四):扩散模型生成音频

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

使用 Go Modules 管理依赖:简明教程

一、GoLang 中包的介绍和定义 包&#xff08;package&#xff09;是多个 Go 源码的集合&#xff0c;是一种高级的代码复用方案Go 语言为我们提供了很多内置包&#xff0c;如 fmt、strconv、strings、sort、errors、times、encoding/json、os、io 等Golang 中的包可以分为三种&…

C# WPF上位机开发(图形显示软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在实际应用中&#xff0c;有一种情况就是&#xff0c;我们需要经常对数据进行图形化显示&#xff0c;这样会比较直观一点。比如经济统计里面的同比…

宝塔部署appache部署ssl证书无法访问443端口

原因&#xff1a; 不是部署方法错误&#xff0c;而是操作不当&#xff0c;原来一开始为了测试我去修改了appache默配置路径下的httpd-ssl.donf&#xff0c;此文件一般 在appche/conf/extra/目录下&#xff08;版本不同目录可能有所区别&#xff09;。 导致问题&#xff1a; 在…

【数据结构和算法】到达首都的最少油耗

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 前言 这是力扣的2477题&#xff0c;难度为中等&#xff0c;解题方案有很多种&…

用友NC Cloud FileParserServlet反序列化RCE漏洞复现

0x01 产品简介 用友 NC Cloud 是一种商业级的企业资源规划云平台,为企业提供全面的管理解决方案,包括财务管理、采购管理、销售管理、人力资源管理等功能,实现企业的数字化转型和业务流程优化。 0x02 漏洞概述 用友 NC Cloud FileParserServlet接口存在反序列化代码执行漏…

Amazon CodeWhisperer 正式可用, 并面向个人开发者免费开放

文章作者&#xff1a;深度-围观 北京——2023年4月18日&#xff0c;亚马逊云科技宣布&#xff0c;实时 AI 编程助手 Amazon CodeWhisperer 正式可用&#xff0c;同时推出的还有供所有开发人员免费使用的个人版&#xff08;CodeWhisperer Individual&#xff09;。CodeWhisperer…

微服务1 springcloud学习笔记P1-P40

b微服务技术栈_哔哩哔哩_bilibili 文档资料: 链接&#xff1a;https://pan.baidu.com/s/1P_Ag1BYiPaF52EI19A0YRw?pwdd03r 提取码&#xff1a;d03r 一 了解微服务技术 二 Eureka (1) Eureka配置 (2) 注册user-service (3) 总结 Ribbon 负载均衡 (1) 流程 三 nacos配置管理…

在AWS EC2中部署和使用Apache Superset的方案

大纲 1 Superset部署1.1 启动AWS EC21.2 下载Superset Docker文件1.3 修改Dockerfile1.4 配置管理员1.5 结果展示1.6 检查数据库驱动1.7 常见错误处理 2 Glue&#xff08;可选参考&#xff09;3 IAM与安全组3.1 使用AWS Athena3.2 使用AWS RedShift或AWS RDS3.2.1 查看AWS Reds…

JavaScript <md5加密的两种不同输出结果分析>--案例(二点一)

前言: 问题是这样的,在浏览器中看到这段代码 然后在控制台进行输出.得到: 紧接着,就在,js文件里面进行转译: 可是,得到的结果是: 这是问题!!! 正题: 为什么相同的js代码,在 .js 文件中的输出与 Chrome 控制台中的输出不一样? 环境差异&#xff1a;不同的JavaScript环境&…

dante(centos)安装

下载安装包 https://www.inet.no/dante/doc/latest/config/index.html 下载软件 解压 tar -zxvf dante-1.4.3.tar.gz 或者 wget http://www.inet.no/dante/files/dante-1.4.3.tar.gz tar -xvzf dante-1.4.3.tar.gz 编译 cd dante-1.4.3 yum install gcc make -y ##编译必备 …

活动目录是什么?

企业在进行数字化转型时&#xff0c;也会面临日益增长的网络用户和复杂的身份管理需求。为了高效地管理用户身份、控制访问权限以及保护企业的数据安全&#xff0c;许多企业选择使用微软的Active Directory&#xff0c;即微软活动目录&#xff0c;来作为网络身份管理系统。 1、…

DS图应用--最短路径

Description 给出一个图的邻接矩阵&#xff0c;再给出指定顶点v0&#xff0c;求顶点v0到其他顶点的最短路径 Input 第一行输入t&#xff0c;表示有t个测试实例 第二行输入n&#xff0c;表示第1个图有n个结点 第三行起&#xff0c;每行输入邻接矩阵的一行&#xff0c;以此类…

关于先更新再缓存这种缓存方案设计的思考

这两天正在做公司缓存方面的设计&#xff0c;然后就把自己的思考过程整理一下。 网上对于这块的内容讲解也非常的多&#xff0c;有些说的也都非常的在理&#xff0c;关于缓存一致性的方案也就那么几种&#xff0c;如&#xff1a;先更新、再删&#xff0c;先删、在更新&#xff…

【Polar靶场WEB签到】

题目&#xff1a; <?phperror_reporting(0);$file $_GET[file];if(!isset($file))$file 1;$file str_replace(../, , $file);include_once($file.".php");highlight_file(__FILE__); ?>解答&#xff1a;1、进入index页面&#xff0c;说让你加弟弟&#x…

WordPiece词表的创建

文章目录 一、简单介绍二、步骤流程2.1 预处理2.2 计数2.3 分割2.4 添加subword 三、代码实现 本篇内容主要介绍如何根据提供的文本内容创建 WordPiece vocabulary&#xff0c;代码来自谷歌&#xff1b; 一、简单介绍 wordpiece的目的是&#xff1a;通过考虑单词内部构造&…