在OpenCV里使用SVM识别手写数字

前面使用了kNN算法来识别手写数字,我们是直接把数字的灰度值大小作为特征值来学习。而这里要使用SVM算法,是否也可以使用灰度值来做呢?对于SVM算法来说,可能要采用另外一个特征方式,叫做梯度方向直方图HOG(Histogram of Oriented Gradients)。如果对HOG不是很了解,可以参考下面连接的文章:

https://blog.csdn.net/sinat_34474705/article/details/80219617

在我们计算HOG之前,要做一件事情,就是把所有手写的图片进行角度校正,因此要使用图像的矩计算,并且用它第二项值,所以定义函数deskew()如下:

def deskew(img):

    m = cv.moments(img)

    if abs(m['mu02']) < 1e-2:

        return img.copy()

    skew = m['mu11']/m['mu02']

    M = np.float32([[1, skew, -0.5*SZ*skew], [0, 1, 0]])

    img = cv.warpAffine(img,M,(SZ, SZ),flags=affine_flags)

你可能感兴趣的:(OpenCV)