OpenCV Harris 角点检测子

来源:互联网 发布:电脑优化清理软件 编辑:程序博客网 时间:2024/06/05 21:08

目标

本教程中我们将涉及:

  • 有哪些特征?它们有什么用?
  • 使用函数 cornerHarris 通过 Harris-Stephens方法检测角点.

理论

有哪些特征?

在计算机视觉中,我们通常需要寻找两张图上的匹配关键点。为什么?因为一旦我们知道了两张图是相关联的,我们就可以使用 *both 图像来提取它们中的信息。

是指

  • 匹配关键点 是指在场景中可以很容易识别出来的 特性 . 这些特性就是这里所说的 特征 。
  • 因此,特征应该有什么样的特性呢?
    • 应该具有 可识别的独一无二性

图像特征类型

图像特征类型:

  • 边缘
  • 角点 (感兴趣关键点)
  • 斑点(Blobs) (感兴趣区域)

本教程涉及 角点 特征。

为什么角点是特殊的?

  • 因为角点是两个边缘的连接点,它代表了两个边缘变化的方向上的点。图像梯度有很高的变化。这种变化是可以用来帮助检测角点的。

如何工作?

  • 由于角点代表了图像像素梯度变化,我们将寻找这个”变化”。

  • 考虑到一个灰度图像 I. 划动窗口 w(x,y) (with displacements u 在x方向和 v 方向) I 计算像素灰度变化。

    E(u,v) = \sum _{x,y} w(x,y)[ I(x+u,y+v) - I(x,y)]^{2}

    其中:

    • w(x,y) is the window at position (x,y)
    • I(x,y) is the intensity at (x,y)
    • I(x+u,y+v) is the intensity at the moved window (x+u,y+v)
  • 为了寻找带角点的窗口,我们搜索像素灰度变化较大的窗口。于是, 我们期望最大化以下式子:

    \sum _{x,y}[ I(x+u,y+v) - I(x,y)]^{2}

  • 使用 泰勒(Taylor)展开式:

    E(u,v) \approx \sum _{x,y}[ I(x,y) + u I_{x} + vI_{y} - I(x,y)]^{2}

  • 式子可以展开为:

    E(u,v) \approx \sum _{x,y} u^{2}I_{x}^{2} + 2uvI_{x}I_{y} + v^{2}I_{y}^{2}

  • 一个举证表达式可以写为:

    E(u,v) \approx \begin{bmatrix}                u & v               \end{bmatrix}               \left (               \displaystyle \sum_{x,y}               w(x,y)               \begin{bmatrix}                I_x^{2} & I_{x}I_{y} \\                I_xI_{y} & I_{y}^{2}               \end{bmatrix}               \right )               \begin{bmatrix}                u \\                v               \end{bmatrix}

  • 表示为:

    M = \displaystyle \sum_{x,y}                      w(x,y)                      \begin{bmatrix}                        I_x^{2} & I_{x}I_{y} \\                        I_xI_{y} & I_{y}^{2}                       \end{bmatrix}

  • 因此我们有等式:

    E(u,v) \approx \begin{bmatrix}                u & v               \end{bmatrix}               M               \begin{bmatrix}                u \\                v               \end{bmatrix}

  • 每个窗口中计算得到一个值。这个值决定了这个窗口中是否包含了角点:

    R = det(M) - k(trace(M))^{2}

    其中:

    • det(M) = \lambda_{1}\lambda_{2}
    • trace(M) = \lambda_{1}+\lambda_{2}

    一个窗口,它的分数 R 大于一个特定值,这个窗口就可以被认为是”角点”

代码

这个教程的代码如下所示。还可以通过 这个链接下载到源代码

