代码示例一:

#include<opencv2/opencv.hpp>
using namespace cv;

int main(){
    Mat src = imread();
    imshow("原始图", src);

    //进行Harris角点检测找出角点
    Mat cornerStrength;
    cornerHarris(src, cornerStrength, , , 0.01);

    //对灰度图进行阈值操作,得到二值图并显示
    Mat harrisCorner;
    threshold(cornerStrength, harrisCorner, , THRESH_BINARY);
    imshow("二值效果图",harrisCorner);

    waitKey();
    ;
}

效果:

代码示例二:

#include<opencv2/opencv.hpp>
using namespace cv;

#define WINDOW_NAME1 "窗口1"
#define WINDOW_NAME2 "窗口2"

Mat src,srcClone,gray;
;
;

//函数声明
void onCornerHarris(int, void*);//回调函数

int main(){
    src = imread();
    imshow("原始图", src);
    srcClone = src.clone();
    cvtColor(srcClone, gray, COLOR_BGR2GRAY);

    //创建窗口和滚动条
    namedWindow(WINDOW_NAME1, WINDOW_AUTOSIZE);
    createTrackbar("阈值:", WINDOW_NAME1, &thresh, max_thresh, onCornerHarris);
    //调用一次回调函数进行初始化
    onCornerHarris(, );

    waitKey();
    ;
}

void onCornerHarris(int, void*){
    Mat dstImage;//目标图
    Mat normImage;//归一化后的图
    Mat scaledImage;//线性变换后的8位无符号整形图

    //初始化
    dstImage = Mat::zeros(src.size(), CV_32FC1);
    srcClone = src.clone();

    //进行角点检测
    cornerHarris(gray, dstImage, , , 0.04, BORDER_DEFAULT);
    //归一化与转换
    normalize(dstImage, normImage, , , NORM_MINMAX, CV_32FC1, Mat());
    convertScaleAbs(normImage, scaledImage);

    //绘制:将检测到的,符合阈值条件的角点绘制出来
    ; j < normImage.rows; j++){
        ; i < normImage.cols; i++){
            ){
                circle(srcClone, Point(i, j), , Scalar(, , ), , , );
                circle(scaledImage, Point(i, j), , Scalar(, , ), , , );
            }
        }
    }

    imshow(WINDOW_NAME1, srcClone);
    imshow(WINDOW_NAME2, scaledImage);
}

效果:

代码示例三:

#include<opencv2/opencv.hpp>
using namespace cv;
#include<vector>
using namespace std;
class HarrisDetector{
private:
    //表示角点强度的32位浮点图像
    Mat cornerStrength;
    //阈值化后的32位浮点图像
    Mat cornerTh;
    //局部极大值图像(内部)
    Mat localMax;
    //导数平滑的相邻像素的尺寸
    int neighbourhood;
    //梯度计算的孔径大小
    int aperture;
    //Harris参数
    double k;
    //harris计算的最大强度
    double maxStrength;
    //计算得到的阈值(内部)
    double threshold;
    //非极大值抑制的相邻像素的尺寸
    int nonMaxSize;
    //非极大值抑制的核
    Mat kernel;

public:
    HarrisDetector() :neighbourhood(), aperture(),
        k(0.01), maxStrength(0.0),
        threshold(){
        //创建非极大值抑制的核

    }

    void detect(const Mat& image){
        //harris计算
        cornerHarris(image, cornerStrength, neighbourhood, aperture, k);
        //内部阈值计算
        double minStrength;//未使用
        minMaxLoc(cornerStrength, &minStrength, &maxStrength);
        //局部极大值检测
        Mat dilated;//临时图像
        dilate(cornerStrength, dilated, Mat());
        compare(cornerStrength, dilated, localMax, CMP_EQ);
    }

    Mat getCornerMap(double qualityLevel){
        Mat cornerMap;
        //对角点图像进行阈值化
        this->threshold = qualityLevel*maxStrength;
        cv::threshold(cornerStrength, cornerTh, threshold, , THRESH_BINARY);
        //转换为8位图像
        cornerTh.convertTo(cornerMap,CV_8U);
        //非极大值抑制
        bitwise_and(cornerMap, localMax, cornerMap);
        return cornerMap;
    }

    void getCorners(vector<cv::Point>& points,double qualityLevel){
        //得到角点图
        cv::Mat cornerMap = getCornerMap(qualityLevel);
        getCorners(points, cornerMap);
    }

    void getCorners(vector<cv::Point>& points, const Mat& cornerMap){
        //遍历像素得到所有特征
        ; y < cornerMap.rows; y++){
            const uchar* rowPtr = cornerMap.ptr <uchar>(y);
            ; x < cornerMap.cols; x++){
                //如果是特征点
                if (rowPtr[x]){
                    points.push_back(cv::Point(x, y));
                }
            }
        }
    }

    //在特征点的位置绘制圆
    ,,), , ){
        vector<cv::Point>::const_iterator it = points.begin();
        while (it != points.end()){
            cv::circle(image, *it, radius, color, thickness);
            ++it;
        }
    }
};

