图像识别--Java中使用openCV提取Hog特征通过SVM训练实现图像识别

图像识别大致可以分为这么几步:

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
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值