当前位置: 首页 > news >正文

网店网络推广方案深圳网页设计公司搜行者seo

网店网络推广方案,深圳网页设计公司搜行者seo,免费p2p网站建设,小企业网站建设论文基于OpenCV灰度图像转GCode的单向扫描实现 引言单向扫描存在的问题灰度图像单向扫描代码示例结论 系列文章 ⭐深入理解G0和G1指令#xff1a;C中的实现与激光雕刻应用⭐基于二值化图像转GCode的单向扫描实现⭐基于二值化图像转GCode的双向扫描实现⭐基于二值化图像转GCode的…基于OpenCV灰度图像转GCode的单向扫描实现 引言单向扫描存在的问题灰度图像单向扫描代码示例结论 系列文章 ⭐深入理解G0和G1指令C中的实现与激光雕刻应用⭐基于二值化图像转GCode的单向扫描实现⭐基于二值化图像转GCode的双向扫描实现⭐基于二值化图像转GCode的斜向扫描实现⭐基于二值化图像转GCode的螺旋扫描实现⭐基于OpenCV灰度图像转GCode的单向扫描实现⭐基于OpenCV灰度图像转GCode的双向扫描实现⭐基于OpenCV灰度图像转GCode的斜向扫描实现⭐基于OpenCV灰度图像转GCode的螺旋扫描实现 ⭐**系列文章GitHub仓库地址** 基于OpenCV灰度图像转GCode的单向扫描实现 本文将介绍如何使用OpenCV库将灰度图转换为GCode并通过单向扫描实现对图像的激光雕刻。GCode是一种用于控制数控机床和3D打印机的指令语言而OpenCV是一种开源计算机视觉库。通过结合这两者我们可以实现从图像到GCode的转换进而在机器上实现图像的物理输出。 引言 在数字制造时代将图像转换为GCode是实现自动化加工和打印的关键步骤。本文将探讨如何利用OpenCV库将灰度图转换为GCode并通过单向扫描的方式实现对图像的激光雕刻。 上图是未做任何处理直接从灰度图转换成GCode。 优化后生成的GCode如上所示 原始图像如上所示 单向扫描存在的问题 单向操作存在来回折返空行程问题导致加工时间变长。 本文主要通过使用以下形式的代码删除了多余的行程空跑没任何意义的G0。 while(x image.cols image.atstd::uint8_t(y, x) 255) {length; } --x;实现了未优化版本和优化版本的单向扫描两者加工时间从生成的GCode代码上可以看出有了很大差异。 红色是 G0绿色是加工部分 G1。 当然如果使用双向扫描方向加工时间差异会更大。 灰度图像单向扫描代码示例 编译器要求最低 C23 #pragma once #include opencv2/opencv.hpp #include fstream #include print #include vector #include optional #include rangesstruct G0 {std::optionalfloat x, y;std::optionalint s;std::string toString() {std::string command G0;if(x.has_value()) {command std::format( X{:.3f}, x.value());}if(y.has_value()) {command std::format( Y{:.3f}, y.value());}if(s.has_value()) {command std::format( S{:d}, s.value());}return command;}explicit operator std::string() const {std::string command G0;if(x.has_value()) {command std::format( X{:.3f}, x.value());}if(y.has_value()) {command std::format( Y{:.3f}, y.value());}if(s.has_value()) {command std::format( S{:d}, s.value());}return command;} };struct G1 {std::optionalfloat x, y;std::optionalint s;std::string toString() {std::string command G1;if(x.has_value()) {command std::format( X{:.3f}, x.value());}if(y.has_value()) {command std::format( Y{:.3f}, y.value());}if(s.has_value()) {command std::format( S{:d}, s.value());}return command;}explicit operator std::string() const {std::string command G1;if(x.has_value()) {command std::format( X{:.3f}, x.value());}if(y.has_value()) {command std::format( Y{:.3f}, y.value());}if(s.has_value()) {command std::format( S{:d}, s.value());}return command;} };class ImageToGCode { public:// 激光模式enum class LaserMode {Cutting, // 切割 M3 Constant PowerEngraving, // 雕刻 M4 Dynamic Power};// 扫描方式enum class ScanMode {Unidirection, // 单向Bidirection, // 双向};struct kEnumToStringLaserMode {constexpr std::string_view operator[](const LaserMode mode) const noexcept {switch(mode) {case LaserMode::Cutting: return M3;case LaserMode::Engraving: return M4;}return {};}constexpr LaserMode operator[](const std::string_view mode) const noexcept {if(mode.compare(M3)) {return LaserMode::Cutting;}if(mode.compare(M4)) {return LaserMode::Engraving;}return {};}};ImageToGCode() default;~ImageToGCode() default;auto setInputImage(const cv::Mat mat) {this-mat mat;return *this;}auto setOutputTragetSize(double width, double height, double resolution 10.0 /* lin/mm */) {this-width width;this-height height;this-resolution resolution;return *this;}auto builder() {command.clear();try {matToGCode();} catch(cv::Exception e) {std::println(cv Exception {}, e.what());}std::vectorstd::string header;header.emplace_back(G17G21G90G54); // XY平面;单位毫米;绝对坐标模式;选择G54坐标系header.emplace_back(std::format(F{:d}, 30000)); // 移动速度 毫米/每分钟header.emplace_back(std::format(G0 X{:.3f} Y{:.3f}, 0.f, 0.f)); // 设置工作起点及偏移header.emplace_back(std::format({} S0, kEnumToStringLaserMode()[laserMode])); // 激光模式if(airPump.has_value()) {header.emplace_back(std::format(M16 S{:d}, 300)); // 打开气泵}std::vectorstd::string footer;footer.emplace_back(M5);if(airPump.has_value()) {footer.emplace_back(M9); // 关闭气泵保持 S300 功率}command.insert_range(command.begin(), header);command.append_range(footer);return *this;}bool exportGCode(const std::string fileName) {std::fstream file;file.open(fileName, std::ios_base::out | std::ios_base::trunc);if(!file.is_open()) {return false;}for(auto v: command | std::views::transform([](auto item) { return item \n; })) {file.write(v.c_str(), v.length());}return true;}auto setLaserMode(LaserMode mode) {laserMode mode;return *this;}auto setScanMode(ScanMode mode) {scanMode mode;return *this;}private:void matToGCode() {assert(mat.channels() 1);assert(std::isgreaterequal(resolution, 1e-5f));assert(!((width * resolution 1.0) || (height * resolution 1.0)));unidirectionStrategy();}void internal(cv::Mat image, auto x /*width*/, auto y /*height*/) {auto pixel image.atcv::uint8_t(y, x);if(pixel 255) {command.emplace_back(G0(x / resolution, y / resolution, std::nullopt));} else {auto power static_castint((1.0 - static_castdouble(pixel) / 255.0) * 1000.0);command.emplace_back(G1(x / resolution, y / resolution, power));}}// 单向扫描// 未做任何优化处理像素和G0、G1一一映射对应。void unidirectionStrategy() {cv::Mat image;cv::resize(mat, image, cv::Size(static_castint(width * resolution), static_castint(height * resolution)));cv::imshow(mat,image);cv::waitKey(0);for(int y 0; y image.rows; y) {command.emplace_back(G0(0, y / resolution, std::nullopt).toString());for(int x 0; x image.cols; x) {auto pixel image.atuchar(y, x);if(pixel 255) {command.emplace_back(G0(x / resolution, std::nullopt, std::nullopt));} else {auto power static_castint((1.0 - static_castdouble(pixel) / 255.0) * 1000.0);command.emplace_back(G1(x / resolution, std::nullopt, power));}}}}// 单向扫描优化版本V1// 删除多余空行程这里空行程指连续的无用的G0。void unidirectionOptStrategy() {cv::Mat image;cv::resize(mat, image, cv::Size(static_castint(width * resolution), static_castint(height * resolution)));int offset 0; // The frist consecutive G0int length 0;for(int y 0; y image.rows; y) {command.emplace_back(G0(offset / resolution, y / resolution, std::nullopt).toString());for(int x 0; x image.cols; x) {auto pixel image.atuchar(y, x);length 0;if(pixel 255) {while(x image.cols image.atstd::uint8_t(y, x) 255) {length;}--x;// Whether continuous GO existsif(length) {if(x - length 0) { // skip The frist consecutive G0offset length;command.emplace_back(G0((x) / resolution, std::nullopt, std::nullopt));continue;}if(x image.cols - 1) { // skip The last consecutive G0command.emplace_back(G0((x - length) / resolution, std::nullopt, std::nullopt));continue;}// Continuous GOcommand.emplace_back(G0(x / resolution, std::nullopt, std::nullopt));} else {// Independent GOcommand.emplace_back(G0(x / resolution, std::nullopt, std::nullopt));}} else {auto power static_castint((1.0 - static_castdouble(pixel) / 255.0) * 1000.0);command.emplace_back(G1(x / resolution, std::nullopt, power));}}}}// Define additional strategy functions here private:cv::Mat mat; // 灰度图像double width {0}; // 工作范围 x 轴double height {0}; // 工作范围 y 轴double resolution {0}; // 精度 lin/mmScanMode scanMode {ScanMode::Bidirection}; // 默认双向LaserMode laserMode {LaserMode::Engraving}; // 默认雕刻模式std::optionalint airPump; // 自定义指令 气泵 用于吹走加工产生的灰尘 范围 [0,1000]// add more custom cmdstd::vectorstd::string command; // G 代码 };int main() {// 读取以灰度的形式读取一个图像cv::Mat mat cv::imread(R(ImageToGCode\image\tigger.jpg), cv::IMREAD_GRAYSCALE);cv::flip(mat, mat, 0);// 实例化一个对象ImageToGCode handle;// 设置相关参数// setInputImage 输入图像// setOutputTragetSize 输出物理尺寸大小 以 mm 为单位这里输出 50x50 mm 大小// builder 开始执行图像转GCode操作// exportGCode 导出 gcode 文件handle.setInputImage(mat).setOutputTragetSize(50,50).builder().exportGCode(R(ImageToGCode\output\001.nc)); }结论 通过结合OpenCV和GCode我们成功地将灰度图转换为机器可执行的指令实现了对图像的单向扫描激光雕刻。这种方法可应用于数控机床和3D打印机等领域为数字制造提供了更灵活的图像处理和加工方式。
http://www.hkea.cn/news/14396108/

