本文的目的是在本地读取一张二维码图片,将它转换为一个本地的stl模型。从结果来讲就是给一张图片增加一个厚度。
基本思路:
1.将二维码图片(已用相关算法进行了联通)读取至一个二维0,1数组(或是灰度值)a中,用opencv库中的imread函数可以做到。
2.从头到尾扫一遍图片,如果该点是黑(或白)的就在该处建立一个细长立方体(明码输入一个本地的stl文件中)。
3.这样就可以生成一个镂空的二维码模型,厚度即为细长立方体的高。

简单来说,就是遍历二维码的像素点,如果该处有内容就将它从一个薄片转化为立方体,即赋予厚度。

C++在(x,y,z)生成一个细长立方体的测试代码:

#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
struct p
{int x;int y;int z;p(){}p(int xx,int yy,int zz):x(xx),y(yy),z(zz) {}friend p operator + (const p &a,const p &b);friend p operator - (const p &a,const p &b);friend ostream& operator << (ostream& output, const p &a){output<<a.x<<' '<<a.y<<' '<<a.z;return output;}friend p getf(const p &a,const p &b,const p &c);p operator * (int a){return p(x*a,y*a,z*a);}
};
p operator + (const p &a,const p &b)
{return p(a.x+b.x,a.y+b.y,a.z+b.z);
}
p operator - (const p &a,const p &b)
{return p(a.x-b.x,a.y-b.y,a.z-b.z);
}
p getf(const p &a,const p &b,const p &c)//求法向量
{p ba=a-b;p bc=c-b;return p(bc.y*ba.z-ba.y*bc.z,bc.z*ba.x-bc.x*ba.z,bc.x*ba.y-ba.x*bc.y);//bc  X  ba
}
int getz(int a)//求绝对值
{return a>0?a:(-a);
}
void inat(const p &a,int c,int k,int judge,ostream& output)//生成一个长方形薄片(两个三角面片组合而成
{if(getz(judge)==1){output<<"  facet normal "<<getf(a,p(a.x,a.y,a.z-c),p(a.x,a.y+k,a.z))*judge<<endl;output<<"        outer loop"<<endl;output<<"           vertex "<<a<<endl;output<<"         vertex "<<p(a.x,a.y,a.z-c)<<endl;output<<"          vertex "<<p(a.x,a.y+k,a.z)<<endl;output<<"     endloop"<<endl;output<<"  endfacet"<<endl;output<<" facet normal "<<getf(p(a.x,a.y+k,a.z),p(a.x,a.y,a.z-c),p(a.x,a.y+k,a.z-c))*judge<<endl;output<<"      outer loop"<<endl;output<<"           vertex "<<p(a.x,a.y+k,a.z)<<endl;output<<"         vertex "<<p(a.x,a.y,a.z-c)<<endl;output<<"          vertex "<<p(a.x,a.y+k,a.z-c)<<endl;output<<"       endloop"<<endl;output<<"  endfacet"<<endl;}else if(getz(judge)==2){output<<"  facet normal "<<getf(a,p(a.x,a.y,a.z-c),p(a.x+k,a.y,a.z))*(judge/2)<<endl;output<<"        outer loop"<<endl;output<<"           vertex "<<a<<endl;output<<"         vertex "<<p(a.x,a.y,a.z-c)<<endl;output<<"          vertex "<<p(a.x+k,a.y,a.z)<<endl;output<<"     endloop"<<endl;output<<"  endfacet"<<endl;output<<" facet normal "<<getf(p(a.x+k,a.y,a.z),p(a.x,a.y,a.z-c),p(a.x+k,a.y,a.z-c))*(judge/2)<<endl;output<<"      outer loop"<<endl;output<<"           vertex "<<p(a.x+k,a.y,a.z)<<endl;output<<"         vertex "<<p(a.x,a.y,a.z-c)<<endl;output<<"          vertex "<<p(a.x+k,a.y,a.z-c)<<endl;output<<"       endloop"<<endl;output<<"  endfacet"<<endl;}else if(getz(judge)==3){output<<"  facet normal "<<getf(a,p(a.x+c,a.y,a.z),p(a.x,a.y+k,a.z))*(judge/3)<<endl;output<<"       outer loop"<<endl;output<<"           vertex "<<a<<endl;output<<"         vertex "<<p(a.x+c,a.y,a.z)<<endl;output<<"         vertex "<<p(a.x,a.y+k,a.z)<<endl;output<<"     endloop"<<endl;output<<"  endfacet"<<endl;output<<" facet normal "<<getf(p(a.x,a.y+k,a.z),p(a.x+c,a.y,a.z),p(a.x+c,a.y+k,a.z))*(judge/3)<<endl;output<<"        outer loop"<<endl;output<<"           vertex "<<p(a.x,a.y+k,a.z)<<endl;output<<"         vertex "<<p(a.x+c,a.y,a.z)<<endl;output<<"         vertex "<<p(a.x+c,a.y+k,a.z)<<endl;output<<"      endloop"<<endl;output<<"  endfacet"<<endl;}else return;
}
void writein(const p &a,int c,int k,ostream& output)//生成一个立方体
{inat(a,c,k,2,output);inat(a,k,k,3,output);inat(a,c,k,1,output);inat(p(a.x,a.y,a.z-c),k,k,-3,output);inat(p(a.x+k,a.y,a.z),c,k,-1,output);inat(p(a.x,a.y+k,a.z),c,k,-2,output);
}
int main()
{ofstream output("test.stl",ios::out);if(!output){cerr<<"open error!"<<endl;exit(1);}output<<"solid aname"<<endl;writein(p(0,0,0),10,1,output);
//  writein(p(1,0,0),10,1,output);output<<"endsolid aname";output.close();cout<<"创建模型成功!"; return 0;
}

