图像识别大致可以分为这么几步:
1.对训练图片进行预处理
2.对预处理的图片进行Hog特征提取
3.使用SVM分类器对特征进行分类形成模型
4.根据模型对测试图片进行预测
以下都是通过openCV实现(若直接使用openCV提取Hog特征可直接跳过预处理阶段直接看Hog特征提取阶段):
预处理阶段:
1.图像的灰度化处理
Imgproc.cvtColor(imageMat, imageMat, Imgproc.COLOR_RGB2GRAY);
2.灰度化的图片进行gamma校正
int width = imageMat.cols();
int height = imageMat.rows();
byte[] data = new byte[width * height];
imageMat.get(0, 0, data);
int index = 0;
float i = 0;
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
index = row * width + col;
i = data[index] & 0xff;
//归一化
i = (i + 0.5F) / 256;
//预补偿
i = (float) Math.pow(i, gamma);
//反归一化
i = i * 256 - 0.5F;
data[index] = (byte) i;
}
}
imageMat.put(0, 0, data);
3.计算图像梯度
Mat gradientImage = new Mat(imageMat.rows(), imageMat.cols(), imageMat.type());
Mat gradientImageX = new Mat();
Mat gradientImageY = new Mat();
Imgproc.Sobel(imageMat, gradientImageX, CvType.CV_64F, 1, 0, 1, 1, 1);
Imgproc.Sobel(imageMat, gradientImageY, CvType.CV_64F, 0, 1, 3, 1, 0);
// Imgproc.Sobel(src, gradientImage, CvType.CV_64F, 1, 1, 3, 1, 0);
int width = imageMat.cols();
int height = imageMat.rows();
int index = 0;
double[] dataGradient = new double[width * height];
double[] dataGradientX = new double[width * height];
double[] dataGradientY = new double[width * height];
gradientImageX.get(0, 0, dataGradientX);
gradientImageY.get(0, 0, d