基于VC++手写数字识别程序设计_第1页
基于VC++手写数字识别程序设计_第2页
基于VC++手写数字识别程序设计_第3页
基于VC++手写数字识别程序设计_第4页
基于VC++手写数字识别程序设计_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-2"\h\z\u1、摘要12、原理22.1、图像的二值化处理22.2、模板匹配法22.3、图像的特征提取33、系统设计43.1、主界面43.2、图像绘制63.3、特征提取63.4、学习73.5、识别83.6、去除94、系统调试95、心得体会116、参考文献12附录:131、摘要自上世纪六十年代以来,计算机视觉与图像处理越来越受到人们的关注,并逐渐成为一门重要的学科领域。而作为它们的研究对象的数字图像,也因为它含有研究目标的丰富信息而成为越来越重要的研究对象。图像识别的目标是用计算机自动完成某些信息的处理,用来替代人工去处理图像分类及识别的任务。手写数字识别是图像识别学科下的一个分支,是图像处理和模式识别领域研究的课题之一,由于其具有很强的实用性一直是多年来的研究热点。由于手写体数字的随意性很大,例如,笔画的粗细,字体的大小,倾斜等等都直接影响到字符的正确识别,所以手写体数字识别是一个很有挑战性的课题。在过去的数十年中,研究者们提出了许多的识别方法,取得了较大的成果。手写体数字识别实用性很强,在大规模数据统计(如例行年检,人口普查),财务,税务,邮件分拣等等应用领域中都有广阔的应用前景。本课题拟研究手写体数字识别的理论和方法,开发一个小型的手写体数字识别系统。本次设计主要完成以下几个工作:手写数字绘制问题、数字的预处理问题、特征提取问题、特征库的建立问题、数字识别问题。关键词:绘制数字;预处理;特征提取;特征库;数字识别2、原理本次设计主要用到图像的二值化处理、图像特征提取和模板匹配法三个知识点,下面将对这三个知识点进行简单介绍:2.1、图像的二值化处理图像的二值化处理就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。在手写数字识别系统中,我们在VC可视化编程界面中在一个固定大小的控件中手写了一个数字,在程序中获得的只是以这个控件左上角为原点的一系列坐标。在内存中我们开辟一个大小跟这个控件区域大小相同的二维数组(以像素为单位,即生成一张图片的长跟宽跟这个矩形区域相等),这样内存中图像的数据区域的二维数组就跟手写区域的坐标相同,我们再取出手写区域的坐标值,将这些坐标值对应到图像图像数据区域中,并且将它的灰度值置为255(白色),将图像数据区域的其它坐标值下的灰度值置为0(黑色),这样我们就得到了一张手写数字的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。2.2、模板匹配法模板匹配法是图像识别中最具有代表性的方法之一。它是将从待识别的图像提取的假设干特征量与模板对应的特征量进行比拟,计算图像和模板特征量之间的距离,用最小距离法判定所属类。模板匹配通常事先建立标准模板库。这里,模板库中的标准模板是数字样本的特征向量。具体过程是:对于一个待测试的样本X,计算X和训练集中的某样本Xj〔0<j<m,m为训练集中的样本数〕之间的距离。循环计算待测样本和训练集中各样本之间的距离,比拟所有的距离值,找出距离待测样本最近的样本,其中所对应的样本所属的类别就是待测样本X所属的类别。2.3、图像的特征提取假设直接把预处理后的数据作为输入量,进行分类计算时数据时数据量大,同时由于手写字体的多样化及图像本身和预处理过程中附带的某些干扰的影响,对系统的容错能力要求较高。特征提取的目的就是从分析数字的拓扑结构入手,把它的某些结构特征提取出来,使数字的位移、大小变化、字形畸形等干扰相对较小,也就是把那些反映数字特征的关键信息提供应系统,这样就等于间接地增加了系统的容错能力,而且经过特征提取后数据量也大大减少了,这样就提高了识别的效率。手写数字识别的特征提取极大程度地影响着分类器的设计和性能,以及识别的效果和效率。为了保证所要求的分类识别的正确率和节省资源,希望依据最少的特征到达所要求的分类识别的正确率。在进行手写数字识别的过程中,特征提取应遵循以下原那么:特征应能尽量包含字符的有用信息。特征的提取方法应简单而且提取快速。各个特征之间的相关性应尽可能小。特征数量尽可能少。特征应有较好的抗干扰能力。3、系统设计本系统主要包括了主界面、图像绘制、特征提取、学习、识别、去除六个模块,其总框图如图3.0所示:主界面去除识别学习特征提取图像绘制主界面去除识别学习特征提取图像绘制图3.0系统总框图以下是各模块详细设计:3.1、主界面主界面主要由绘图区,学习、识别和去除三个按钮构成,通过调用VC++库里的CBrush、CRect、CBitmap来进行相关操作,学习、识别和去除三个按钮首先通过建立三个CBitmap类,通过位图将其画出来,如图、、所示;再建立一个SPLASH类,最后通过程序来设计总界面,如下图:图3.1.1学习按钮图3.1.2识别按钮图3.1.3去除按钮图3.1.4总界面3.2、图像绘制图像的绘制主要是按下鼠标左键、拖动鼠标、放开鼠标左键这样一个过程,本次设计通过OnLButtonDown()〔鼠标左键按下函数〕、OnMouseMove()〔鼠标移动函数〕、OnLButtonUp()〔鼠标左键放开函数〕来实现图像的绘制,流程图如图3.2所示:结束放开鼠标左键,执行OnLButtonUp()拖动鼠标,执行OnMouseMove()按下鼠标左键,执行OnLButtonDown结束放开鼠标左键,执行OnLButtonUp()拖动鼠标,执行OnMouseMove()按下鼠标左键,执行OnLButtonDown()将鼠标放在绘图区域图3.2图像绘制流程图3.3、特征提取本模块首先要创立一个结构体变量来表示所绘图形的各种特征,比方value〔手写数字值〕、VHDerection〔水平垂直特征〕、length1〔第一个笔画长度〕等等,具体情况看附录->程序清单里的特征提取函数,每个特征的提取如图3.3流程图所示:开始求lenth的值求lenend的值求lenfirst的值通过switch语句选出不同水平垂直特征值执行相对应case语句,mytezheng->lenth++1开始求lenth的值求lenend的值求lenfirst的值通过switch语句选出不同水平垂直特征值执行相对应case语句,mytezheng->lenth++1mytezheng->lenth=1求出两个相邻点p求出两个相邻点p和q的距离mytezheng->decon=1,mytezheng->decon=1,判断相邻两点x、y的大小,分别给出不同的水平垂直特征值0(p>1)||(q>1)0(p>1)||(q>1)判断1、判断1、0两点x、y的大小,分别给出不同的水平垂直特征值mytezheng->lenth=110j==010j==0结束结束图3.3特征提取流程图3.4、学习首先点击学习按钮,判断当前写入数值是否已在模板中,随后出现输入学习值对话框,提取特征值,最后存入模板,如图3.4所示:存在不存在结束点击学习按钮判断当前值是否存在模板中显示模板中已存有该值存入模板提取特征值存在不存在结束点击学习按钮判断当前值是否存在模板中显示模板中已存有该值存入模板提取特征值图3.4学习流程图3.5、识别识别过程就相当于一个查询过程,首先点击识别按钮,然后提取特征值,将特征值与模板一一比照,假设有那么显示其值,假设无那么显示无法识别,如图3.5所示:无有显示识别出的值结束显示无法识别逐一比照提取特征值点击识别按钮无有显示识别出的值结束显示无法识别逐一比照提取特征值点击识别按钮图3.5识别流程图3.6、去除去除最为简单,把绘图区域的每个点设置为白点,即二值图像中灰度值都变为255,流程如图3.6所示:结束绘图区每个点设置为白色点击去除按钮结束绘图区每个点设置为白色点击去除按钮图3.6去除流程图4、系统调试运行程序后,会出现如下图的图样,然后往绘图区写一个2,然后点击学习按钮,出现如图4.1所示图样,说明所写数字已存在模板中。图4.1学习调试点击确定后点击去除按钮,再输入一个8,如图4.2所示,这次就跟之前不一样了,说明模板库里没有刚刚写入的数字,然后往两个编辑框里都输入8以后点击OK,这样就完成了学习的功能。图4.2学习调试点击去除之后,往绘图区写入一个4,如图4.3所示说明识别成功。图4.3识别调试去除调试只要点击去除按钮,它就会弹出图的样子。识别率如表4.1:数字测试次数正确次数识别率0201680%1201995%2201890%3201890%4201785%5201365%6201680%7201995%820945%9201785%表4.1识别率统计分析:从表中可以看出8和5较难识别,因为其特征不太好提取,特征比拟多样化,所以需要大量的学习,丰富模板库,这样可以提高识别率。5、心得体会本文对基于VC++6.0的手写数字识别系统的根本原理及方法进行了介绍。手写体数字识别是一个极具研究价值的课题,手写数字的样品类别总共只有0一9十类,与其它的大字符集的识别(汉字识别)相比要相对容易。本文所采用的模板匹配分类器既节省时间,简便易行,也可以到达较高地识别效果。但是在系统的设计上由于时间的限制导致系统界面的设计不够美观,特征训练不够导致识别率不够高。手写体数字的特征提取是一个非常复杂的问题,可以考虑在识别的时候使用有监督的识别方法,这样在识别的同时可以更新特征库,这里所说的更新是把导致识别错误的模板替换掉这样出错的几率就会越来越小从而使特征库越来越完善,进一步提高识别的准确度。6、参考文献〔1〕张立凡等著.手写数字识别系统设计.北京:印刷学院学报,2023年04期.〔2〕冯伟兴著.VisualC++数字图像模式识别技术详解.北京:机械工业出版社,2023年9月.〔3〕张宏林著.精通VisualC++数字图像模式识别技术及工程实践.北京:人民邮电出版社,2023年8月.〔4〕章毓晋著.图像工程〔中册〕图像分析〔第二版〕.北京:清华大学出版社,2023年7月.〔5〕谢凤英著.VisualC++数字图像处理.北京:电子工业出版社,2023年5月.附录:程序清单:1、初始化程序CPatternView::CPatternView(){//TODO:addconstructioncodehere mouseDown=0;//初始化,使得每个点皆为白点 for(inti=0;i<16;i++) for(intj=0;j<16;j++) bitgraph[i][j]=0;//初始化,使得坐标序列中的点皆为空点 mytime=0; for(i=0;i<100;i++){ mypoint[i].x=-1; mypoint[i].y=-1; }mytime=0; curvalue=-1; mytezheng=(TEZHENG*)malloc(sizeof(TEZHENG)); mytezheng->value=-1; mytezheng->lenth=0; mytezheng->lenth1=0; for(i=0;i<15;i++) mytezheng->VHDerection[i]=-1; mytezheng->decon=0;//翻开保存模板特征量的文件 if(cf.Open("mydata.dat",CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite)==NULL){ AfxMessageBox("翻开文件失败,\n您最好退出程序"); }}2、创立主界面程序voidCPatternView::OnDraw(CDC*pDC){CPatternDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc);/*ASSERT_VALID是一个断定宏,如果pDoc为NULL就不继续运行*///TODO:adddrawcodefornativedatahere//Erasethebackground//创立一个面色刷 CBrushBrush(RGB(128,0,0));/*CBrush是封装了Windows图形设备接口〔GDI〕中画刷的MFC类,用于构造CBrush对象,然后传给需要画刷的CDC成员函数*/CBrush*pOldBrush=pDC->SelectObject(&Brush);//选择刷到设备上下文//Gettheareathatneedstobeerased(擦除〕. CRectrcClip;//CRect从tagRECT结构派生而来 pDC->GetClipBox(&rcClip);/*该函数得到一个能够完整包含当前可见区域的最小矩形的大小*/ //Paintthearea. pDC->PatBlt(rcClip.left,rcClip.top,rcClip.Width(),rcClip.Height(),PATCOPY);//使用当前选入指定设备环境中的刷子绘制给定的矩形区域pDC->SelectObject(pOldBrush);//取消选择刷出设备上下文//三个模拟位图按钮 CBitmapbitmapstudy,bitmaprecognize,bitmapclear;/*类CBitmap封装了Windows图形设备接口〔GDI〕中的位图*/CDCdcMemory1,dcMemory2,dcMemory3;/*通过CDC对象的成员函数进行所有的绘图*/bitmapstudy.LoadBitmap(IDB_BITMAP_STUDY);/*从模块的可执行文件中加载IDB_BITMAP_STUDY位图资源*/dcMemory1.CreateCompatibleDC(pDC);/*创立一个与PDC兼容的内存设备上下文环境〔DC〕*/dcMemory1.SelectObject(&bitmapstudy);/*选择bitmapstudy到dcMemory1的上下文环境中*/pDC->BitBlt(220,20,50,20,&dcMemory1,0,0,SRCCOPY);/*对&dcMemory1中的像素进行位块转换,以传送到目标设备环境*/bitmaprecognize.LoadBitmap(IDB_BITMAP_RECOGNIZE);dcMemory2.CreateCompatibleDC(pDC);dcMemory2.SelectObject(&bitmaprecognize);pDC->BitBlt(220,80,50,20,&dcMemory2,0,0,SRCCOPY);bitmapclear.LoadBitmap(IDB_BITMAP_CLEAR);dcMemory3.CreateCompatibleDC(pDC);dcMemory3.SelectObject(&bitmapclear);pDC->BitBlt(220,140,50,20,&dcMemory3,0,0,SRCCOPY);//画板 CBrushBrushBoard(RGB(255,255,255)); //Selectthebrushintothedevicecontext. pOldBrush=pDC->SelectObject(&BrushBoard); //Paintthearea. pDC->PatBlt(8,8,176,240,PATCOPY); //UnselectbrushoutofdevicecontextpDC->SelectObject(pOldBrush);pDC->SetTextColor(RGB(255,255,255));//设置当前环境(HDC)的字体颜色pDC->SetTextAlign(TA_CENTER|TA_TOP);//指定设备环境设置文字对齐标志pDC->SetBkMode(TRANSPARENT);/*TRANSPARENT是使用透明的输出,也就是文字的背景是不改变的*/}3、学习程序voidCPatternView::OnStudy(void){//输入数字值的对话框 InputDialoginputdlg; cf.SeekToBegin();//定位当前文件指针到文件开头 intnFileSize=cf.GetLength();//获取文件长度 inti=nFileSize/sizeof(TEZHENG); TEZHENG*temp; temp=(TEZHENG*)malloc(sizeof(TEZHENG));//计算当前画板中数字的特征值 GetTeZheng();//首先判断当前的数字类型是否已经在模板中 for(intj=0;j<i;j++){ cf.Read((void*)temp,sizeof(TEZHENG));//从文件cf的当前位置读数据 for(intk=0;k<15;k++){if(temp->VHDerection[k]!=mytezheng->VHDerection[k])//判断水平特征 break; } if((k==15)&&(temp->decon==mytezheng->decon)&&(temp->lenfirst==mytezheng->lenfirst)&&(temp->lenth1==mytezheng->lenth1)&&(temp->lenth==mytezheng->lenth)&&(temp->lenend==mytezheng->lenend)){ chars[20]; sprintf(s,"您输入的是:%d,数据已有",temp->value); AfxMessageBox(s); break; } } //说明该数字类型不在模板中 if(j==i){ if(inputdlg.DoModal()==IDOK){ //判断数字输入对话框中的两个数字是否相同 if(inputdlg.m_value1!=inputdlg.m_value2){ AfxMessageBox("您的输入有误,\n请重新输入"); } //相同,那么将新的数字类型写入模板文件中 else{ GetTeZheng(); try{mytezheng->value=inputdlg.m_value1;cf.SeekToEnd();//定位当前文件指针到文件尾cf.Write(&mytezheng->value,sizeof(signedchar));//将文件数据写入当前文件位置cf.Write(mytezheng->VHDerection,sizeof(signedchar)*15);cf.Write(&mytezheng->lenth1,sizeof(signedchar));cf.Write(&mytezheng->lenth,sizeof(signedchar));cf.Write(&mytezheng->decon,sizeof(signedchar));cf.Write(&mytezheng->lenfirst,sizeof(signedchar));cf.Write(&mytezheng->lenend,sizeof(signedchar)); } catch(CFileException*e){ //Alertusertoerror e->Delete(); }//endtry-catch }//endif-else }//endif }//endifreturn;}4、识别程序voidCPatternView::OnRecognize(void){cf.SeekToBegin(); intnFileSize=cf.GetLength(); inti=nFileSize/sizeof(TEZHENG); TEZHENG*temp; temp=(TEZHENG*)malloc(sizeof(TEZHENG)); //计算特征值 GetTeZheng();//在模板文件中寻找,是否有与当前特征值相同的 for(intj=0;j<i;j++){ cf.Read((void*)temp,sizeof(TEZHENG)); for(intk=0;k<15;k++){ if(temp->VHDerection[k]!=mytezheng->VHDerection[k]) break; } //找到识别结果if((k==15)&&(temp->decon==mytezheng->decon)&&(temp->lenfirst==mytezheng->lenfirst)&&(temp->lenth1==mytezheng->lenth1)&&(temp->lenth==mytezheng->lenth)&&(temp->lenend==mytezheng->lenend)){ chars[20]; sprintf(s,"您输入的是:%d",temp->value); AfxMessageBox(s); break;//搜索结束 } } if(j==i){ AfxMessageBox("抱歉,无法识别"); }return;}5、去除程序voidCPatternView::OnClear(void){CDC*pDC=GetDC();/*检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图*/CBrushBrushBoard(RGB(255,255,255)); CBrushpOldBrush; pDC->PatBlt(8,8,176,240,PATCOPY);for(inti=0;i<16;i++) for(intj=0;j<16;j++) bitgraph[i][j]=0;mouseDown=0; mytime=0; for(i=0;i<100;i++){ mypoint[i].x=-1; mypoint[i].y=-1; } curvalue=-1; mytezheng->value=-1; mytezheng->lenth=0; mytezheng->lenth1=0; for(i=0;i<15;i++) mytezheng->VHDerection[i]=-1; mytezheng->decon=0;return;}6、特征提取程序voidCPatternView::GetTeZheng(){intp,q; inti=0; //从第一个点到最后一个点 for(intj=0;j<mytime-1;j++){ if(i==0){mytezheng->lenth1++;} if(i>=13){AfxMessageBox("内存溢出,呵呵",NULL,NULL); return;}//判断两个相邻点的距离 p=(mypoint[j+1].x-mypoint[j].x)*(mypoint[j+1].x-mypoint[j].x); q=(mypoint[j+1].y-mypoint[j].y)*(mypoint[j+1].y-mypoint[j].y); //如果不是8连接,那么为断裂点或者是写的太快 if((p>1)||(q>1)){mytezheng->decon=1; j++;i++;if(j+1>mytime-1){AfxMessageBox("您可能写得太快了,呵呵",NULL,NULL); return;} if(mypoint[j+1].x>mypoint[j].x) mytezheng->VHDerection[i]=1; elseif(mypoint[j+1].y>mypoint[j].y) mytezheng->VHDerection[i]=2; elseif(mypoint[j+1].x<mypoint[j].x) mytezheng->VHDerection[i]=3; elsemytezheng->VHDerection[i]=4; mytezheng->lenth=1;}//尽量保持目前的方向 else{if(j==0){if(mypoint[1].x>mypoint[0].x) mytezheng->VHDerection[0]=1; elseif(mypoint[1].y>mypoint[0].y) mytezheng->VHDerection[0]=2; elseif(mypoint[1].x<mypoint[0].x) mytezheng->VHDerection[0]=3; elsemytezheng->VHDerection[0]=4; mytezheng->lenth=1;}//endif else{switch(mytezheng->VHDerection[i]){ case1:if(mypoint[j+1].x<=mypoint[j].x){ i++; mytezheng->lenth=1; if(mypoint[j+1].y>mypoint[j].y) mytezheng->VHDerection[i]=2; elseif(mypoint[j+1].y<mypoint[j].y) mytezheng->VHDerection[i]=4; elsemytezheng->VHDerection[i]=3;} elsemytezheng->lenth++; break; case2:if(mypoint[j+1].y<=mypoint[j].y){ i++; mytezheng->lenth=1; if(mypoint[j+1].x<mypoint[j].x) mytezheng->VHDerection[i]=3; elseif(mypoint[j+1].x>mypoint[j].x) mytezheng->VHDerection[i]=1; elsemytezheng->VHDerection[i]=4;} elsemytezheng->lenth++; break; case3:if(mypoint[j+1].x>=mypoint[j].x){ i++; mytezheng->lenth=1; if(mypoint[j+1].y<mypoint[j].y) mytezheng->VHDerection[i]=4; elseif(mypoint[j+1].y>mypoint[j].y) mytezheng->VHDerection[i]=2; elsemytezheng->VHDerection[i]=1;} elsemytezheng->lenth++; break; case4:if(mypoint[j+1].y>=mypoint[j].y){ i++; mytezheng->lenth=1; if(mypoint[j+1].x>mypoint[j].x) mytezheng->VHDerection[i]=1; elseif(mypoint[j+1].x<mypoint[j].x) mytezheng->VHDerection[i]=3; elsemytezheng->VHDerection[i]=2;} elsemytezheng->lenth++; break; default: break; }//endswitch }//endelse }//endelse }//endfor for(p=0;p<4;p++){ for(q=p+1;q<mytime;q++){ if(mypoint[p]==mypoint[q]) break;} if(q<mytime) break;} if(p>=4) mytezheng->lenfirst=2; else mytezheng->lenfirst=1;for(p=mytime-1;p>mytime-6;p--){ for(q=p-1;q>=0;q--){ if(mypoint[p]==mypoint[q]) break;} if(q>=0) break;} if(p<=mytime-6) mytezheng->lenend=2; elsemytezheng->lenend=1;if((mytezheng->lenth)>0&&(mytezheng->lenth)<=4) mytezheng->lenth=1; elsemytezheng->lenth=2;if(mytezheng->lenth1>=4) mytezheng->lenth1=2; elsemytezheng->lenth1=1;}7、鼠标左键按下程序voidCPatternView::OnLButtonDown(UINTnFlags,CPointpoint){mouseDown=1; if((point.x>=220)&&(point.x<270)&&(point.y>=20)&&(point.y<40)){ OnStudy();}if((point.x>=220)&&(point.x<270)&&(point.y>=80)&&(point.y<100)){ OnRecognize();}if((point.x>=220)&&(point.x<270)&&(point.y>=140)&&(point.y<160)){ OnClear();}CView::OnLButtonDown(nFlags,point);}8、鼠标移动程序voidCPatternView::OnMouseMove(UINTnFlags,CPointpoint){//TODO:Addyourmessagehandlercodehereand/orcalldefaultCDC*pDC=GetDC();/*检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图*/ CRgnRgn;//CRgn类封装了一个Windows图形设备接口〔GDI〕区域//限制在输入区域的范围内 Rgn.CreateRectRgn(startX,startY,startX+stepX*16-1,s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论