opencv-特征值检测和匹配

图像的特征值

图像的特征值简单理解就是边缘,角点,纹理等

角点
在图像的边缘中,有一些特殊的像素点值得我们特别关注,那就是图像边缘的角点,角点更好反应图像中对象的整体特征

Harris角点检测

 private void harrisCornerDemo(Mat src, Mat dst) {
        // 定义阈值T
        int threshold = 100;
        Mat gray = new Mat();
        Mat response = new Mat();
        Mat response_norm = new Mat();

        // 角点检测
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
        Imgproc.cornerHarris(gray, response, 2, 3, 0.04);
        Core.normalize(response, response_norm, 0, 255, Core.NORM_MINMAX, CvType.CV_32F);

        // 绘制角点
        dst.create(src.size(), src.type());
        src.copyTo(dst);
        float[] data = new float[1];
        for(int j=0; j<response_norm.rows(); j++ )
        {
            for(int i=0; i<response_norm.cols(); i++ )
            {
                response_norm.get(j, i, data);
                if((int)data[0] > 100)
                {
                    Imgproc.circle(dst, new Point(i, j), 5,  new Scalar(0, 0, 255), 2, 8, 0);
                    Log.i("Harris Corner", "find corner point...");
                }
            }
        }
        gray.release();
        response.release();
    }

在这里插入图片描述
Shi-Tomasi角点检测

private void shiTomasicornerDemo(Mat src, Mat dst) {
        // 变量定义
        double k = 0.04;
        int blockSize = 3;
        double qualityLevel= 0.01;
        boolean useHarrisCorner = false;

        // 角点检测
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
        MatOfPoint corners = new MatOfPoint();
        Imgproc.goodFeaturesToTrack(gray, corners, 100, qualityLevel, 10, new Mat(), blockSize, useHarrisCorner, k);

        // 绘制角点
        dst.create(src.size(), src.type());
        src.copyTo(dst);
        Point[] points = corners.toArray();
        for(int i=0; i<points.length; i++) {
            Imgproc.circle(dst, points[i], 5,  new Scalar(0, 0, 255), 2, 8, 0);
        }
        gray.release();
    }

在这里插入图片描述
AKAZE检测器与描述子
AKAZE特征算法是SIFT特征算法的一种改进版本,但不使用高斯模糊来构建尺度空间,因为高斯模糊具有丢失边缘信息的缺点,进而采用非线性扩散滤波来构建尺度空间,从而保留图像更多的边缘特征。
在这里插入图片描述

private void detectorDemo(Mat src, Mat dst, int type) {
        FeatureDetector detector = null;
        if(type == 1) {
            detector = FeatureDetector.create(FeatureDetector.ORB);
        } else if(type == 2) {
            detector = FeatureDetector.create(FeatureDetector.BRISK);
        } else if(type == 3) {
            detector = FeatureDetector.create(FeatureDetector.FAST);
        } else if(type == 4){
            detector = FeatureDetector.create(FeatureDetector.AKAZE);
        } else {
            detector = FeatureDetector.create(FeatureDetector.HARRIS);
        }
        MatOfKeyPoint keyPoints = new MatOfKeyPoint();
        detector.detect(src, keyPoints);
        Features2d.drawKeypoints(src, keyPoints, dst);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值