「java端点识别」caxa无法识别端点
今天给各位分享java端点识别的知识,其中也会对caxa无法识别端点进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java中怎么识别节点流和处理流
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
JAVA常用的节点流有以下几个:
文 件 FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流。
字符串 StringReader StringWriter 对字符串进行处理的节点流。
数 组 ByteArrayInputStream ByteArrayOutputStreamCharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
管 道 PipedInputStream PipedOutputStream PipedReaderPipedWriter对管道进行处理的节点流。
父 类 InputStream OutputStream Reader Writer
常用处理流(关闭处理流使用关闭里面的节点流)
缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter
增加缓冲功能,避免频繁读写硬盘。
转换流:InputStreamReader OutputStreamReader实现字节流和字符流之间的转换。
数据流 DataInputStream DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。
java 怎么判断两条直线相交
// 判断两条直线段是否有交点,有则计算交点的坐标
// p1,p2是直线一的端点坐标
// p3,p4是直线二的端点坐标
bool detectIntersect(Point p1, Point p2, Point p3, Point p4)
{
double line_x,line_y; //交点
if ( (fabs(p1.x-p2.x)1e-6) (fabs(p3.x-p4.x)1e-6) )
{
return false;
}
else if ( (fabs(p1.x-p2.x)1e-6) ) //如果直线段p1p2垂直与y轴
{
if (between(p1.x,p3.x,p4.x))
{
double k = (p4.y-p3.y)/(p4.x-p3.x);
line_x = p1.x;
line_y = k*(line_x-p3.x)+p3.y;
if (between(line_y,p1.y,p2.y))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else if ( (fabs(p3.x-p4.x)1e-6) ) //如果直线段p3p4垂直与y轴
{
if (between(p3.x,p1.x,p2.x))
{
double k = (p2.y-p1.y)/(p2.x-p1.x);
line_x = p3.x;
line_y = k*(line_x-p2.x)+p2.y;
if (between(line_y,p3.y,p4.y))
{
return true;
}
else
{
return false;
}
}
else
{
return false;
}
}
else
{
double k1 = (p2.y-p1.y)/(p2.x-p1.x);
double k2 = (p4.y-p3.y)/(p4.x-p3.x);
if (fabs(k1-k2)1e-6)
{
return false;
}
else
{
line_x = ((p3.y - p1.y) - (k2*p3.x - k1*p1.x)) / (k1-k2);
line_y = k1*(line_x-p1.x)+p1.y;
}
if (between(line_x,p1.x,p2.x)between(line_x,p3.x,p4.x))
{
return true;
}
else
{
return false;
}
}
}
java 判断直线状况
public class LineTest {
public static void main(String[] args) {
Point p1 = new Point(0, 3), p2 = new Point(4, 0);
Line l1 = new Line(0, 3, 4, 0),
l2 = new Line(p1, p2),
l3 = new Line(0,4,0,3),
l4 = new Line(4,4,0,4),
l5 = new Line(0,0,3,3);
System.out.println("l1:"+l1);
System.out.println("l2:"+l2);
System.out.println("l3:"+l3);
System.out.println("l4:"+l4);
System.out.println("l5:"+l5);
System.out.println("l1 length:"+l1.getLength());
System.out.println("l2 length:"+l2.getLength());
System.out.println("l3 length:"+l3.getLength());
System.out.println("l4 length:"+l4.getLength());
System.out.println("l1 isHorizontal:"+l1.isHorizontal());
System.out.println("l3 isHorizontal:"+l3.isHorizontal());
System.out.println("l1 isVertical:"+l1.isVertical());
System.out.println("l4 isVertical:"+l4.isVertical());
System.out.println("l1 slope:"+l1.getSlope());
System.out.println("l3 slope:"+l3.getSlope());
System.out.println("l4 slope:"+l4.getSlope());
System.out.println("l5 slope:"+l5.getSlope());
System.out.println("l1 midpoint:"+l1.getMidpoint().toString());
System.out.println("l3 midpoint:"+l3.getMidpoint().toString());
System.out.println("l1 equals l2:"+l1.equals(l2));
System.out.println("l1 equals l3:"+l1.equals(l3));
System.out.println("l2 equals l3:"+l2.equals(l3));
}
}
class Line {
private Point p1,p2;
public Line(Point p1, Point p2) {
super();
this.p1 = p1;
this.p2 = p2;
}
public Line(int x1,int y1,int x2,int y2){
super();
this.p1=new Point(x1, y1);
this.p2=new Point(x2, y2);
}
public int getLength(){
int a=(int) Math.abs(p1.getX()-p2.getX());
int b=(int) Math.abs(p1.getY()-p2.getY());
return (int) Math.sqrt(a*a+b*b);
}
public boolean isHorizontal(){
return Math.abs(p1.getX()-p2.getX())=0.00001;
}
public boolean isVertical(){
return Math.abs(p1.getY()-p2.getY())=0.00001;
}
public double getSlope(){
double a=p1.getX()-p2.getX();
double b=p1.getY()-p2.getY();
if(b==0.0)return Double.MAX_VALUE;
return a/b;
}
public Point getMidpoint(){
return new Point((int)((p1.getX()+p2.getX())/2)
,(int)((p1.getY()+p2.getY())/2));
}
public boolean equals(Line ol){
return (this.p1.equals(ol.getP1()))
(this.p2.equals(ol.getP2()));
}
public Point getP1() {
return p1;
}
public void setP1(Point p1) {
this.p1 = p1;
}
public Point getP2() {
return p2;
}
public void setP2(Point p2) {
this.p2 = p2;
}
@Override
public String toString(){
StringBuilder sb=new StringBuilder();
sb.append("[")
.append("(").append(p1.getX()).append(",")
.append(p1.getY()).append(")").append(",")
.append("(").append(p2.getX()).append(",")
.append(p2.getY()).append(")")
.append("]");
return sb.toString();
}
}
有个小问题就是你要求用Point做点,而Point点的数据类型是int,计算中点时会损失精度,可以改成Point2D实现。
java手写体英文数字识别系统 识别预处理如何实现 采用什么语言比较好
转载 1 引言
手写体数字识别是文字识别中的一个研究课题,是多年来的研究热点,也是模式识别领域中最成功的应用之一。由于识别类型较少,在实际生活中有深远的应用需求,一直得到广泛的重视。近年来随着计算机技术和数字图像处理技术的飞速发展,数字识别在电子商务、机器自动输入等场合已经获得成功的实际应用。尽管人们对手写数字的研究己从事了很长时间的研究,并己取得了很多成果,但到目前为止,机器的识别本领还无法与人的认知能力相比,这仍是一个有难度的开放问题,所以对手写数字识别的进一步研究,寻求如何更高效更准确更节能地实现手写数字的自动录入和识别的解决方案对提高经济效益、推动社会发展都有深远的意义。
近年来, 人工神经网技术发展十分迅速, 它具有模拟人类部分形象思维的能力, 为模式识别开辟了新的途径, 成了模拟人工智能的一种重要方法,特别是它的信息并行分布式处理能力和自学习功能等显著优点, 更是激起了人们对它的极大的兴趣。BP(Back Propagation)网络是神经网络中一种,是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,可以很好地解决非线性问题,在函数逼近、模式识别和数据压缩等方面都有很广泛的应用。我们在认真地研究了神经网络的基本原理和机制的基础上, 结合手写体数字识别这一具体课题, 提出了用BP神经网络方法来实现手写体数字识别的方案。
2 手写体数字识别概述
2.1 手写数字识别简述
模式识别是六十年代初迅速发展起来的一门学科。由于它研究的是如何用机器来实现人及某些动物对事物的学习、识别和判断能力,因而受到了很多科技领域研究人员的注意,成为人工智能研究的一个重要方面。
字符识别是模式识别的一个传统研究领域。从50年代开始,许多的研究者就在这一研究领域开展了广泛的探索,并为模式识别的发展产生了积极的影响。
手写体数字识别是多年来的研究热点也是字符识别中的一个特别问题。手写体数字识别在特定的环境下,如邮政编码自动识别系统,税表和银行支票自动处理系统等一般情况。当涉及到数字识别时,人们往往要求识别器有很高的识别可靠性,特别是有关金额的数字识别时,如支票中填写的金额部分,更是如此。因此针对这类问题的处理系统设计的关键环节之一就是设计出高可靠性和高识别率的手写体数字识别方法。这个领域取得了飞速的发展,部分是由于更好的学习算法,部分是由于更优良的训练集。美国国家科学学会(NIST)建立了
一个包含60000个经过标注的数字的数据库,它已经成为对新的学习算法进行比较的性能测试标准。然而可以说还没有哪个手写体数字识别器达到完美的识别效果。
在过去的数十年中,研究者们提出了许许多多的识别方法,按使用的特征不同,这些方法可以分为两类:基于结构特征的方法和基于统计特征的方法。统计特征通常包括点密度的测量、矩、特征区域等。结构特征通常包括园、端点、交叉点、笔划、轮廓等,一般来说,两类特征各有优势。例如,使用统计特征的分类器易于训练,而且对于使用统计特征的分类器,在给定的训练集上能够得到相对较高的识别率;而结构特征的主要优点之一是能描述字符的结构,在识别过程中能有效地结合几何和结构的知识,因此能够得到可靠性较高的识别结果。本文针对手写数字识别选用BP神经网络这种基于传统统计学基础上的分类方法,用于分割和识别,并取得了较好的识别效果。
2.2 手写数字识别的一般过程
手写体数字识别的过程如图2-1所示,一般分为预处理、特征提取、数字串的分割、分类器、等模块。原始图像是通过光电扫描仪,CCD器件或电子传真机等获得的二维图像信号。预处理包括对原始图像的去噪、倾斜校正或各种滤波处理。手写体数字具有随意性,其字符大小、字间距、字内距变化很大,分割难度较大。手写数字串的分割是其中最重要的环节,是制约识别率的瓶颈所在。去噪是预处理中极重要的环节。系统面对的是从实际环境中切分出的字符图像,可能有粘连的边框、随机的墨点、切分不正确引入的其他字符笔划等使前景点增加的噪声,还可能有断线等使背景增加的噪声,目前适应各种环境的通用去噪算法还不成熟。预处理中的规格化也不仅仅是同比例的放缩,它不仅要保持拓扑不变,更要最大限度地突出所取特征。在众多应用环境中,特征提取、分类器、多分类器集成是整个识别系统的核心。大体上来说特征可以分为结构特征和统计特征两类。由于分类器的选择取决于所提取的特征,因此相应的识别方法便有结构方法和统计方法。
总之,从手写体数字识别原理可见,手写体数字识别技术主要包括以下几点:
1)图像预处理,包括彩色图像转成灰度图像、二值化,归一化,滤除干扰噪声等;
2)基于数字图像的特征选择和提取;
3)数字串的分割;
4)模式分类识别。
其中,第二和第四部分是手写数字识别的重点,直接关系到识别的准确率和效率,也是本论文研究的重点所在。
结果图2-1 识别流程
2.3 手写数字识别的一般方法及比较
手写数字识别在学科上属于模式识别和人工智能的范畴。在过去的四十年中,人们提出了很多办法获取手写字符的关键特征,提出了许多识别方法和识别技术。这些手段分两大类:
全局分析和结构分析。
多年的研究实践表明,对于完全没有限制的手写数字,几乎可以肯定:没有一种简单的方案能达到很高的识别率和识别精度,因此,最近这方面的努力向着更为成熟、复杂、综合的方向发展。研究工作者努力把新的知识运用到预处理,特征提取,分类当中。近年来,人工智能中专家系统方法、人工神经网络方法已应用于手写数字识别。在手写数字识别的研究中,神经网络技术和多种方法的综合是值得重视的方向。
针对模式特征的不同选择及其判别决策方法的不同,可将模式识别方法大致分为5大类这5种识别方法均可实现手写数字识别,但它们特点不同,必须根据条件进行选择。
(1)统计模式法
这是以同类模式具有相同属性为基础的识别方法。用来描述事物属性的参量叫做待征,它可以通过模式的多个样本的测量值统计分析后按一定准则来提取。例如:在手写数字识别系统中,我们可以把每个数字的图形分为若干个小方块(图),然后统计每一小方块中的黑像素构成一个多维特征矢量,作为该数字的特征。必须注意的是:在选择特征时,用于各类模式的特征应该把同类模式的各个样本聚集在一起,而使不同类模式的样本尽量分开,以保证识别系统能具有足够高的识别率。
(2)句法结构方法
在形式语言和自动机的基础上产生了句法结构这一方法。其基本原理是:对每一个模式都用一个句法来表示,而对一个待识别的未知样本,通过抽取该样本的基元来构造该样本的句子,然后分析此句子满足什么样的句法,从而推断出他该属于哪个模式类。这种方法的优点是它能反映模式的结构特征,而且对模式的结构特征变换不敏感,因此比较适合联机识别。但是由于抽取字符的基元比较困难,因而不是特别适合用于脱机识别,同时这一方法的理论基础还不可靠,抗干扰能力比较弱。
(3)逻辑特征法
就是其特征的选择对一类模式识别问题来说是独一无二的,即在一类问题中只有1个模式具有某1种(或某1组合的)逻辑特征,此方法律立了关于知识表示及组织,目标搜索及匹配的完整体系;对需通过众多规则的推理达到识别目标的问题,有很好的效果,但当样品有缺损,背景不清晰,规则不明确甚至有歧义时,效果不好。
(4)模糊模式方法
就是在模式识别过程中引入了模糊集的概念,由于隶属度函数作为样品与模板相似程度的量度,故能反映整体的、主要的特性,模糊模式有相当不匀称的抗干扰与畸变,从而允许样品有相当程度的干扰与畸变,但准确合理的隶属度函数往往难以建立。目前有学者在研究,并将其引入神经网络方法形成模糊神经网络识别系统。
(5)神经网络方法
就是使用人工神经网络方法实现模式识别。可处理某些环境信息十分复杂,背景知识不清楚,推理规则不明确的问题,允许样品有较大的缺损、畸变。神经网络方法的缺点是其模型在不断丰富完善中,目前能识别的模式类不够多,神经网络方法允许样品有较大的缺损和畸变,其运行速度快,自适应性能好,具有较高的分辨率。
上述几种识别方法各有特点。结构法比较直观,能较好反映事物的结构特性:问题是基元的提取很不容易,各基元的关系也比较复杂,抗干扰性能也较差。统计法用计算机来抽取特征,比较方便,抗干扰性能强;缺点是没有充分利用模式的结构特性。神经网络方法由于处理的并行性,可以快速同时处理大容量的数据,工作时具有高速度和潜在超高速,并且,网络的最终输出是由所有神经元共同作用的结果,一个神经元的错误对整体的影响很小,所以其容错性也非常的好。基于以上的考虑,本文的手写数字识别采用了神经网络的方法。
3 图像预处理与特征提取
手写体图像数据在没有进行一定的图像预处理和特征提取之前,不能立即应用到程序中进行神经网络训练和字符识别工作。从图像处理角度来说,手写体的字符识别对字符是不是有颜色是不关心的,而对此图像的清晰度是很关心的。所以在图像进行一系列的图像处理工作是很有必要的。图像的预处理是正确、有效提取图像特征的基础,有效的图像特征作为网络的输入值才能进行正确的神经网络训练和最终得到正确、有效的网络权重。
3.1 数字图像预处理
3.1.1 灰度化处理
彩色图像包含了大量的颜色信息,不但在存储上开销很大,在处理上也会降低系统的执行速度,因此在对图像进行识别等处理中经常将彩色图像转变为灰度图像,以加快处理速度。由彩色转换为灰度的过程称为灰度化处理。灰度图像就是只有强度信息而没有颜色信息的图像,存储灰度图像只需要一个数据矩阵,矩阵每个元素表示对应位置像素的灰度值。彩色图像的像素色为RGB(R,G,B),灰度图像的像素色为RGB(r,r,r) ,R,G,B可由彩色图像的颜色分解获得。而R,G,B的取值范围是0-255,所以灰度的级别只有256级。灰度化的处理方法主要有如下三种:最大值法、平均值法和加权平均值法。本文用到的加权平均值法来处理,即更换每个像素的颜色索引(即按照灰度映射表换成灰度值)。 权重选择参数为:
红:0.299
绿:0.587
蓝:0.114
例如某像素点颜色对应的灰度值计算公式为:
NewPixColor?(BYTE)(0299*Red?0.587*Green?0.114*Blue) 系统输入的源图像支持3通道或者4通道图像,支持Format24bppRgb, format32bppRgb, Format32bppArgb和Format8bppIndex这4种像素格式。
3.1.2 二值化处理
二值图像是指整幅图像画面内仅黑、白二值的图像。在数字图像处理中,二值图像占有非常重要的地位。在实际的识别系统中,进行图像二值变换的关键是要确定合适的阈值,使得字符与背景能够分割开来,二值变换的结果图像必须要具备良好的保形性,不丢掉有用的形状信息,不会产生额外的空缺等等。采用二值图像进行处理,能大大地提高处理效率。 二值化的关键在于阈值的选取,阈值的选取方法主要有三类:全局阈值法、局部阈值法、动态阈值法。全局阀值二值化方法是根据图像的直方图或灰度的空间分布确定一个阀值,并根据该阀值实现灰度图像到二值化图像的转化。全局阀值方法的优点在于算法简单,对于目标和背景明显分离、直方图分布呈双峰的图像效果良好,但对输入图像量化噪声或不均匀光照等情况抵抗能力差,应用受到极大限制。局部阀值法则是由像素灰度值和像素周围点局部
灰度特性来确定像素的阀值的。Bernsen算法是典型的局部阀值方法,非均匀光照条件等情况虽然影响整体图像的灰度分布却不影响局部的图像性质,局部阀值法也存在缺点和问题,如实现速度慢、不能保证字符笔划连通性、以及容易出现伪影现象等。动态阀值法的阀值选择不仅取决于该像素灰度值以及它周围像素的灰度值,而且还和该像素的坐标位置有关,由于充分考虑了每个像素邻域的特征,能更好的突出背景和目标的边界,使相距很近的两条线不会产生粘连现象。在图像分割二值化中,自动闽值选取问题是图像分割的关键所在。事实证明,闽值的选择的恰当与否对分割的效果起着决定性的作用。
本文采用全局阈值的方法,实现将图像二值化的功能。如果某个像素的值大于等于阈值,该像素置为白色;否则置为黑色。系统程序目前仅支持8bpp灰度图像的转换,阈值介于0~255之间,程序中取220。
3.1.3 去离散噪声
原始图像可能夹带了噪声,去噪声是图像处理中常用的手法。通常去噪用滤波的方法,比如中值滤波、均值滤波,本文中去除离散噪声点采用中值滤波的方法。中值滤波法是一种非线性平滑技术,它将每一象素点的灰度值设置为该点某邻域窗口内的所有象素点灰度值的中值,让周围的像素值接近的真实值,从而消除孤立的噪声点。
3.1.4 字符分割
在识别时系统只能根据每个字符的特征来进行判断,为了最终能准确识别手写体数字,必须将单个字符从处理后的图像中逐个提取分离出来。具体做法是将图像中待识别的字符逐个分离出来并返回存放各个字符的位置信息的链表。当把图像分割完成后,从一定意义上来说便是形成了不同的小图,每一张小图就是一个数字,才能对这些小图进行尺寸大小一致的调整。
3.1.5 细化
3.2 图像特征提取
特征提取是字符识别中的一个重要组成部分,是模式识别的核心之一。经过预处理后,根据识别方法的要求抽取图像特征,作为识别的依据。一般而言,选择的特征一方面要求能够足够代表这个图像模式,另一方面要求它们的数量尽可能少,这样能有效地进行分类和较小的计算量。特征提取的好坏会直接影响其识别的分类效果,进而影响识别率,因此特征选择是模式识别的关键。但是,目前还没有一个有效的、一般的抽取、选择特征的方法。抽取、选择特征的方法都是面对问题的,因此针对不同的识别问题往往有不止一种的抽取、选择特征的方法。
java端点识别的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于caxa无法识别端点、java端点识别的信息别忘了在本站进行查找喔。
发布于:2022-12-28,除非注明,否则均为
原创文章,转载请注明出处。