相关文章:

  • 网站备案名称的影响自己搭建公网ip服务器
  • 小公司如何做网站隔离做网站只买一个程序
  • 常州网站建设代理商还有哪些网站可以做H5
  • 湖北网站建设网址滕州网站建设助企网络
  • 使用免费网站制作软件80h tv wordpress主题
  • 网站建设公司推荐 金石下拉微信手机网站开发
  • 企业网站 优秀怎么选择扬中网站建设
  • 网站建设合同书恩施网站开发
  • 产品网站策划亚马逊产品开发流程8个步骤
  • 什么网站做新闻更好建网络商城网站吗
  • 网站备案幕布照如何做无锡网站建设开发
  • 网站错误代码301做媛网站
  • e网站的图标怎么做电脑编程培训
  • 网站审核文件哈尔滨建设鞋城
  • 网站做自签发证书公司网站域名主机
  • 做网站开发工资怎样怎样做网站海报
  • vue 企业网站模板比较好的设计网站推荐
  • 铁威马 Nas 做网站专业简历制作公司
  • 网站建设需要数据库吗上市企业网站设计
  • 那个网站专利分析做的好dedecms购物网站模板下载
  • dede一键更新网站出错基础建设龙头股
  • 做动漫的游戏 迅雷下载网站韶关网站建设的公司
  • 建设项目环保备案网站电商培训心得体会总结简短
  • 淘宝上成都网站建设珠海市官网网站建设价格
  • 怎么做企业网站推广做网站广告联盟赚钱
  • 洛阳做多屏合一网站宿迁城乡建设监督网站
  • 小牛在线网站建设网站外包后呗百度降权
  • ip地址进入网站怎么做的seo搜索引擎优化就业前景
  • 网站开发类论文十个app制作网站
  • 建电子商务网站多少钱郑州手工外发加工网