#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace cv;using namespace std;/// Global variablesMat src, src_gray;int thresh = 200;int max_thresh = 255;char* source_window = "Source image";char* corners_window = "Corners detected";/// Function headervoid cornerHarris_demo( int, void* );/** @function main */int main( int argc, char** argv ){  /// Load source image and convert it to gray  src = imread( argv[1], 1 );  cvtColor( src, src_gray, CV_BGR2GRAY );  /// Create a window and a trackbar  namedWindow( source_window, CV_WINDOW_AUTOSIZE );  createTrackbar( "Threshold: ", source_window, &thresh, max_thresh, cornerHarris_demo );  imshow( source_window, src );  cornerHarris_demo( 0, 0 );  waitKey(0);  return(0);}/** @function cornerHarris_demo */void cornerHarris_demo( int, void* ){  Mat dst, dst_norm, dst_norm_scaled;  dst = Mat::zeros( src.size(), CV_32FC1 );  /// Detector parameters  int blockSize = 2;  int apertureSize = 3;  double k = 0.04;  /// Detecting corners  cornerHarris( src_gray, dst, blockSize, apertureSize, k, BORDER_DEFAULT );  /// Normalizing  normalize( dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat() );  convertScaleAbs( dst_norm, dst_norm_scaled );  /// Drawing a circle around corners  for( int j = 0; j < dst_norm.rows ; j++ )     { for( int i = 0; i < dst_norm.cols; i++ )          {            if( (int) dst_norm.at<float>(j,i) > thresh )              {               circle( dst_norm_scaled, Point( i, j ), 5,  Scalar(0), 2, 8, 0 );              }          }     }  /// Showing the result  namedWindow( corners_window, CV_WINDOW_AUTOSIZE );  imshow( corners_window, dst_norm_scaled );}

解释

实验结果

原始图像:

../../../../../_images/Harris_Detector_Original_Image.jpg

检测到的角点被黑色圈标记了

../../../../../_images/Harris_Detector_Result.jpg

翻译者

Shuai Zheng, <kylezheng04@gmail.com>, http://www.cbsr.ia.ac.cn/users/szheng/


from: http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html#harris-detector

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我把油画的布割破了怎么办 胜战本领怎么看、走上战场怎么办 胜战本领怎么看 走上战场怎么办 数码相机拍出的相片亮度太亮怎么办 国考照片错了怎么办招生办能改吗 国考英语准考证名字错了怎么办 玻尿酸打鼻子双眼间距好怪怎么办 喝咖啡后胃不舒服想吐怎么办 分期付款买的车不想还款了怎么办 考试时打小抄被同学发现怎么办 生完二胎计生办强制要求上环怎么办 没办二代身份证户口被注销怎么办 川航特价儿童票名字写错怎么办 川航机票名字错一个字怎么办 买飞机票名字打错了一个字怎么办 坐飞机耳朵聋了下飞机还痛怎么办 小孩咳嗽两个月了还不好怎么办 生完小孩肚子瘦不下来怎么办 胆子小一个人在家里都害怕怎么办 怀了双胞胎两个宝宝很挤怎么办 飞机无人陪护如果接机延误该怎么办 过年要坐火车回家 狗狗怎么办 一岁八个月宝宝小腿弯怎么办 2岁宝不愿意坐马桶拉屎怎么办 宝宝两岁多肺炎出院还老咳嗽怎么办 去外国机场买机票不会说外语怎么办 坐飞机不能带的物品办理托运怎么办 深圳外地户口儿童要办身份证怎么办 网上订票错写了护照号怎么办 国航 在智能火车票订飞机票订反了怎么办 办社保卡的时候填错地址怎么办 两个人住酒店只有一张身份证怎么办 农村社保卡信息错了说改不了怎么办 社保卡与原医保卡信息错误怎么办 学校发的社保卡丢了怎么办 魔棒工具选中选区后再怎么办 微信每次打开都出现月球图案怎么办 仙人掌的刺扎手里弄不出来怎么办 保险交满15年领了一年死了怎么办 狗咬了出了点血怎么办 被小狗咬到了吃了海鲜怎么办