int main(){
    Mat src = imread();
    //HarrisDetector类使用方式
    HarrisDetector harris;
    harris.detect(src);
    std::vector<cv::Point> pts;
    harris.getCorners(pts, 0.1);
    harris.drawOnImage(src, pts);
    imshow("result", src);
    waitKey();
}

效果:

Harris角点检测的更多相关文章

  1. Harris角点检测算法优化

    Harris角点检测算法优化 一.综述 用 Harris 算法进行检测,有三点不足:(1 )该算法不具有尺度不变性:(2 )该算法提取的角点是像素级的:(3 )该算法检测时间不是很令人满意. 基于以上 ...

  2. Harris 角点检测

    一 .Motivation 对于做图像处理的人来说,Harris角点检测肯定听过,1988年发表的文章"A combined corner and edge detector"描述 ...

  3. Harris角点检测算原理

    主要参考了:http://blog.csdn.net/yudingjun0611/article/details/7991601  Harris角点检测算子 本文将该文拷贝了过来,并做了一些数学方面的 ...

  4. Harris角点检测原理分析

    看到一篇从数学意义上讲解Harris角点检测很透彻的文章,转载自:http://blog.csdn.net/newthinker_wei/article/details/45603583 主要参考了: ...

  5. cv2.cornerHarris()详解 python+OpenCV 中的 Harris 角点检测

    参考文献----------OpenCV-Python-Toturial-中文版.pdf 参考博客----------http://www.bubuko.com/infodetail-2498014. ...

  6. Opencv学习笔记------Harris角点检测

    image算法测试iteratoralgorithmfeatures 原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/73 ...

  7. harris角点检测的简要总结

    目录 1. 概述相关 2. 原理详解 1) 算法思想 2) 数学模型 3) 优化推导 3. 具体实现 1) 详细步骤 2) 最终实现 4. 参考文献 1. 概述相关 harris角点检测是一种特征提取 ...

  8. OpenCV-Python:Harris角点检测与Shi-Tomasi角点检测

    一.Harris角点检测 原理: 角点特性:向任何方向移动变换都很大. Chris_Harris 和 Mike_Stephens 早在 1988 年的文章<A CombinedCorner an ...

  9. 第十一节、Harris角点检测原理(附源码)

    OpenCV可以检测图像的主要特征,然后提取这些特征.使其成为图像描述符,这类似于人的眼睛和大脑.这些图像特征可作为图像搜索的数据库.此外,人们可以利用这些关键点将图像拼接起来,组成一个更大的图像,比 ...

随机推荐

  1. SQL Server 2008 收缩日志 清空删除大日志文件 转载

    SQL Server 2008 收缩日志 清空删除大日志文件 由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:(SQL2005)Ba ...

  2. 【转载-好文】使用 Spring 2.5 注释驱动的 IoC 功能

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 原文链接:https://www.ibm.com/developerworks/cn/java/j-lo-spring25 ...

  3. ADF_Desktop Integration系列2_ADF桌面集成入门之开发简单ADF Desktop Excel

    2013-05-01 Created By BaoXinjian

  4. Android接收系统广播

    Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息.比如手机开机完成后会发出一条广播,电池的电量发生变化会发出一条广播,时间或时区发生改变也会发出一条 ...

  5. nginx/Windows-1.9.3启动脚本

    启动nginx.bat @echo off D: cd D:\Program Files\nginx-1.9.3 tasklist | findstr /i "nginx.exe" ...

  6. Chap4: question: 19 - 28

    19. 二叉树的镜像(递归) 即:交换所有节点的左右子树.从下往上 或 从上往下 都可以. #include <iostream> #include <string> usin ...

  7. python-appium识别元素等待时间

    1.显式等待 一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码. from selenium import webdriverfrom selenium.webdriver. ...

  8. flex polygon 序列化为txt 文本

    当我们要把一个地块导出为txt的时候,应该怎么写,这是比较有用的这样可以帮助我们存档之类的,这里是基于某个地方的独立坐标系,是基于自己发布地图,如果是用百度地图或者其他网上的地图可能不适用. pack ...

  9. python __init__.py用途

    转自http://www.cnpythoner.com/post/2.html Python中的Module是比较重要的概念.常见的情况是,事先写好一个.py文 件,在另一个文件中需要import时, ...

  10. nodejs生成UID(唯一标识符)——node-uuid模块

    unique identifier 惟一标识符        -->> uid 在项目开发中我们常需要给某些数据定义一个唯一标识符,便于寻找,关联. node-uuid模块很好的提供了这个 ...