注:main函数中的相关操作仅为测试立方体生成是否可行。

如果存在问题欢迎留言指出交流。

从二维码图片到镂空二维码stl模型(1)相关推荐

  1. qrcodejs2生成二维码,通过canvas绘制带边框+中间logo的二维码图片,下载二维码

    文章目录 一.通过qrcodejs2生成一个二维码 二.点击[下载配置服务器二维码]来下载二维码 1.通过canvas去绘制 边框+二维码+logo (1)为canvas增加绘制圆角矩形的方法(can ...

  2. Android超方便 集成 Zxing实现扫一扫,闪光灯,生成二维码图片,解析二维码(条码)等功能

    之前我写过一篇博客是关于如何将zxing集成到Android Studio中,以及简单的实现扫一扫功能. 详情请看:Android Studio集成Zxing扫一扫 但是,上面那篇博客只有有一个扫一扫 ...

  3. android 分享二维码图片到微信QQ(url地址字符串生成二维码图片、分享二维码图片到微信QQ)

    主要用到的功能 1.url地址字符串生成二维码图片 2.分享二维码图片到微信QQ 所需的依赖包 implementation 'com.google.zxing:core:3.0.1' 代码 1.将U ...

  4. springBoot ,根据二维码图片,读取二维码图片内容

    1.pom.xml文件引入相关包 <dependency><groupId>com.google.zxing</groupId><artifactId> ...

  5. Android二维码图片生成和二维码扫描软件的设计

    一.简要介绍 QR Code码,是由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大.可靠性高.可表示汉字及图象多种文字信息.保密防伪性强等优点. ...

  6. Java生成二维码图片,手机软件扫码后跳转网页

    一.创建maven工程,添加如下依赖 <dependencies><dependency><groupId>com.google.zxing</groupId ...

  7. springboot2整合二维码 生成二维码图片及输出web端及打印

    step1 导包 <!-- 二维码 --><dependency><groupId>com.google.zxing</groupId><arti ...

  8. 二维码图片生成 hutool

    生成二维码 hutool 有相关的工具类可以调用 hutoolAPI 直接上代码实现: /*** 自定义参数,二维码样式** @param* @return QrConfig* @author 小乌龟 ...

  9. 记录使用QRCode 显示并下载二维码图片

    记录使用QRCode 生成二维码 项目安装qrcode 命令:npm install --save qrcodejs2 引入 import QRCode from 'qrcodejs2' 后端提供qr ...

  10. 使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小

    使用zxing生成带logo的二维码图片,自动调节logo图片相对二维码图片的大小  * 可选是否带logo,可选是否保存二维码图片:结果返回base64编码的图片数据字符串  * 页面显示:< ...

最新文章

  1. 永信至诚CTO张凯:CloudStack+Docker构建云端信息安全实验场
  2. pl sql developer中如何调试存储过程以及调试包中创建的存储过程
  3. 使用Tornado实现Ajax请求
  4. 【全】Docker(二)-在Docker中部署Nginx实现负载均衡视频教程
  5. jetty之嵌入式运行jetty
  6. 3.11 Ext JS 下拉框(Combobox)使用
  7. c语言程序设计小学生测验,c语言程序设计(1) 小学生计算机辅助教学系统
  8. 我如何学习:开篇 先提升下肾上腺素
  9. Oracle常见的Hint(二)
  10. 【学习笔记】用Excel制作随机抽奖器(Visual Basic编程)。
  11. 手机也能实时查看开关门状态?Zigbee 智慧厕所门亮了
  12. 如何完全删除数据库 任何版本 注册表删除法
  13. idea文件颜色代表的含义
  14. 星之卡比镜之迷宫机器人_星之卡比镜之迷宫boss全方位攻略
  15. demonstration记忆_怎样快速记单词方法高效记忆单词法
  16. python专题知识追寻者对OS的理解
  17. 如何使用FLASHGOT下载网页FLASH
  18. vue项目导出word文件(根据word模板导出)
  19. Fortran基础编程(3)——格式化输出
  20. Python学习关键tip记录

热门文章

  1. 利用pandas 读取pdf中的表格文件
  2. 人类如何学习和表征网络?
  3. js图片添加文字水印并设置水印居中的方法
  4. 于的繁体字有几种写法_于的繁体字是什么(行书怎么写)
  5. nginx 解析二级域名
  6. 开源WebGIS开发——栅格图层
  7. 阿里云ACP认证考试笔记
  8. Mac OS小技巧:MAC电脑如何设置一键切换输入法
  9. 迅雷下载出错应版权方要求文件无法下载
  10. 微信支付开通流程,及微信支付商户号申请详细流程介绍