效果展示: 成功 手写一个阿拉伯数字:5,再识别,成功。 接下来,手把手教你如何完成上述效果。 环境和准备: 1本机:deepinlinux操作系统,python3。8,微软编辑器vscode。 2安装: opencvpython本机版本4。5。3 keras tensorflow本机安装sudopip3。8installihttps:pypi。tuna。tsinghua。edu。cnsimpleopencvpythonsudopip3。8installihttps:pypi。tuna。tsinghua。edu。cnsimplekerassudopip3。8installihttps:pypi。tuna。tsinghua。edu。cnsimpleupgradetensorflow 第一个文件:1train。py 这个代码是训练并生成mnistsvm。xml,估计1分钟时间用来训练。importcv2importnumpyasnpfromkeras。datasetsimportmnistfromkerasimportutilsdefmain():直接使用Keras载入的训练数据(60000,28,28)(60000,)(trainimages,trainlabels),(testimages,testlabels)mnist。loaddata()变换数据的形状并归一化trainimagestrainimages。reshape(trainimages。shape〔0〕,1)(60000,784)trainimagestrainimages。astype(float32)255testimagestestimages。reshape(testimages。shape〔0〕,1)testimagestestimages。astype(float32)255将标签数据转为int32并且形状为(60000,1)trainlabelstrainlabels。astype(np。int32)testlabelstestlabels。astype(np。int32)trainlabelstrainlabels。reshape(1,1)testlabelstestlabels。reshape(1,1)创建svm模型svmcv2。ml。SVMcreate()设置类型为SVMCSVC代表分类svm。setType(cv2。ml。SVMCSVC)设置核函数svm。setKernel(cv2。ml。SVMPOLY)设置其它属性svm。setGamma(3)svm。setDegree(3)设置迭代终止条件svm。setTermCriteria((cv2。TermCriteriaMAXITER,300,1e3))训练svm。train(trainimages,cv2。ml。ROWSAMPLE,trainlabels)保存在桌面文件夹kerashand下svm。save(homexgjDesktopkerashandmnistsvm。xml)在测试数据上计算准确率进行模型准确率的测试结果是一个元组第一个值为数据1的结果testpresvm。predict(testimages)testrettestpre〔1〕计算准确率testrettestret。reshape(1,)testlabelstestlabels。reshape(1,)testsum(testrettestlabels)acctestsum。mean()print(acc)预测准确度,0。9671ifnamemain:main() 效果图 第二个文件:2draw。py 写字板:用opencv手写数字并保存。importcv2importnumpyasnpix,iy1,1创建图像与窗口并将窗口与回调函数绑定definimg():foriinrange(512):img〔i,:〕0写字板是黑色底色cv2。namedWindow(image)cv2。setMouseCallback(image,drawcircle)while(1):cv2。imshow(image,img)ifcv2。waitKey(20)0xFFord(q):按q退出并保存rescv2。resize(img,(28,28),interpolationcv2。INTERCUBIC)rescv2。resize(img,(28,28))注意这里大小是28默认就是cv。INTERLINEAR,用来缩小的cv。INTERCUBIC(slow)cv。INTERLINEAR用来放大注意保存地址是同名文件夹cv2。imwrite(homexgjDesktopkerashandres。jpg,res)breakcv2。destroyAllWindows()defdrawcircle(event,x,y,flags,param):globalix,iy,drawingifeventcv2。EVENTLBUTTONDOWN:drawingTrueix,iyx,yelifeventcv2。EVENTMOUSEMOVEandflagscv2。EVENTFLAGLBUTTON:ifdrawingTrue:cv2。circle(img,(x,y),30,(255,255,255),1)书写的是白色字elifeventcv2。EVENTLBUTTONUP:drawingFalsedefmain():globalimgimgnp。zeros((512,512,3),np。uint8)本质是创建了一个512x512x3的0矩阵,用于存储512x512的3通道图像,数据类型为uint8。inimg()ifnamemain:main() 第三个文件:3main。py 主文件,用来自己已经训练好的mnistsvm。xml,来识别自己手写的阿拉伯数字。importcv2importnumpyasnpdefmain():读取图片imgcv2。imread(homexgjDesktopkerashandres。jpg,0)imgswimg。copy()将数据类型由uint8转为float32imgimg。astype(np。float32)图片形状由(28,28)转为(784,)imgimg。reshape(1,)增加一个维度变为(1,784)imgimg。reshape(1,1)图片数据归一化imgimg255载入svm模型svmcv2。ml。SVMload(homexgjDesktopkerashandmnistsvm。xml)进行预测imgpresvm。predict(img)print(imgpre〔1〕)cv2。imshow(test,imgsw)cv2。waitKey(0)ifnamemain:main() 小结: 识别成功率比较高的有5,7,1。其他可能与自己手写的有关,还可以继续改善。