(本文仅用于学习研究图像匹配识别原理,不得用于其他用途。)
前面用的都是用的比较笨的,按像素比较的方法,属于靠感觉,没有什么理论支持的东西,效率也不高。
这里我再试试用SVM的方法。用的是libsvm的java版。
前面的步骤还是一样的,去干扰,分割。
把训练的图片缩放成16*16的大小。
把每张图片转换成libsvm的data格式
label indexi:valuei
2 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:1 15:1 16:0 17:0 18:0 19:0 20:1 21:1 。。。。
3 1:0 2:0 3:0 4:0 5:1 6:0 7:0 8:0 9:0 10:0 11:0 12:1 13:0 14:0 15:0 16:0 17:0 18:1 19:1 20:1 21:1 。。。。
前面的label就是对应的图片的数字,indexi表示第i个像素,valuei表示第i个像素的值,像素为黑是valuei为1,白则为0(更合理的方法好像是黑为0.999,白为0.001)
将转换之后的数据存到data.txt里面
然后调用libsvm的svmtrain data.txt.
这样会得到data.txt.model
svm_type c_svc
kernel_type rbf
gamma 0.00390625
nr_class 7
total_sv 187
rho -0.030305073403358983 -0.06465012487258254 -0.013473850514953143 -0.2057364574548591 0.2585742203962866 -0.022815082566896124 -0.05173711373002207 0.02684272876633484 -0.08990192422316207 0.49014282977244295 -0.007697833034227977 0.12210859964254706 -0.011622244796025883 0.29303019765332594 0.07690393951197239 -0.06284951942287494 0.4075315521524534 -0.024304015205013997 0.273659082567747 0.09997688395282468 -0.3551440654987311
label 2 3 4 5 7 8 9
nr_sv 27 32 20 26 19 39 24
SV
1.0 0.0 1.0 0.09512009049662619 1.0 1.0 1:0.0 2:0.0 3:0.0 4:0.0 5:0.0 6:0.0 7:0.0 8:0.0 9:0.0 10:0.0 11:0.0 12:0.0 13:0.0 14:1.0 15:1.0 16:0.0 17:0.0 18:0.0 19:0.0 20:1.0 21:1.0 22:1.0 23:0.0 24:0.0 25:0.0 26:0.0 27:0.0 28:1.0 29:1.0 30:1.0 31:1.0 32:1.0 33:0.0 34:0.0 35:1.0 36:1.0 37:1.0 38:1.0 39:0.0 40:0.0 41:0.0 42:0.0 43:1.0 44:1.0 45:1.0 46:1.0 47:1.0 48:0.0 49:0.0 50:0.0 51:1.0 52:1.0 53:1.0 54:1.0。。。。。。
得到model之后,把要识别的图片同样弄成libsvm的格式,存成predict.txt
label indexi:valuei
0 1:0 2:0 3:0 4:0 5:0 6:0 7:0 8:0 9:0 10:0 11:0 12:0 13:0 14:1 15:1 16:0 17:0 18:0 19:0 20:1 21:1 。。。。
因为要识别的图片还不知道是哪个数字,所以其中label可以填成任何数
然后用svmpredict predict.txt data.txt.model output.txt
这样识别结果就在output.txt里面了。