二维码的生成与实现(matlab)
二维码(带有图片)的生成
![二维码(带有图片)的生成](https://img.taocdn.com/s3/m/39dc752e5627a5e9856a561252d380eb629423f0.png)
⼆维码(带有图⽚)的⽣成/*************编码转换类【1】***********************/package cn.gp.tools.ErWCodeUtils;import java.io.UnsupportedEncodingException;/*** 作⽤:编码转换* @author⼩风微灵**/public class encodingFunction {public static String getMethodEncoding(String input){try {String result=new String(input.getBytes("iso-8859-1"),"utf-8");return result;} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();return "";}}}/***********************⼆维码图⽚实现类【2】************************************/package cn.gp.tools.ErWCodeUtils;import java.awt.image.BufferedImage;import jp.sourceforge.qrcode.data.QRCodeImage;public class TwoDimensionCodeImage implements QRCodeImage {BufferedImage bufImg;public TwoDimensionCodeImage(BufferedImage bufImg) {this.bufImg = bufImg;}@Overridepublic int getHeight() {return bufImg.getHeight();}@Overridepublic int getPixel(int x, int y) {return bufImg.getRGB(x, y);}@Overridepublic int getWidth() {return bufImg.getWidth();}}/*******************⽣成带有图⽚⼆维码的类【3】************************************/1package cn.gp.tools.ErWCodeUtils;23import java.awt.Color;4import java.awt.Graphics2D;5import java.awt.Image;6import java.awt.image.BufferedImage;7import java.io.ByteArrayInputStream;8import java.io.File;9import java.io.IOException;10import java.io.InputStream;11import java.io.UnsupportedEncodingException;12import java.util.UUID;1314import javax.imageio.ImageIO;1516import jp.sourceforge.qrcode.QRCodeDecoder;17import jp.sourceforge.qrcode.exception.DecodingFailedException;18import jp.sourceforge.qrcode.geom.Point;19import cn.gp.tools.ImageUtil;2021import com.swetake.util.Qrcode;2223public class QRCodeAction {2425262728/***************************成员变量-属性****************************************/29private static int DEFAULT_WIDTH;30private static int UNIT_WIDTH = 12;31//输⼊流32private ByteArrayInputStream inputStream;33public ByteArrayInputStream getInputStream() {34return inputStream;35 }36public void setInputStream(ByteArrayInputStream inputStream) {37this.inputStream = inputStream;38 }3940/***************************重写⽗类⽅法****************************************/414243/***************************⽅法****************************************/44/**45 * ⽣成⼆维码(QRCode)图⽚的公共⽅法46 * @param content 存储内容47 * @param imgType 图⽚类型48 * @param size ⼆维码尺⼨49 * @return50*/51public static BufferedImage qRCodeCommon(String content, String imgType, int size) {5253 BufferedImage bufImg = null;5455try {56//⼆维码⽣成类57 Qrcode qrcodeHandler = new Qrcode();58// 设置⼆维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越⾼可存储的信息越少,但对⼆维码清晰度的要求越⼩59 qrcodeHandler.setQrcodeErrorCorrect('M');60 qrcodeHandler.setQrcodeEncodeMode('B');//AlphaNumeric(0.2),Numeric(0/1/2),Byte(中英⽂)6162// 设置设置⼆维码尺⼨,取值范围1-40,值越⼤尺⼨越⼤,可存储的信息越⼤63 qrcodeHandler.setQrcodeVersion(size);64// 获得内容的字节数组,设置编码格式65byte[] contentBytes = content.getBytes("utf-8");66boolean[][] bRect = qrcodeHandler.calQrcode(contentBytes);67// 图⽚尺⼨68 DEFAULT_WIDTH = (int) (bRect.length * UNIT_WIDTH+8*Math.sqrt(2));69//图⽚的w,h70 bufImg = new BufferedImage(DEFAULT_WIDTH, DEFAULT_WIDTH,71 BufferedImage.TYPE_INT_RGB);7273//画笔⼯具74 Graphics2D gs = bufImg.createGraphics();7576// 设置背景颜⾊77 gs.setBackground(Color.white);78 gs.clearRect(0, 0,DEFAULT_WIDTH+10,DEFAULT_WIDTH+10);79//背景区域的图⽚80// Image image=ImageUtil.getImageIcon("aaa.jpg").getImage();81// gs.drawImage(image, 0, 0, null);82// 设定图像颜⾊:前景⾊83 gs.setColor(Color.black);84// 设置偏移量,不设置可能导致解析出错85int pixoff = 4;86// 输出内容> ⼆维码87if (contentBytes.length > 0 && contentBytes.length < 1800) {88for (int i = 0; i < bRect.length; i++) {89for (int j = 0; j < bRect.length; j++) {90if (bRect[j][i]) {91 gs.fillRect(j * UNIT_WIDTH + pixoff,92 i * UNIT_WIDTH+ pixoff,93 12, 12);94// gs.drawRect(j * UNIT_WIDTH + pixoff,95// i * UNIT_WIDTH+ pixoff,96// 6, 6);97 }98 }99 }100//中⼼区域的图⽚101 Image image2=ImageUtil.getImageIcon("123.jpg").getImage();102//外边框103 gs.setColor(Color.white);104 gs.fillRect(DEFAULT_WIDTH/8*3-3, DEFAULT_WIDTH/8*3-3,105 (int)(DEFAULT_WIDTH/4+3*Math.sqrt(3)),106 (int)(DEFAULT_WIDTH/4+3*Math.sqrt(3))+4);107//内部背景区域108 gs.setColor(Color.white);109 gs.fillRect(DEFAULT_WIDTH/8*3, DEFAULT_WIDTH/8*3,110 DEFAULT_WIDTH/4,DEFAULT_WIDTH/4+4);111//画出中⼼图⽚112 gs.drawImage(image2,113 DEFAULT_WIDTH/8*3+3, DEFAULT_WIDTH/8*3+5,114 DEFAULT_WIDTH/4-6,DEFAULT_WIDTH/4-6,115null);116117 } else {118throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 1800]."); 119120 }121 gs.dispose();122 bufImg.flush();123 } catch (UnsupportedEncodingException e) {124 e.printStackTrace();125 } catch (Exception e) {126// TODO Auto-generated catch block127 e.printStackTrace();128 }129return bufImg;130 }131132133134/**135 * 解析⼆维码(QRCode)136 * @param imgPath 图⽚路径137 * @return138*/139public static String decoderQRCode(String imgPath) {140// QRCode ⼆维码图⽚的⽂件141 File imageFile = new File(imgPath);142 BufferedImage bufImg = null;143 String content = null;144try {145 bufImg = ImageIO.read(imageFile);146 QRCodeDecoder decoder = new QRCodeDecoder();147 content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");148 } catch (IOException e) {149 System.out.println("Error: " + e.getMessage());150 e.printStackTrace();151 } catch (DecodingFailedException dfe) {152 System.out.println("Error: " + dfe.getMessage());153 dfe.printStackTrace();154 }155return content;156 }157158/**159 * 解析⼆维码(QRCode)160 * @param input 输⼊流161 * @return162*/163public static String decoderQRCode(InputStream input) {164 BufferedImage bufImg = null;165 String content = null;166try {167 bufImg = ImageIO.read(input);168 QRCodeDecoder decoder = new QRCodeDecoder();169 content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");170 } catch (IOException e) {171 System.out.println("Error: " + e.getMessage());172 e.printStackTrace();173 } catch (DecodingFailedException dfe) {174 System.out.println("Error: " + dfe.getMessage());175 dfe.printStackTrace();176 }177return content;178 }179180/**181 * 产⽣⼆维码图⽚:182 * @param infos ⼆维码信息183 * @return返回产⽣的图⽚路径184*/185public static String getErWCode(String infos){186 String imagePath="";187try {188 BufferedImage image = qRCodeCommon(infos, "JPEG",5);189 String path=QRCodeAction.getProgramPath();190 imagePath=path+UUID.randomUUID()+".jpg";191 File file = new File(imagePath);192 ImageIO.write(image, "jpg", file);193if(file.exists()){194 System.err.println("新产⽣⼀张⼆维码图⽚");195 }196 } catch (IOException e) {197 e.printStackTrace();198 }199return imagePath;200 }201public static Image getErWCodeImage(String infos){202203204 BufferedImage image = qRCodeCommon(infos, "JPEG",10);205 String path=QRCodeAction.getProgramPath();206207 Image image2=(Image)image;208209return null;210 }211/**212 * 获取项⽬运⾏根路径213 * @return214*/215public static String getProgramPath(){216//获得项⽬运⾏路径下的图⽚⽂件夹217 String path=QRCodeAction.class.getClassLoader().getResource("./images/ErWCodes/").getPath(); 218return path;219 }220/**221 * 程序测试⼊⼝222 * @param args223*/224public static void main(String[] args) {225226//⽣成⼆维码227// StringBuffer msg=new StringBuffer();228// msg.append("int[] arr=new int[]{8,2,1,0,3};\r\n");229// msg.append("int[] index=new int[]{2,0,3,2,4,0,1,3,2,3,3};\r\n");230// msg.append("String tel=\"\";\r\n");231// msg.append("for (int i : index) {\r\n");232// msg.append("tel+=arr[i];\r\n");233// msg.append("}\r\n");234// msg.append("System.out.println(\"联系⽅式:\"+tel);\r\n");235// System.err.println(msg.toString());236 QRCodeAction d=new QRCodeAction();237 String path=d.getErWCode("我不是体育系的要不要我这系啊带你们呦!");238//解读⼆维码239// String infos= d.decoderQRCode(path);240//System.err.println("解析⼆维码信息:"+infos);241 }242243 }。
MATLAB和二维码可视化技术在电路分析教学中的应用
![MATLAB和二维码可视化技术在电路分析教学中的应用](https://img.taocdn.com/s3/m/e82108b4c1c708a1284a44af.png)
·技术在线 - 44 -2018年1月下 第02期(总第428期)10.3969/j.issn.1671-489X.2018.02.044MATLAB和二维码可视化技术在电路分析教学中的应用◆谭艳春 樊海红摘 要 以戴维宁定理为例,将高性能仿真软件MATLAB 和时下非常流行的二维码可视化技术应用到电路分析理论教学中,既能使抽象、枯燥、难懂的理论知识变得形象生动、便于理解,又方便学生课后复习延伸,巩固课堂知识点。
关键词 电路分析;MATLAB;二维码中图分类号:G642 文献标识码:B 文章编号:1671-489X(2018)02-0044-03Application of MATLAB and 2-dimension Code Visualization Technology in Circuit Analysis Teaching //TAN Yanchun, FAN HaihongAbstract In this paper, both high-performance MATLAB and 2-di -mension code visualization technology which is very popular nowa -days are used in Circuit Analysis with the example of Davidson’s theorem. Not only the abstract, boring and diffi cult to understand theories will become more vivid and easy to understand, but also it is convenient for students to review and extend the knowledge points after class.Key words circuit analysis; MATLAB; 2-dimension code1 引言电路分析是高等院校工科类、电类等相关专业必修的一门专业基础课,是模拟电路、信号系统等多门专业课的先修课程,主要任务是在给定电路模型的情况下,计算电路中各部分的电流或电压等物理量。
(完整版)二维码的生成细节和原理
![(完整版)二维码的生成细节和原理](https://img.taocdn.com/s3/m/fe79e8d2804d2b160b4ec0da.png)
二维码的生成细节和原理2013-10-29 09:46 陈皓酷壳网字号:T | T二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型AD:51CTO学院:IT精品课程在线看!二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。
这两天学习了一下二维码图片生成的相关细节,觉得这个玩意就是一个密码算法,在此写一这篇文章,揭露一下。
供好学的人一同学习之。
关于QR Code Specification,可参看这个PDF:/files/datasheets/misc/qr_code.pdf基础知识首先,我们先说一下二维码一共有40个尺寸。
官方叫版本Version。
Version 1是21 x 21的矩阵,Version 2是25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)*4 + 21(V是版本号)最高Version 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。
下面我们看看一个二维码的样例:定位图案•Position Detection Pattern是定位图案,用于标记二维码的矩形大小。
这三个定位图案有白边叫Separators for Postion Detection Patterns。
之所以三个而不是四个意思就是三个就可以标识一个矩形了。
•Timing Patterns也是用于定位的。
原因是二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪了。
•Alignment Patterns 只有Version 2以上(包括Version2)的二维码需要这个东东,同样是为了定位用的。
python qrcode用法(一)
![python qrcode用法(一)](https://img.taocdn.com/s3/m/6d8dc82aa31614791711cc7931b765ce05087aba.png)
python qrcode用法(一)python qrcode介绍python qrcode是一个Python库,用于生成二维码。
它是一个功能强大且易于使用的工具,可用于创建包含各种信息的二维码图像。
安装使用pip命令可以很方便地安装python qrcode库:pip install qrcode生成基本二维码要生成一个基本的二维码图像,只需简单的几行代码:import qrcodedata = "Hello, World!"img = (data)("")这将生成一个包含”Hello, World!“文本的二维码,并将其保存为文件。
自定义二维码样式python qrcode允许您以多种方式自定义生成的二维码图像的外观。
颜色要更改二维码的颜色,可以使用fill参数指定前景色和背景色:img = (data, fill_color="black", back_color="white")这样就会生成一个黑色的二维码,背景色为白色。
尺寸可以使用box_size参数来指定二维码的每个像素的尺寸:img = (data, box_size=10)这将生成一个每个像素为10个单位大小的二维码。
边距可以使用border参数来指定二维码图像的边距大小:img = (data, border=2)这将在二维码周围创建一个2单元大小的边距。
图片中插入二维码python qrcode还允许将生成的二维码插入到其他图像中。
要将二维码插入到现有图像中,可以使用PIL库的功能。
下面是一个简单的示例:from PIL import Image# 打开一个图像image = ("")# 生成二维码图像qr_code = (data)# 调整二维码大小qr_code = qr_((100, 100))# 计算二维码的位置x = ( - qr_) // 2y = ( - qr_) // 2# 将二维码粘贴到图像中(qr_code, (x, y))# 保存图像("image_with_")要将二维码插入到PDF文件中,可以使用reportlab库来创建和编辑PDF文件。
基于MATLAB的QR二维码解码技术的程序
![基于MATLAB的QR二维码解码技术的程序](https://img.taocdn.com/s3/m/343575da0c22590102029d4a.png)
function varargout = QRMain(varargin)% QRMAIN MATLAB code for QRMain.fig% QRMAIN, by itself, creates a new QRMAIN or raises the existing% singleton*.%% H = QRMAIN returns the handle to a new QRMAIN or the handle to% the existing singleton*.%% QRMAIN('CALLBACK',hObject,eventData,handles,...) calls the local% function named CALLBACK in QRMAIN.M with the given input arguments. %% QRMAIN('Property','Value',...) creates a new QRMAIN or raises the% existing singleton*. Starting from the left, property value pairs are% applied to the GUI before QRMain_OpeningFcn gets called. An% unrecognized property name or invalid value makes property application% stop. All inputs are passed to QRMain_OpeningFcn via varargin.%% *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)".%% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help QRMain% Last Modified by GUIDE v2.5 11-Apr-2017 20:19:20% Begin initialization code - DO NOT EDITgui_Singleton = 1;gui_State = struct('gui_Name', mfilename, ...'gui_Singleton', gui_Singleton, ...'gui_OpeningFcn', @QRMain_OpeningFcn, ...'gui_OutputFcn', @QRMain_OutputFcn, ...'gui_LayoutFcn', [] , ...'gui_Callback', []);if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});elsegui_mainfcn(gui_State, varargin{:});end% End initialization code - DO NOT EDIT% --- Executes just before QRMain is made visible.function QRMain_OpeningFcn(hObject, eventdata, handles, varargin)% This function has no output args, see OutputFcn.% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% varargin command line arguments to QRMain (see V ARARGIN)% Choose default command line output for QRMainhandles.output = hObject;% Update handles structureguidata(hObject, handles);% UIWAIT makes QRMain wait for user response (see UIRESUME)% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.function varargout = QRMain_OutputFcn(hObject, eventdata, handles)% varargout cell array for returning output args (see V ARARGOUT);% hObject handle to figure% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Get default command line output from handles structurevarargout{1} = handles.output;% --- Executes on button press in OpenQRPic.function OpenQRPic_Callback(hObject, eventdata,handles) %%%%%%%%打开图像global im;[filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'},'选择图像');if isequal(filename,0)||isequal(pathname,0)errordlg('您还没有选取图片!!','温馨提示');%如果没有输入,则创建错误对话框return;elseimage=[pathname,filename];%合成路径+文件名im=imread(image);%读取图像figureimshow(im);%在坐标axes1显示原图像title('原始QR图像');end% hObject handle to OpenQRPic (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in pushbutton2.function pushbutton2_Callback(hObject, eventdata, handles)% hObject handle to pushbutton2 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % --- Executes on button press in DecodeQR.function DecodeQR_Callback(hObject, eventdata, handles)%%%%%%%%%%%%%%%%%%% QR解码global I_otsu; %global 定义全局变量global im;global KL;global Ijibian;I_jiema=Ijibian;I_jiema=I_otsu; %二值I_jiema=KL;I_jiema=im;%str=zxing_decode(I_jiema) %解码%set(handles.edit1,'string',[get(handles.edit1,'string') str]);%set(handles.text,'string',[get(handles.text,'string') str]);set(handles.edit1,'String',str); %显示字符% --- Executes on button press in GrayGen.function GrayGen_Callback(hObject, eventdata,handles) %%%%%%%%%%%%%%%%%%% 灰度化处理global im;global II;I=im;[w,h,l]=size(I); %图像大小II=[];for i=1:hfor j=1:wII(j,i)=0.3*I(j,i,1)+0.59*I(j,i,2)+0.11*I(j,i,3); %灰度化处理公式endendfigure,imshow(II,[]) %显示图像title('QR二维码灰度化处理');% --- Executes on button press in SmoothGen.function SmoothGen_Callback(hObject, eventdata, handles)%%%%%%%%%%%%%%%%%%% 平滑处理global II;global I3;III=uint8(II); %图像转换0-255Ix=imnoise(III,'salt & pepper',0.02); %对灰度化图像人为加噪声I3=medfilt2(Ix,[3,3]); %平滑处理figureimshow(Ix)title('QR二维码加噪处理');figureimshow(I3)title('QR二维码平滑处理');% --- Executes on button press in Binaryzation.function Binaryzation_Callback(hObject, eventdata, handles)%%%%%%%%%%%%%%%%%%% 二值化处理global I3;global I_otsu;I_otsu=otsut(I3); %二值化处理figureimshow(I_otsu,[])title('QR二维码二值化处理');% function edit1_Callback(hObject, eventdata, handles)% % hObject handle to edit1 (see GCBO)% % eventdata reserved - to be defined in a future version of MATLAB% % handles structure with handles and user data (see GUIDATA)%% % Hints: get(hObject,'String') returns contents of edit1 as text% % str2double(get(hObject,'String')) returns contents of edit1 as a double% --- Executes during object creation, after setting all properties.function edit1_CreateFcn(hObject, eventdata, handles)% hObject handle to edit1 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end% --- Executes on button press in ImageRotate.function ImageRotate_Callback(hObject, eventdata, handles) %%%% 旋转校正 4.bmpglobal im;%倾斜校正:二值化,取边缘,Hough变换得到角度,旋转I=im;bw=rgb2gray(I); %rgb转换为灰度图bw=im2bw(I,graythresh(bw)); %二值化过程bw=double(bw);BW=edge(bw,'canny'); %canny边缘处理BW1=BW;figureimshow(BW1);title('边缘处理图像'); %显示图像[H,T,R]=hough(BW);figure,imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit');xlabel('\theta'),ylabel('\rho');axis on, axis normal,hold on;P=houghpeaks(H,4,'threshold',ceil(0.3*max(H(:)))); %hough变化峰值检测x=T(P(:,2)); y = R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',50,'MinLength',7); %hough检测线段figure,imshow(BW),title('直线标识图像');max_len = 0;hold on;for k=1:length(lines) %主要把线条和点显示出来xy=[lines(k).point1;lines(k).point2];% 标出线段plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% 标出线段的起始和终端点plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);Len(k)=len;if (len>max_len)max_len=len;xy_long=xy;endend% 强调最长的部分plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');[L1 Index1]=max(Len(:));% 最长线段的起始和终止点x1=[lines(Index1).point1(1) lines(Index1).point2(1)];y1=[lines(Index1).point1(2) lines(Index1).point2(2)];% 求得线段的斜率K1=-(lines(Index1).point1(2)-lines(Index1).point2(2))/...(lines(Index1).point1(1)-lines(Index1).point2(1))angle=atan(K1)*180/pi %显示角度A = imrotate(I,-angle,'bilinear');% imrate 是逆时针的所以取一个负号figure,imshow(A);%imwrite(A,'4qingxie_jiaozheng')% --- Executes on button press in AberrationAdj.function AberrationAdj_Callback(hObject, eventdata, handles) %%%% 畸变校正11.bmpglobal im;global Ijibian;syms a1a2a3a4b1b2b3b4real;I=im;x=[1:256];y=[1:256];control_outpoint=[14 64 %原图像顶点26 221206 38246 196];control_inputpoint=[1 1 %几何畸变图像顶点1 255255 1255 255];x1=control_inputpoint(:,1); %原图像第一列y1=control_inputpoint(:,2); %原图像第二列A=[control_outpoint(1,1) control_outpoint(1,2)control_outpoint(1,1)*control_outpoint(1,2) 1control_outpoint(2,1) control_outpoint(2,2)control_outpoint(2,1)*control_outpoint(2,2) 1control_outpoint(3,1) control_outpoint(3,2)control_outpoint(3,1)*control_outpoint(3,2) 1control_outpoint(4,1) control_outpoint(4,2)control_outpoint(4,1)*control_outpoint(4,2) 1];a=linsolve(A,x1); %等价于a=sym(A)/sym(x1) b=linsolve(A,y1); %等价于a=sym(A)/sym(y1)f1=@(x,y) a(1)*x+a(2)*y+a(3)*x*y+a(4); %定义变换函数f2=@(x,y) b(1)*x+b(2)*y+b(3)*x*y+b(4);for i=1:256for j=1:256x1(i,j)=f1(i,j);y1(i,j)=f2(i,j);I1(i,j)=interp2(x,y,I,x1(i,j),y1(i,j),'bilinear'); %双线性插值%I1(i,j)=interp2(x1(i,j),y1(i,j),I,x,y,'bilinear');endendIjibian=I1;figureimshow(I1);function edit3_Callback(hObject, eventdata, handles)% hObject handle to edit3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of edit3 as text% str2double(get(hObject,'String')) returns contents of edit3 as a double% --- Executes during object creation, after setting all properties.function edit3_CreateFcn(hObject, eventdata, handles)% hObject handle to edit3 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.% See ISPC and COMPUTER.if ispc && isequal(get(hObject,'BackgroundColor'),get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');end% --- Executes on button press in QRGen.function QRGen_Callback(hObject, eventdata, handles) %%%% 自制QR (用英文)global KL;str3=get(handles.edit3,'string') %得到string数据KL=qrgen(str3,300,300); %生成相应QR二维码figureimshow(KL,[])imwrite(KL,'KL.png')% --- Executes on button press in QRgenDecode.function QRgenDecode_Callback(hObject, eventdata,handles) %%%%%%%%自制QR解码显示global KL;I_jiema=imread('KL.bmp');str2=zxing_decode(I_jiema) %解码过程set(handles.edit1,'String',str2);% --- Executes on key press with focus on QRgenDecode and none of its controls. function QRgenDecode_KeyPressFcn(hObject, eventdata, handles)% hObject handle to QRgenDecode (see GCBO)% eventdata structure with the following fields (see UICONTROL)% Key: name of the key that was pressed, in lower case% Character: character interpretation of the key(s) that was pressed% Modifier: name(s) of the modifier key(s) (i.e., control, shift) pressed% handles structure with handles and user data (see GUIDATA)% --- Executes on button press in pushbutton11.function pushbutton11_Callback(hObject, eventdata, handles)% hObject handle to pushbutton11 (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA) AllFigureHandle=get(0,'Children'); % Contain Figure and GUIflag=rem(AllFigureHandle,1);%OnlyPictureHandle=AllFigureHandle(find(flag==0)); % Exclude GUI,because GUI'handle is decimalclose(OnlyPictureHandle);% --- If Enable == 'on', executes on mouse press in 5 pixel border.% --- Otherwise, executes on mouse press in 5 pixel border or over DecodeQR. function DecodeQR_ButtonDownFcn(hObject, eventdata, handles)% hObject handle to DecodeQR (see GCBO)% eventdata reserved - to be defined in a future version of MATLAB% handles structure with handles and user data (see GUIDATA)。
(完整版)二维码的生成与实现(matlab)
![(完整版)二维码的生成与实现(matlab)](https://img.taocdn.com/s3/m/6b590fbf31126edb6f1a10db.png)
课程设计报告课题名称:二维码的生成与识别项目完成人(班级、学号、姓名):项目完成时间: 2017/6/15一、引言1、编写目的本学期学习《数字图像处理》,包含很多知识点,像:图像编码与压缩、图像相关变换、图像增强技术、图像复原技术,这些知识点的应用在实际编程中都非常重要。
纸上得来终觉浅,绝知此事要躬行。
所以,这次课程设计的目的主要就是巩固所学的数字图像处理的相关知识。
最终是我们通过该教学环节,把该课程以及相关知识融会贯通。
2、背景由于受信息的容量限制,一维条码仅仅是对“物品”的标识,而不是对“物品”的描述,故一维条码的使用不得不依赖数据库存在。
在使用上受到了极大的限制,效率很低。
二维码正是为了解决一维条码无法解决的问题而产生的。
二维码具有高密度、高可靠性等特点,可以用来表示数据文件、图像等,实现信息获取、网站跳转、广告推送、手机电商、优惠促销、会员管理等功能,具有很强的研究意义。
3、参考资料《数字图像处理》第三版胡学龙二、设计方案1、图像采集图像主要来自网上在线生成的二维码图像和该程序生成的二维码图像。
2、算法分析预处理过程灰度化-----平滑处理------二值化1.灰度化:一般都是为了减小图像原始数据量,便于后续处理时计算量更少,因为图像处理不一定需要对彩色图像的RGB三个分量都进行处理2.平滑处理:图像平滑是指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量的图像处理方法。
图像平滑的方法包括:插值方法,线性平滑方法,卷积法等等。
这样的处理方法根据图像噪声的不同进行平滑,比如椒盐噪声,就采用线性平滑方法!3.二值化:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。
二维码解码二维码解码主要使用的是ZXing库,ZXing是个很经典的条码/二维码识别的开源类库3、代码实现打开图像function pushbutton1_Callback(hObject, eventdata, handles) global im;[filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'} ,'选择图像');if isequal(filename,0)||isequal(pathname,0)errordlg('您还没有选取图片!!','温馨提示');%如果没有输入,则创建错误对话框return;elsedisp(['User selected',fullfile(pathname,filename)]);fprintf('fffffff%s\n',filename);im=imread(filename);%读取图像figureimshow(im);%在坐标axes1显示原图像title('原始图像');End灰度化处理function pushbutton4_Callback(hObject, eventdata, handles)global im;global II;I=im;[w,h,l]=size(I); %图像大小II=[];for i=1:hfor j=1:wII(j,i)=0.3*I(j,i,1)+0.59*I(j,i,2)+0.11*I(j,i,3); %灰度化处理公式endendfigure,imshow(II,[]) %显示图像title('二维码灰度化处理');平滑处理function pushbutton5_Callback(hObject, eventdata, handles)global II;global I3;III=uint8(II); %图像转换0-255Ix=imnoise(III,'salt & pepper',0.02); %对灰度化图像人为加噪声I3=medfilt2(Ix,[3,3]); %平滑处理figureimshow(Ix)title('二维码加噪处理');figureimshow(I3)title('二维码平滑处理');二值化处理function pushbutton6_Callback(hObject, eventdata, handles)global I3;global I_otsu;I_otsu=otsut(I3); %二值化处理figureimshow(I_otsu,[])title('二维码二值化处理');旋转校正function pushbutton7_Callback(hObject, eventdata, handles) global im;%倾斜校正:二值化,取边缘,Hough变换得到角度,旋转I=im;bw=rgb2gray(I); %rgb转换为灰度图bw=im2bw(I,graythresh(bw)); %二值化过程bw=double(bw);BW=edge(bw,'canny'); %canny边缘处理BW1=BW;figureimshow(BW1);title('canny 边界图像'); %显示图像[H,T,R]=hough(BW);figure,imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); xlabel('\theta'),ylabel('\rho');axis on, axis normal,hold on;P=houghpeaks(H,4,'threshold',ceil(0.3*max(H(:)))); %hough变化峰值检测x=T(P(:,2)); y = R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',50,'MinLength',7); %hough检测线段figure,imshow(BW),title('直线标识图像');max_len = 0;hold on;for k=1:length(lines) %主要把线条和点显示出来xy=[lines(k).point1;lines(k).point2];% 标出线段plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% 标出线段的起始和终端点plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);Len(k)=len;if (len>max_len)max_len=len;xy_long=xy;endend% 强调最长的部分plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');[L1 Index1]=max(Len(:));% 最长线段的起始和终止点x1=[lines(Index1).point1(1) lines(Index1).point2(1)];y1=[lines(Index1).point1(2) lines(Index1).point2(2)];% 求得线段的斜率K1=-(lines(Index1).point1(2)-lines(Index1).point2(2))/...(lines(Index1).point1(1)-lines(Index1).point2(1))angle=atan(K1)*180/pi %显示角度A = imrotate(I,-angle,'bilinear');% imrate 是逆时针的所以取一个负号figure,imshow(A);解码function pushbutton3_Callback(hObject, eventdata, handles)global I_otsu; %global 定义全局变量global im;global KL;global Ijibian;I_jiema=Ijibian;I_jiema=I_otsu; %二值I_jiema=KL;I_jiema=im;str=zxing_decode(I_jiema) %解码set(handles.edit1,'String',str); %显示字符三、出错处理1、出错信息2、出错处理方法及补救措施主要是由于导入的jar包文件的路径错误而导致的,所以修改好对应的路径即可。
利用MATLAB 绘制二维图形
![利用MATLAB 绘制二维图形](https://img.taocdn.com/s3/m/5fe8a56b3d1ec5da50e2524de518964bce84d271.png)
利用MATLAB 绘制二维图形
1. 显函数的图形绘制
MATLAB 中二维显函数的调用格式为: (1)plot (x,y,s) x为自变量,y为函数,两者均为同长度的向量,分别表示点的横坐标 和纵坐标. (2)plot (x1,y1,s1,x2,y2,s2 , ,xn,yn,sn) s1,s2 , ,sn是颜色、标记点和线型参数, 可叠加使用. 若不设置参数s ,则默认画实线.常用参数见表8-5所示 .
例2
解
x linspace0 ,2 pi ,50; %设置自变量的范围 y1 sin x; y2 cos x;
plot(x ,y1,k ,x,y2 ,m ) %取不同参数画两条曲线 运行结果如图8-5所示 .
图8-5
利用MATLAB 绘制二维图形
2. 隐函数的图形绘制
MATLAB中二维隐函数的调用格式为 : (1)ezplot(fun,[a ,b]) fun为隐函数表达式,需用单引号界定 . [a ,b]用来指定自变
利用MATLAB 绘制二维图形
表8-5
利用MATLAB 绘制二维图形
例1
解
x 2 :0 . 01:2 ; %定义数组变量x ,从 2开始到2为止 ,步长 0.01 y x.2 1; %计算对应的函数值 plot (x ,y) 运行结果如图8-4所示 .
图8-4
利用MATLAB 绘制二维图形
量的取值范围,默认范围为2π ,2π .
(2)ezplot(funx ,funy,[a ,b])funx ,funy是用单引号界定的x(t)和y(t)的表达
式 ,[a ,b]为参数的取值范围,默认范围为0 ,2π .
利用MATLAB 绘制二维图形
例3
MATLAB和二维码可视化技术在电路分析教学中的应用
![MATLAB和二维码可视化技术在电路分析教学中的应用](https://img.taocdn.com/s3/m/7e7cbc38b5daa58da0116c175f0e7cd184251826.png)
MATLAB和二维码可视化技术在电路分析教学中的应用谭艳春;樊海红【摘要】以戴维宁定理为例,将高性能仿真软件MATLAB和时下非常流行的二维码可视化技术应用到电路分析理论教学中,既能使抽象、枯燥、难懂的理论知识变得形象生动、便于理解,又方便学生课后复习延伸,巩固课堂知识点.【期刊名称】《中国教育技术装备》【年(卷),期】2018(000)002【总页数】3页(P44-46)【关键词】电路分析;MATLAB;二维码【作者】谭艳春;樊海红【作者单位】广东海洋大学电子与信息工程学院,524088;广东海洋大学电子与信息工程学院,524088【正文语种】中文【中图分类】G6421 引言电路分析是高等院校工科类、电类等相关专业必修的一门专业基础课,是模拟电路、信号系统等多门专业课的先修课程,主要任务是在给定电路模型的情况下,计算电路中各部分的电流或电压等物理量。
该课程具有概念抽象难懂、理论性强以及计算复杂的特点[1]。
传统的教学模式一般采用理论和实践相结合的方式,即先通过PPT和板书对知识点进行理论讲解,课程后期再配合适当的实验巩固所学的知识。
这种教学模式存在两个弊端:其一是由于学时的限制,导致实验课时较少,因此不可能把课堂上的每个关键知识点都通过实验进行验证;其二是由于教学计划安排和实验室资源有限等多种主客观因素,导致实验课一般都滞后于相应的理论课数周的时间,往往达不到教学期望的效果。
MATLAB是matrix&laboratory两个词的组合,意为矩阵实验室,是由美国MathWorks公司发布的主要面向科学计算、可视化以及交互式程序设计的高科技计算环境。
它是一款功能非常强大的高性能软件,目前已被广泛应用于信号处理、数据分析与可视化和仿真等众多领域[2-6]。
利用MATLAB软件编程仿真,可以随堂对所讲的理论知识点进行验证,以图形、数据或声音等多种形式来展示仿真结果,可以克服理论与实验不同步所带来的诸多问题。
生成二维码的两种方式
![生成二维码的两种方式](https://img.taocdn.com/s3/m/72fffe1915791711cc7931b765ce0508763275ad.png)
⽣成⼆维码的两种⽅式今天项⽬上做了⼀个⼆维码的功能,在此记录⼀下。
功能描述点击⼀个超链接,弹出展⽰⼆维码的弹出框。
准备⾸先下载好⽣成⼆维码需要使⽤到的jar包,下载地址:将下载好的jar包导⼊项⽬,将以下⼯具类放到项⽬中:package com.util;import java.awt.Graphics2D;import java.awt.geom.AffineTransform;import java.awt.image.BufferedImage;import com.google.zxing.LuminanceSource;public class BufferedImageLuminanceSource extends LuminanceSource {private final BufferedImage image;private final int left;private final int top;public BufferedImageLuminanceSource(BufferedImage image) {this(image, 0, 0, image.getWidth(), image.getHeight());}public BufferedImageLuminanceSource(BufferedImage image, int left, int top, int width, int height) {super(width, height);int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();if (left + width > sourceWidth || top + height > sourceHeight) {throw new IllegalArgumentException("Crop rectangle does not fit within image data.");}for (int y = top; y < top + height; y++) {for (int x = left; x < left + width; x++) {if ((image.getRGB(x, y) & 0xFF000000) == 0) {image.setRGB(x, y, 0xFFFFFFFF); // = white}}}this.image = new BufferedImage(sourceWidth, sourceHeight, BufferedImage.TYPE_BYTE_GRAY);this.image.getGraphics().drawImage(image, 0, 0, null);this.left = left;this.top = top;}public byte[] getRow(int y, byte[] row) {if (y < 0 || y >= getHeight()) {throw new IllegalArgumentException("Requested row is outside the image: " + y);}int width = getWidth();if (row == null || row.length < width) {row = new byte[width];}image.getRaster().getDataElements(left, top + y, width, 1, row);return row;}public byte[] getMatrix() {int width = getWidth();int height = getHeight();int area = width * height;byte[] matrix = new byte[area];image.getRaster().getDataElements(left, top, width, height, matrix);return matrix;}public boolean isCropSupported() {return true;}public LuminanceSource crop(int left, int top, int width, int height) {return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);}public boolean isRotateSupported() {return true;}public LuminanceSource rotateCounterClockwise() {int sourceWidth = image.getWidth();int sourceHeight = image.getHeight();AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, BufferedImage.TYPE_BYTE_GRAY);Graphics2D g = rotatedImage.createGraphics();g.drawImage(image, transform, null);g.dispose();int width = getWidth();return new BufferedImageLuminanceSource(rotatedImage, top, sourceWidth - (left + width), getHeight(), width);}}package com.util;import java.awt.BasicStroke;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.Shape;import java.awt.geom.RoundRectangle2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.io.OutputStream;import java.util.Hashtable;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletResponse;import com.google.zxing.BarcodeFormat;import com.google.zxing.BinaryBitmap;import com.google.zxing.DecodeHintType;import com.google.zxing.EncodeHintType;import com.google.zxing.MultiFormatReader;import com.google.zxing.MultiFormatWriter;import com.google.zxing.Result;import com.google.zxing.WriterException;import mon.BitMatrix;import mon.HybridBinarizer;import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;public class QRCodeUtil {private static final String CHARSET = "utf-8";private static final String FORMAT_NAME = "JPG";// ⼆维码尺⼨private static final int QRCODE_SIZE = 300;// LOGO宽度private static final int WIDTH = 60;// LOGO⾼度private static final int HEIGHT = 60;private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 1);BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}if (imgPath == null || "".equals(imgPath)) {return image;}// 插⼊图⽚QRCodeUtil.insertImage(image, imgPath, needCompress);return image;}private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {File file = new File(imgPath);if (!file.exists()) {System.err.println("" + imgPath + " 该⽂件不存在!");return;}Image src = ImageIO.read(new File(imgPath));int width = src.getWidth(null);int height = src.getHeight(null);if (needCompress) { // 压缩LOGOif (width > WIDTH) {width = WIDTH;}if (height > HEIGHT) {height = HEIGHT;}Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics g = tag.getGraphics();g.drawImage(image, 0, 0, null); // 绘制缩⼩后的图g.dispose();src = image;}// 插⼊LOGOGraphics2D graph = source.createGraphics();int x = (QRCODE_SIZE - width) / 2;int y = (QRCODE_SIZE - height) / 2;graph.drawImage(src, x, y, width, height, null);Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);graph.setStroke(new BasicStroke(3f));graph.draw(shape);graph.dispose();}public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception { BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);mkdirs(destPath);// String file = new Random().nextInt(99999999)+".jpg";// ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));ImageIO.write(image, FORMAT_NAME, new File(destPath));}public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);return image;}public static void mkdirs(String destPath) {File file = new File(destPath);// 当⽂件夹不存在时,mkdirs会⾃动创建多层⽬录,区别于mkdir.(mkdir如果⽗⽬录不存在则会抛出异常)if (!file.exists() && !file.isDirectory()) {file.mkdirs();}}public static void encode(String content, String imgPath, String destPath) throws Exception {QRCodeUtil.encode(content, imgPath, destPath, false);}// 被注释的⽅法/** public static void encode(String content, String destPath, boolean* needCompress) throws Exception { QRCodeUtil.encode(content, null, destPath,* needCompress); }*/public static void encode(String content, String destPath) throws Exception {QRCodeUtil.encode(content, null, destPath, false);}public static void encode(String content, String imgPath, OutputStream output, boolean needCompress) throws Exception {BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);ImageIO.write(image, FORMAT_NAME, output);}public static void encode(String content, OutputStream output) throws Exception {QRCodeUtil.encode(content, null, output, false);}public static String decode(File file) throws Exception {BufferedImage image;image = ImageIO.read(file);if (image == null) {return null;}BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));Result result;Hashtable hints = new Hashtable();hints.put(DecodeHintType.CHARACTER_SET, CHARSET);result = new MultiFormatReader().decode(bitmap, hints);String resultStr = result.getText();return resultStr;}public static String decode(String path) throws Exception {return QRCodeUtil.decode(new File(path));}public static void creatRrCode(String contents, int width, int height,HttpServletResponse response) {Hashtable hints = new Hashtable();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //容错级别最⾼hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //设置字符编码hints.put(EncodeHintType.MARGIN, 1); //⼆维码空⽩区域,最⼩为0也有⽩边,只是很⼩,最⼩是6像素左右try {BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE, width, height, hints); // 1、读取⽂件转换为字节数组// ByteArrayOutputStream out = new ByteArrayOutputStream();BufferedImage image = toBufferedImage(bitMatrix);//转换成png格式的IO流ImageIO.write(image, "png", response.getOutputStream());// byte[] bytes = out.toByteArray();//// 2、将字节数组转为⼆进制// BASE64Encoder encoder = new BASE64Encoder();// binary = encoder.encodeBuffer(bytes).trim();} catch (WriterException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** image流数据处理** @author ianly*/public static BufferedImage toBufferedImage(BitMatrix matrix) {int width = matrix.getWidth();int height = matrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, matrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);}}return image;}}1.后台⽣成⼆维码图⽚并保存图⽚超链接以及js代码如下:[<a href="#" onclick="showCode('<%=barcode%>')" class="unline">⼆维码</a>]//⽣成⼆维码⽅法function showCode(barcode){yer.open({type: 2,title:'',cancel: function(){},area: ['300px', '300px'],fixed: false, //不固定maxmin: false,Boolean: false,content: '<%=request.getContextPath()%>/frame/showCode.do?barcode='+barcode});}后台⽣成⼆维码的代码:/*** ⽣成⼆维码*/public String showCode() {try {String barcode = request.getParameter("barcode");request.setAttribute("barcode", barcode);("barcode-------------"+barcode);// 存放在⼆维码中的内容String text = "http://127.0.0.1:8080/扫描后需要调⽤的地址?barcode="+barcode;// 嵌⼊⼆维码的图⽚路径String imgPath = "D:/md5file/20191119181532.jpg";// ⽣成的⼆维码的路径及名称String destPath = "D:/md5file/"+barcode+".jpg";//⽣成⼆维码QRCodeUtil.encode(text, imgPath, destPath, true);// 解析⼆维码String str = QRCodeUtil.decode(destPath);// 打印出解析出的内容System.out.println(str);} catch (Exception e) {e.printStackTrace();}return "showCode";}展⽰⼆维码的容器:<!-- 存放⼆维码的容器 --><img src="⼆维码图⽚保存的地址"/>2.页⾯实时⽣成⼆维码展⽰超链接以及点击事件⽅法:[<a href="#" onclick="showCode('<%=mywork.getFormcode()%>')" class="unline">⼆维码</a>] //展⽰⼆维码function showCode(barcode){yer.open({type: 2,title:'',cancel: function(){},area: ['300px', '300px'],fixed: false, //不固定maxmin: false,Boolean: false,content: '<%=request.getContextPath()%>/jsp/frame/mywork/showCode.jsp?barcode='+barcode });}此处是点击超链接直接跳到弹框页⾯,在弹框页⾯上调后台⽣成⼆维码:public void qrcode() {String barcode = request.getParameter("barcode");String content = 扫描⼆维码需要调⽤的后台地址?barcode="+barcode;//调⽤⼯具类,⽣成⼆维码QRCodeUtil.creatRrCode(content, 300,300,response); //300为图⽚⾼度和宽度}弹框页⾯代码:<%String barcode = request.getParameter("barcode");request.setAttribute("barcode", barcode);%><body><input type="hidden" name="barcode" id="barcode" value="${barcode}"><!-- 存放⼆维码的容器 --><img src="<%=request.getContextPath()%>/frame/qrcode.do?barcode=${barcode}"/></body>。
基于LabVIEW的二维码高效识别系统设计与实现
![基于LabVIEW的二维码高效识别系统设计与实现](https://img.taocdn.com/s3/m/17e4d4324a35eefdc8d376eeaeaad1f34693111d.png)
基于LabVIEW的二维码高效识别系统设计与实现王刚;王硕禾;颜丙杰【摘要】介绍了二维码的结构、标准、编解码过程,以及采集图像上传至上位机的过程.通过分析二维码特性,基于LabVIEW开发的二维码机器视觉检测系统提出图像导入、图像预处理、图像定位和特征提取等研究方法,最终实现二维码识别功能.该系统使用640×480像素的低分辨率图像进行测试,在恶劣条件下取得94%的成功率且处理时间在40 ms/板以下,优于大多数现有系统.【期刊名称】《石家庄铁道大学学报(自然科学版)》【年(卷),期】2019(032)003【总页数】5页(P89-93)【关键词】二维码;LabVIEW;机器视觉;识别【作者】王刚;王硕禾;颜丙杰【作者单位】石家庄铁道大学电气与电子工程学院,河北石家庄 050043;石家庄铁道大学电气与电子工程学院,河北石家庄 050043;清华大学汽车安全与节能国家重点实验室,北京 100084【正文语种】中文【中图分类】TP317.40 引言二维码是由一系列黑白点(方点,圆点或其它形状)构成的几何图案。
每个信息字节通过对应的ASCII码转化为二进制即可保存在这些黑白点,其中,黑点表示二进制的‘1’,白点表示二进制的‘0’。
将这些黑白像素按一定规律排列便可在二维码中存储大量信息。
其编码过程有:①数据编码;②结束码和补齐码;③纠错码;④最终编码。
第一步数据编码就是将需要存储的信息转化为二进制数据,后面三步是完成将编好的二进制数据存入二维码。
常用的条码扫描器一般由光源、光学透镜、扫描模组、模拟数字转换电路加塑料外壳构成。
它利用光电元件将检测到的光信号转换成电信号,再将电信号通过模拟数字转换器转化为数字信号传输到计算机中处理。
当扫描一副图像的时候,光源照射到图像上后反射光穿过透镜会聚到扫描模组上,由扫描模组把光信号转换成模拟信号(即电压,它与接受到的光的强度有关)[1]再经由模拟-数字转换电路把模拟电压转换成数字信号,传送到电脑。
什么是二维码生成器意思概念介绍生成原理
![什么是二维码生成器意思概念介绍生成原理](https://img.taocdn.com/s3/m/269ba7f2afaad1f34693daef5ef7ba0d4a736d34.png)
什么是二维码生成器意思概念介绍生成原理二维码生成器的制作需要一个二维码生成算法,或者一个二维码插件,那么你对二维码生成器了解多少呢?以下是由店铺整理关于什么是二维码生成器的内容,希望大家喜欢!什么是二维码生成器二维码生成器的应用原理其实就是二维码生成软件,你可以将信息输入到二维码生成器中,生成相应的二维码,然后进行保存应用。
二维码生成器生成原理二维码其实就是由很多0、1组成的数字矩阵。
二维条码/二维码(2-dimensional bar code) 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流行的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。
同时还具有对不同行的信息自动识别功能、及处理图形旋转变化等特点。
二维条码/二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息。
二维码生成器的制作需要一个二维码生成算法,或者一个二维码插件,然后用JAVA ,C#,VB等编程语言编写一个调用软件就可以做成二维码生成器了。
这个二维码生成算法就是将组成二维码的0、1数字矩阵进行组合,输入二维码生成器的信息不同,所得到的0、1数字矩阵组合也不相同,因此生成的二维码样式就各种各样。
二维码生成器推广应用二维码和手机摄像头以及二维码和计算机的配合将产生多种多样的应用,比如今后我们可以在自己的名片上印上二维码,别人只需用安装二维码识别软件的摄像手机轻松一拍,名片上的各种资料就全部输入手机啦;如果超市的商品也印上二维码,我们就可以在手机上获得关于该商品的大量详细信息。
2011年初二维码已经在日本和韩国获得广泛应用,台湾和大陆地区也已经开始推广,今后我们可以用二维码在自动贩售机买可乐、缴费、网上购物等等,二维码在我们以后的生活中将会越来越广泛的应用。
二维码的生成与识别技术
![二维码的生成与识别技术](https://img.taocdn.com/s3/m/e5b575c250e2524de5187ec1.png)
二维码的生成与识别二维码二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。
二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。
同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。
二维码的结构1、版本信息:version1(21*21),version2,...,version40,一共40个版本。
版本代表每行有多少模块,每一个版本比前一个版本增加4个码元,计算公式为(n-1)*4+21,每个码元存储一个二进制0或者1。
1代表黑色,0表示白色。
比如,version1表示每一行有21个码元。
2、格式信息:存储容错级别L(7%),M(15%),Q(25%),R(35%)。
容错:允许存储的二维码信息出现重复部分,级别越高,重复信息所占比例越高。
目的:即使二维码被图标遮住一部分,一样可以获取全部二维码内容。
有图片的二维码,图片不算二维码的一部分,它遮住一部分码元,但还是可以扫描到所有内容。
3、码字:实际保存的二维码信息,和纠错码字(用于修正二维码损坏带来的错误,就是说当码元被图片遮住,可以通过纠错码字来找回)。
4、位置探测图形、位置探测图形分隔符、定位图形,校正图形:用于对二维码的定位。
位置探测图形用于标记矩形大小,3个图形确定一个矩形。
定位符是因为二维码有40个版本尺寸,当尺寸过大后需要有根标准线,不然扫描的时候可能会扫歪。
matlab编程实现汉明码 -回复
![matlab编程实现汉明码 -回复](https://img.taocdn.com/s3/m/f68797c503d276a20029bd64783e0912a2167ca9.png)
matlab编程实现汉明码-回复Matlab编程实现汉明码汉明码是一种用于检错的线性二元码。
它由理论家Richard Hamming在20世纪50年代提出,主要用于在数字通信中检测和纠正错误。
汉明码的基本思想是在传输的二进制数据中添加冗余位,通过对冗余位和实际数据位的校验来检测和纠正错误。
在本篇文章中,我们将一步一步地介绍如何在Matlab中实现汉明码编码和解码。
为了更好地理解,我们将首先介绍汉明码的原理,然后进一步探讨如何编写Matlab代码来实现该编码和解码过程。
一、汉明码原理汉明码是一种线性二元码,它通过在数据位中添加冗余位来实现检错和纠错功能。
通常情况下,汉明码的编码过程可以分为两个步骤:计算冗余位和添加冗余位。
1.1 计算冗余位在汉明码中,冗余位的数量取决于数据位的数量,并且需要满足以下等式:2^r >= m + r + 1其中,m为数据位的数量,r为冗余位的数量。
根据该等式,可以确定汉明码的最小距离d,即出错位的最小数目。
一般情况下,d = 3,因此,至少需要添加两个冗余位。
冗余位的位置可以通过一个生成矩阵G来确定。
生成矩阵G的构造方法如下:- 将r列单位矩阵相连接得到G的左部分,即G的前r列。
- 用传输函数形式表示连续r个时间单位的单位冲激响应。
- 去掉时间表示部分,将剩下部分的所有元素除以r行冲激响应的第一个元素。
1.2 添加冗余位添加冗余位的过程是通过将冗余位插入到已有的数据位中实现的。
冗余位被插入的位置是由生成矩阵G决定的。
二、Matlab编程实现汉明码接下来,我们将介绍如何使用Matlab来实现汉明码的编码和解码过程。
首先,我们需要在Matlab中创建两个函数:encode和decode。
encode 函数用于实现汉明码的编码过程,而decode函数用于实现汉明码的解码过程。
2.1 encode函数encode函数的主要功能是根据给定的输入数据对其进行汉明码编码。
该函数的输入参数包括:- data:输入的数据位- r:冗余位的数量首先,我们需要在encode函数中计算冗余位的数量,并根据冗余位的数量构建生成矩阵G。
基于主成分分析的QR二维码人脸识别
![基于主成分分析的QR二维码人脸识别](https://img.taocdn.com/s3/m/5d60ace1c0c708a1284ac850ad02de80d4d8066c.png)
基于主成分分析的QR二维码人脸识别
林恒青
【期刊名称】《木工机床》
【年(卷),期】2022()4
【摘要】随着人脸识别和二维码技术在各行各业得到广泛应用,把两种技术结合在一起,便于对数据进行传输和管理,也更具安全性。
文章详细叙述了基于主成分分析的人脸特征提取的原理与方法,将其与QR二维码的编解码进行了结合。
使用MATLAB作为工具平台,调用QR二维码编解码应用程序,进而实现了一个二维码人脸自动识别的系统原型。
实验结果表明,该系统识别率较高,应用范围广,达到了预期效果。
【总页数】5页(P12-15)
【作者】林恒青
【作者单位】福建船政交通职业学院机械与智能制造学院
【正文语种】中文
【中图分类】TP391.4
【相关文献】
1.基于QR Code二维码的食品溯源系统的开发与设计
2.基于QR Code二维码的食品溯源系统的开发与设计
3.基于SRCNN的QR二维码-人脸重构算法
4.基于QR二维码与RFID射频识别技术的装备备件管理信息系统设计
5.基于LabVIEW 的QR二维码生成与识别研究
因版权原因,仅展示原文概要,查看原文内容请购买。
matlab一维条形码码字识别程序
![matlab一维条形码码字识别程序](https://img.taocdn.com/s3/m/7288b9d6b4daa58da1114aa0.png)
close allI = imread('E:\txm.jpg');J= rgb2gray(I);figure(1)imshow(J);title('灰度化图像 ');[e1,e2]=size(J);Im=imcrop(J,[e2/2-200,e1/2-200,400,400]); figure(2)subplot(1,2,1),imshow(Im)title('中心区域 ');subplot(1,2,2),imhist(Im)title('中心区域直方图');[xa,ya]=size(Im);b=double(Im);zd=double(max(Im)) ;zx=double(min(Im)) ;T=double((zd+zx))/2;count=double(0);while 1count=count+1;S0=0.0; n0=0.0;S1=0.0; n1=0.0;for i=1:xafor j=1:yaif double(Im(i,j))>=TS1=S1+double(Im(i,j));n1=n1+1;elseS0=S0+double(Im(i,j));n0=n0+1;endendendT0=S0/n0;T1=S1/n1;if abs(T-((T0+T1)/2))<0.1break;elseT=(T0+T1)/2;endendcountTK=find(J<T);J(K)=0;K=find(J>=T);J(K)=255;figure(3)imshow(J)title(' 图像二值化 ');B=medfilt2(J,[5,1]);figure(4)imshow(B)title('中值滤波后图像');[y0,x0]=size(B);BW = edge(B,'log');figure(5);imshow(BW);title('边缘检测图像')%function code = barcode(pic) %条形码识别check_left = [13,25,19,61,35,49,47,59,55,11;... %左边数据编码,奇39,51,27,33,29,57, 5,17, 9,23]; %左边数据编码,偶check_right = [114,102,108,66,92,78,80,68,72,116]; %右边数据编码first_num = [31,20,18,17,12,6,3,10,9,5];%第一位数据编码bar = imread('E:\txm.jpg');%读输入条形码图片bar_Gray = rgb2gray(bar);%将RGB图片转换灰度图[a_hist x] = imhist(bar_Gray);hist_max = [];if a_hist(1)>a_hist(2)hist_max = [hist_max 1];endx = max(x);for i=2:xif a_hist(i)>a_hist(i-1) && a_hist(i)>a_hist(i+1)hist_max = [hist_max i];endendif a_hist(x)<a_hist(x+1)hist_max = [hist_max x+1];end[m,n] = size(hist_max);k = 0;max_1 = 0;max_2 = 0;for i=1:nif k<a_hist(hist_max(i))k = a_hist(hist_max(i));max_1 = hist_max(i);endendtemp = a_hist(max_1);a_hist(max_1) = 0;k = 0;for i=1:nif k<a_hist(hist_max(i))k = a_hist(hist_max(i));max_2 = hist_max(i);endenda_hist(max_1) = temp;if max_1>max_2k = max_1;max_1 = max_2;max_2 = k;endT = max_1;k = a_hist(max_1);for i=max_1:max_2if k>a_hist(i)k = a_hist(i);T = i;endend[m,n] = size(bar_Gray); %求灰度图的大小for i=1:m %对图像进行二值化处理for j=1:nif bar_Gray(i,j)>T%选择适当的阈值进行二值化处理bar_10(i,j) = 1;elsebar_10(i,j) = 0;endendend%imshow(bar_10);l = 0;%检测59根条形码for i=1:mk = 1;l = l+1;for j=1:n-1if bar_10(i,j)~=bar_10(i,j+1)%比较同一行相邻两点的颜色是否一致%bar_x(l,k) = i;bar_y(l,k) = j; %记录转折点的纵坐标k = k+1;%准备记录下一个数据点endif k>61 %点数大于60,该行应该删掉l = l-1;breakendendif k<61 %点数小于60,该行应该删掉l = l-1;endend[m,n] = size(bar_y);if m<=1 %查看条形码是否有效code = '0';fprintf(1,'GameOver!\n');returnendfor i=1:m%计算每根条形码的宽度for j=1:n-1bar_num(i,j) = bar_y(i,j+1) - bar_y(i,j);if bar_num(i,j)<0bar_num(i,j) = 0;endendendbar_sum = sum(bar_num)/m;%求每根条形码宽度的平均值k = 0;for i=1:59%计算59根条形码的总宽度k = k + bar_sum(i);endk = k/95;%计算单位条形码的宽度for i=1:59%计算每根条形码所占位数bar_int(i) = round(bar_sum(i)/k);endk = 1;for i=1:59%将条形码转换成二进制数if rem(i,2)for j=1:bar_int(i)%黑色条用1表示bar_01(k) = 1;k = k+1;elsefor j=1:bar_int(i) %白色条用0表示bar_01(k) = 0;k = k+1;endendendif ((bar_01(1)&&~bar_01(2)&&bar_01(3))...%判断起始符是否正确&&(~bar_01(46)&&bar_01(47)&&~bar_01(48)&&bar_01(49)&&~bar_01(50))... %判断中间分隔符是否正确&&(bar_01(95)&&~bar_01(94)&&bar_01(93))) %判断终止符是否正确l = 1;for i=1:6 %将左侧42位二进制数转换为十进制数bar_left(l) = 0;for k=1:7bar_left(l) = bar_left(l)+bar_01(7*(i-1)+k+3)*(2^(7-k));endl = l+1;endl = 1;for i=1:6 %将右侧42位二进制数转换为十进制数bar_right(l) = 0;for k=1:7bar_right(l) = bar_right(l)+bar_01(7*(i+6)+k+1)*(2^(7-k));k = k-1;endl = l+1;endnum_bar = '';num_first = 0;first = 2;for i=1:6%从左边数据编码表中查出条形码编码数字for j=0:1for k=0:9if bar_left(i)==check_left(j+1,k+1)num_bar = strcat(num_bar , num2str(k));switch first%记录左边数据的奇偶顺序case 2first = j;break;case 1num_first = num_first + j*(2^(6-i));break;case 0num_first = num_first + ~j*(2^(6-i));break;otherwisebreak;endendendendendfor i=1:6%从右边数据编码表中查出条形码编码数字for j=0:9if bar_right(i)==check_right(j+1)num_bar = strcat(num_bar , num2str(j));endendendfor i=0:9%从第一位数据编码表中查出第一位数字if num_first==first_num(i+1)num_bar = strcat(num2str(i) , num_bar);break;endendif numel(num_bar)~=13fprintf(1,'Please Turn It Around!\n');returnendcheck_code = 0;for i=1:12 %计算校验码if rem(i,2)check_code = check_code + str2double(num_bar(i));elsecheck_code = check_code + str2double(num_bar(i))*3;endendcheck_code = rem(check_code,10);if check_code>0check_code = 10 - check_code;endif check_code==str2double(num_bar(13)) %判断校验码是否正确code = num_bar;elsefprintf(1,'Please Turn It Around!\n'); returnend。
如何用MATLAB在指定范围内生成多个互不重叠的二维随机坐标
![如何用MATLAB在指定范围内生成多个互不重叠的二维随机坐标](https://img.taocdn.com/s3/m/d83a344f6d85ec3a87c24028915f804d2b16871f.png)
如何用MATLAB在指定范围内生成多个互不重叠的二维随
机坐标
MATLAB是一种流行的科学计算软件,也是一种编程语言,用来解决
数学计算问题,广泛应用于科学计算和工程设计等领域。
下面将介绍一种
用MATLAB在指定范围内生成多个互不重叠的二维随机坐标的方法。
首先,定义一个存储坐标值的数组。
假设现在需要生成1000个互不
重叠的二维随机坐标,在[-10,10]范围内,可以使用MATLAB的zeros(函
数来创建一个1000行2列的数组,每一行代表一个坐标,每一列分别代
表x和y轴,用来存储坐标值。
其次,使用MATLAB中内置的rand(函数来生成坐标值。
此函数可以
生成在指定范围内的随机数。
若想在[-10,10]范围内生成随机坐标,可使
用rand(1000,2)*20-10,表示在1000行2列的范围内生成随机数,且每
一个随机数落在[-10,10]范围内。
然后,判断生成的坐标是否重叠。
可以采用循环,将每一个坐标值和
它的前几个坐标值相对比,看两点的距离是否小于一个阈值。
若小于阈值,则证明两点重叠,则重新生成坐标,直到生成不重叠的坐标;若大于阈值,则证明两点不重叠,则保存坐标值,继续与下一个坐标值进行比较,以此
类推,直到循环到最后一个坐标值。
最后,将坐标值存储到之前定义的数组中。
可以使用MATLAB的保存
函数,将所有坐标值保存到一个文件中。
二维码生成与解析代码实现
![二维码生成与解析代码实现](https://img.taocdn.com/s3/m/d76e810f16fc700abb68fc67.png)
二维码生成与解析代码实现二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字、图片、网址等信息的条码图片。
如下图二维码的特点:1. 高密度编码,信息容量大可容纳多达1850个大写字母或2710个数字或1108个字节,或500多个汉字,比普通条码信息容量约高几十倍。
2. 编码范围广该条码可以把图片、声音、文字、签字、指纹等可以数字化的信息进行编码,用条码表示出来;可以表示多种语言文字;可表示图像数据。
3. 容错能力强,具有纠错功能这使得二维条码因穿孔、污损等引起局部损坏时,照样可以正确得到识读,损毁面积达50%仍可恢复信息。
4. 译码可靠性高它比普通条码译码错误率百万分之二要低得多,误码率不超过千万分之一。
5. 可引入加密措施保密性、防伪性好。
6. 成本低,易制作,持久耐用正因为以上这些特点,二维码现在越来越流行,应用也是越来越广(详细了解请见百度百科,介绍不是本篇重点),所以掌握如何开发二维码是非常不错的知识储备,因此本篇博文将为大家讲解如何生成、解析二维码。
一、Java所需jar包:QRCode.jar/detail/wangpeng047/4008532TwoDimensionCode类:二维码操作核心类[java]view plaincopy1.package qrcode;2.3.import java.awt.Color;4.import java.awt.Graphics2D;5.import java.awt.image.BufferedImage;6.import java.io.File;7.import java.io.IOException;8.import java.io.InputStream;9.import java.io.OutputStream;10.11.import javax.imageio.ImageIO;12.13.import jp.sourceforge.qrcode.QRCodeDecoder;14.import jp.sourceforge.qrcode.exception.DecodingFailedException;15.16.import com.swetake.util.Qrcode;17.18.public class TwoDimensionCode {19.20./**21. * 生成二维码(QRCode)图片22. * @param content 存储内容23. * @param imgPath 图片路径24. */25.public void encoderQRCode(String content, String imgPath) {26.this.encoderQRCode(content, imgPath, "png", 7);27. }28.29./**30. * 生成二维码(QRCode)图片31. * @param content 存储内容32. * @param output 输出流33. */34.public void encoderQRCode(String content, OutputStream output) {35.this.encoderQRCode(content, output, "png", 7);36. }37.38./**39. * 生成二维码(QRCode)图片40. * @param content 存储内容41. * @param imgPath 图片路径42. * @param imgType 图片类型43. */44.public void encoderQRCode(String content, String imgPath, String imgType) {45.this.encoderQRCode(content, imgPath, imgType, 7);46. }47.48./**49. * 生成二维码(QRCode)图片50. * @param content 存储内容51. * @param output 输出流52. * @param imgType 图片类型53. */54.public void encoderQRCode(String content, OutputStream output, String imgType) {55.this.encoderQRCode(content, output, imgType, 7);56. }57.58./**59. * 生成二维码(QRCode)图片60. * @param content 存储内容61. * @param imgPath 图片路径62. * @param imgType 图片类型63. * @param size 二维码尺寸64. */65.public void encoderQRCode(String content, String imgPath, String imgType, int size) {66.try {67. BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);68.69. File imgFile = new File(imgPath);70.// 生成二维码QRCode图片71. ImageIO.write(bufImg, imgType, imgFile);72. } catch (Exception e) {73. e.printStackTrace();74. }75. }76.77./**78. * 生成二维码(QRCode)图片79. * @param content 存储内容80. * @param output 输出流81. * @param imgType 图片类型82. * @param size 二维码尺寸83. */84.public void encoderQRCode(String content, OutputStream output, String imgType, int size) {85.try {86. BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);87.// 生成二维码QRCode图片88. ImageIO.write(bufImg, imgType, output);89. } catch (Exception e) {90. e.printStackTrace();91. }92. }93.94./**95. * 生成二维码(QRCode)图片的公共方法96. * @param content 存储内容97. * @param imgType 图片类型98. * @param size 二维码尺寸99. * @return100. */101.private BufferedImage qRCodeCommon(String content, String imgType, int s ize) {102. BufferedImage bufImg = null;103.try {104. Qrcode qrcodeHandler = new Qrcode();105.// 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小106. qrcodeHandler.setQrcodeErrorCorrect('M');107. qrcodeHandler.setQrcodeEncodeMode('B');108.// 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大109. qrcodeHandler.setQrcodeVersion(size);110.// 获得内容的字节数组,设置编码格式111.byte[] contentBytes = content.getBytes("utf-8");112.// 图片尺寸113.int imgSize = 67 + 12 * (size - 1);114. bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_ INT_RGB);115. Graphics2D gs = bufImg.createGraphics();116.// 设置背景颜色117. gs.setBackground(Color.WHITE);118. gs.clearRect(0, 0, imgSize, imgSize);119.120.// 设定图像颜色> BLACK121. gs.setColor(Color.BLACK);122.// 设置偏移量,不设置可能导致解析出错123.int pixoff = 2;124.// 输出内容> 二维码125.if (contentBytes.length > 0 && contentBytes.length < 800) { 126.boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes); 127.for (int i = 0; i < codeOut.length; i++) {128.for (int j = 0; j < codeOut.length; j++) {129.if (codeOut[j][i]) {130. gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3 );131. }132. }133. }134. } else {135.throw new Exception("QRCode content bytes length = " + conte ntBytes.length + " not in [0, 800].");136. }137. gs.dispose();138. bufImg.flush();139. } catch (Exception e) {140. e.printStackTrace();141. }142.return bufImg;143. }144.145./**146. * 解析二维码(QRCode)147. * @param imgPath 图片路径148. * @return149. */150.public String decoderQRCode(String imgPath) {151.// QRCode 二维码图片的文件152. File imageFile = new File(imgPath);153. BufferedImage bufImg = null;154. String content = null;155.try {156. bufImg = ImageIO.read(imageFile);157. QRCodeDecoder decoder = new QRCodeDecoder();158. content = new String(decoder.decode(new TwoDimensionCodeImage(bu fImg)), "utf-8");159. } catch (IOException e) {160. System.out.println("Error: " + e.getMessage());161. e.printStackTrace();162. } catch (DecodingFailedException dfe) {163. System.out.println("Error: " + dfe.getMessage());164. dfe.printStackTrace();165. }166.return content;167. }168.169./**170. * 解析二维码(QRCode)171. * @param input 输入流172. * @return173. */174.public String decoderQRCode(InputStream input) {175. BufferedImage bufImg = null;176. String content = null;177.try {178. bufImg = ImageIO.read(input);179. QRCodeDecoder decoder = new QRCodeDecoder();180. content = new String(decoder.decode(new TwoDimensionCodeImage(bu fImg)), "utf-8");181. } catch (IOException e) {182. System.out.println("Error: " + e.getMessage());183. e.printStackTrace();184. } catch (DecodingFailedException dfe) {185. System.out.println("Error: " + dfe.getMessage());186. dfe.printStackTrace();187. }188.return content;189. }190.191.public static void main(String[] args) {192. String imgPath = "G:/TDDOWNLOAD/Michael_QRCode.png";193. String encoderContent = "Hello 大大、小小,welcome to QRCode!" + "\nMyblog [ ]" + "\nEMail [ sjsky007 @ ]";194. TwoDimensionCode handler = new TwoDimensionCode();195. handler.encoderQRCode(encoderContent, imgPath, "png");196.// try {197.// OutputStream output = new FileOutputStream(imgPath);198.// handler.encoderQRCode(content, output);199.// } catch (Exception e) {200.// e.printStackTrace();201.// }202. System.out.println("========encoder success");203.204.205. String decoderContent = handler.decoderQRCode(imgPath);206. System.out.println("解析结果如下:");207. System.out.println(decoderContent);208. System.out.println("========decoder success!!!");209. }210.}TwoDimensionCodeImage 类:二维码图片对象[java]view plaincopy1.package qrcode;2.3.import java.awt.image.BufferedImage;4.5.import jp.sourceforge.qrcode.data.QRCodeImage;6.7.public class TwoDimensionCodeImage implements QRCodeImage { 8.9. BufferedImage bufImg;10.11.public TwoDimensionCodeImage(BufferedImage bufImg) {12.this.bufImg = bufImg;13. }14.15.@Override16.public int getHeight() {17.return bufImg.getHeight();18. }19.20.@Override21.public int getPixel(int x, int y) {22.return bufImg.getRGB(x, y);23. }24.25.@Override26.public int getWidth() {27.return bufImg.getWidth();28. }29.30.}。
CA码生成原理及matlab程序实现知识分享
![CA码生成原理及matlab程序实现知识分享](https://img.taocdn.com/s3/m/f7fa34a519e8b8f67c1cb9ce.png)
C A码生成原理及m a t l a b程序实现作业:用Matlab写C/A码生成器程序,并画生成码的方波图。
C/A码生成原理C/A 码是用 m 序列优选对组合形成的 Gold 码。
Gold码是由两个长度相同而互相关极大值为最小的 m 序列逐位模2 相加所得到的码序列。
它是由两个10 级反馈移位寄存器组合产生的,其产生原理如图1 所示。
图1 C/A码生成原理G1发生器的抽头号为3和10,G2发生器的抽头号为2、3、6、8、9、10;G1发生器的第10位输出的数字即为G1码,而G2码是由G2的两个抽头的输出结果进行模2相加得到。
卫星的PRN码与延时的量是相关联的,对C/A码来说,每颗卫星都有特别的延时,如第1颗GPS卫星的G2 抽为2、6,第2颗为3、7,第3 颗为4、8,第4 颗为5、9 等,如图2所示。
通过G2 相位选择可以产生结构不同的伪随机码,从而可以实现不同卫星之间的码分多址技术与卫星识别。
图2 prn序号与G2抽头、时延对应关系基于MATLAB的GPS信号实现编写成“codegen”程序,输入[ca_used]=codegen(svnum),其中svnum为卫星号,ca_used为得到的C/A码序列。
程序具体实现流程如下:在程序中定义一个数组,使得卫星号与G2的码片延时一一对应。
gs2=[5;6;7;8;17;18;139;140;141;251;252;254;255;256;257;258;469;470;471;472;473 ;474;509;512;513;514;515;516;859;860;861;862];定义两个 1×1 023 的数组 g1、g2 用来存放生成的Gold 码。
定义一个全1 的 10 位数组,作为移位寄存器,相当于G1、G2 生成模块的初值均置为全“1”。
按原理式来生成两个 Gold 码序列。
设定两个 Gold 码产生器的反馈抽头:save1=reg(3)*reg(10); % g1 码的反馈值;save2=reg(2)*reg(3)*reg(6)*reg(8)*reg(9)*reg(10);%g2 码的反馈值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计报告课题名称:二维码的生成与识别项目完成人(班级、学号、姓名):项目完成时间: 2017/6/15一、引言1、编写目的本学期学习《数字图像处理》,包含很多知识点,像:图像编码与压缩、图像相关变换、图像增强技术、图像复原技术,这些知识点的应用在实际编程中都非常重要。
纸上得来终觉浅,绝知此事要躬行。
所以,这次课程设计的目的主要就是巩固所学的数字图像处理的相关知识。
最终是我们通过该教学环节,把该课程以及相关知识融会贯通。
2、背景由于受信息的容量限制,一维条码仅仅是对“物品”的标识,而不是对“物品”的描述,故一维条码的使用不得不依赖数据库存在。
在使用上受到了极大的限制,效率很低。
二维码正是为了解决一维条码无法解决的问题而产生的。
二维码具有高密度、高可靠性等特点,可以用来表示数据文件、图像等,实现信息获取、网站跳转、广告推送、手机电商、优惠促销、会员管理等功能,具有很强的研究意义。
3、参考资料《数字图像处理》第三版胡学龙二、设计方案1、图像采集图像主要来自网上在线生成的二维码图像和该程序生成的二维码图像。
2、算法分析预处理过程灰度化-----平滑处理------二值化1.灰度化:一般都是为了减小图像原始数据量,便于后续处理时计算量更少,因为图像处理不一定需要对彩色图像的RGB三个分量都进行处理2.平滑处理:图像平滑是指用于突出图像的宽大区域、低频成分、主干部分或抑制图像噪声和干扰高频成分,使图像亮度平缓渐变,减小突变梯度,改善图像质量的图像处理方法。
图像平滑的方法包括:插值方法,线性平滑方法,卷积法等等。
这样的处理方法根据图像噪声的不同进行平滑,比如椒盐噪声,就采用线性平滑方法!3.二值化:图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。
二维码解码二维码解码主要使用的是ZXing库,ZXing是个很经典的条码/二维码识别的开源类库3、代码实现打开图像function pushbutton1_Callback(hObject, eventdata, handles) global im;[filename,pathname]=uigetfile({'*.*';'*.bmp';'*.jpg';'*.tif';'*.jpg'} ,'选择图像');if isequal(filename,0)||isequal(pathname,0)errordlg('您还没有选取图片!!','温馨提示');%如果没有输入,则创建错误对话框return;elsedisp(['User selected',fullfile(pathname,filename)]);fprintf('fffffff%s\n',filename);im=imread(filename);%读取图像figureimshow(im);%在坐标axes1显示原图像title('原始图像');End灰度化处理function pushbutton4_Callback(hObject, eventdata, handles)global im;global II;I=im;[w,h,l]=size(I); %图像大小II=[];for i=1:hfor j=1:wII(j,i)=0.3*I(j,i,1)+0.59*I(j,i,2)+0.11*I(j,i,3); %灰度化处理公式endendfigure,imshow(II,[]) %显示图像title('二维码灰度化处理');平滑处理function pushbutton5_Callback(hObject, eventdata, handles)global II;global I3;III=uint8(II); %图像转换0-255Ix=imnoise(III,'salt & pepper',0.02); %对灰度化图像人为加噪声I3=medfilt2(Ix,[3,3]); %平滑处理figureimshow(Ix)title('二维码加噪处理');figureimshow(I3)title('二维码平滑处理');二值化处理function pushbutton6_Callback(hObject, eventdata, handles)global I3;global I_otsu;I_otsu=otsut(I3); %二值化处理figureimshow(I_otsu,[])title('二维码二值化处理');旋转校正function pushbutton7_Callback(hObject, eventdata, handles) global im;%倾斜校正:二值化,取边缘,Hough变换得到角度,旋转I=im;bw=rgb2gray(I); %rgb转换为灰度图bw=im2bw(I,graythresh(bw)); %二值化过程bw=double(bw);BW=edge(bw,'canny'); %canny边缘处理BW1=BW;figureimshow(BW1);title('canny 边界图像'); %显示图像[H,T,R]=hough(BW);figure,imshow(H,[],'XData',T,'YData',R,'InitialMagnification','fit'); xlabel('\theta'),ylabel('\rho');axis on, axis normal,hold on;P=houghpeaks(H,4,'threshold',ceil(0.3*max(H(:)))); %hough变化峰值检测x=T(P(:,2)); y = R(P(:,1));plot(x,y,'s','color','white');lines=houghlines(BW,T,R,P,'FillGap',50,'MinLength',7); %hough检测线段figure,imshow(BW),title('直线标识图像');max_len = 0;hold on;for k=1:length(lines) %主要把线条和点显示出来xy=[lines(k).point1;lines(k).point2];% 标出线段plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% 标出线段的起始和终端点plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');len=norm(lines(k).point1-lines(k).point2);Len(k)=len;if (len>max_len)max_len=len;xy_long=xy;endend% 强调最长的部分plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','blue');[L1 Index1]=max(Len(:));% 最长线段的起始和终止点x1=[lines(Index1).point1(1) lines(Index1).point2(1)];y1=[lines(Index1).point1(2) lines(Index1).point2(2)];% 求得线段的斜率K1=-(lines(Index1).point1(2)-lines(Index1).point2(2))/...(lines(Index1).point1(1)-lines(Index1).point2(1))angle=atan(K1)*180/pi %显示角度A = imrotate(I,-angle,'bilinear');% imrate 是逆时针的所以取一个负号figure,imshow(A);解码function pushbutton3_Callback(hObject, eventdata, handles)global I_otsu; %global 定义全局变量global im;global KL;global Ijibian;I_jiema=Ijibian;I_jiema=I_otsu; %二值I_jiema=KL;I_jiema=im;str=zxing_decode(I_jiema) %解码set(handles.edit1,'String',str); %显示字符三、出错处理1、出错信息2、出错处理方法及补救措施主要是由于导入的jar包文件的路径错误而导致的,所以修改好对应的路径即可。
四、总结总体感觉对相关数字图像的处理有了更深的理解。
但是仍然感觉到自己还有不足,因为一些图像变换还不是太熟悉,以后自己一定会补上这一块。