zoukankan      html  css  js  c++  java
  • 使用nodeitk进行角点检測

    前言

    东莞,晴,33至27度。今天天气真好,学生陆续离开学校。忙完学生答辩事情,最终能够更新一下nodeitk。本文继续介绍node的特征识别相关内容,你会看到,採用nodeitk实现角点检測是一件十分简单的事情。


    本文你将学到使用nodeitk进行角点检測:

    1.        特征包括有哪些?为什么它们这么重要

    2.        使用函数cornerHarris,利用Harris-Stephens方法检測角点

    理论

    什么是特征?

    1.        在机器视觉中,通常我们在一个环境下的不同帧查找匹配点。为什么?这是由于假设我们知道两张图之间的相关性,我们就能够从两张图中提取它们包括的信息

    2.        当我们说匹配点时,一般意义是指我们能够非常easy在场景中识别的特征。

    3.        那么什么是特征呢?

    a)        它必须是独有的能够识别的特性。

    图像特征的类型

    大概有:

    1.        边缘

    2.        角点(也称为感兴趣点)

    3.        斑点(Blobs,也称为感兴趣区域)

    在本文,我们将专门谈谈角点特征

    为什么角点那么特别?

    由于,它是两相交边的位置,代表两条边方向改变的位置。因此,角点往往是图像梯度(两个方向)急剧变化的位置。

    算法描写叙述

    当我们寻找角点,由于角点表示图像在梯度的变化,因此我们能够等价于寻找这“变化”

    如果是一个灰度图像I。我们使用一个窗体做卷积(u为x方向位移,v为右方向位移):

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

    当中

    1.        是在位置的窗体

    2.        是在位置的灰度

    3.        是移动窗体处的灰度

    由于我们希望找到灰度在窗体处存在较大的差异,以此找到角点的窗体位置。因此,我们最大化上述等式,令项:

    使泰勒展式:

    E(u,v) approx  sum_{x,y} [I(x,y)+uI_x+vI_y-I(x,y)]^2

    展开等式并化简:

    E(u,v) approx  sum_{x,y} u^2I_x^2+2uvI_xI_y+v^2I_y^2

    使用矩阵形式表示:

    E(u,v) approx  [u,v](sum_{x,y} w(x,y) egin{bmatrix}I_x^2& I_xI_y \I_xI_y & I_y^2 end{bmatrix} )egin{bmatrix} u \ vend{bmatrix}

    M = sum_{x,y} w(x,y) egin{bmatrix}I_x^2 & I_xI_y \I_xI_y & I_y^2end{bmatrix}

    那么等式能够表示为:

    E(u,v) approx  [u,v]Megin{bmatrix} u \ v end{bmatrix}

    对于每一个窗体,採用以下评价函数以确定窗体是否包括角点

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

    这里

    1.        det(M)= lambda _1 lambda _2

    2.         trace(M)= lambda _1 + lambda _2

    当一个窗体的R值大于阈值时,被觉得是角点

    源码:

    var node_itk = require('./node-itk');
    var thresh = 200;
    var max_thresh = 255;
    var source_window = "Source image";
    var corners_window = "Corners detected";
    var src = node_itk.cv.imread( "./images/lena.jpg", 1 );
    var src_gray = node_itk.cv.CvtColor(src, node_itk.cv.CV_BGR2GRAY);
    node_itk.cv.NamedWindow( source_window, node_itk.cv.CV_WINDOW_AUTOSIZE );
    node_itk.cv.NamedWindow( corners_window, node_itk.cv.CV_WINDOW_AUTOSIZE );
    node_itk.cv.imshow( source_window, src );
    var dst , dst_norm;
    node_itk.cv.CreateTrackbar( "Threshold: ", source_window, thresh, max_thresh,
    function (thresh){
                  dst = node_itk.cv.NodeOpenCVMat.Zeros(src.Size(), node_itk.cv.CV_32FC1)
                  dst_norm = dst.Clone();
                  blockSize = 2;
                  apertureSize = 3;
                  k = 0.04;
                  node_itk.cv.CornerHarris( src_gray, dst, blockSize, apertureSize, k );
                  node_itk.cv.Normalize(dst,dst_norm, 0, 255,node_itk.cv.NORM_MINMAX,node_itk.cv.CV_32FC1)
                  dst_norm_scaled = node_itk.cv.ConvertScaleAbs(dst_norm);
     
                  for (var j = 0; j<dst_norm.Rows(); j++) {
                         for (var i = 0; i <dst_norm.Cols(); i++) {
                                if (dst_norm.At([j,i])>thresh)
                                {
                                       node_itk.cv.Circle(dst_norm_scaled,
                                              new node_itk.cv.NodeOpenCVPoint("Point", [i,j]),
                                              5,
                                              new node_itk.cv.NodeOpenCVScalar("Scalar", 0),
                                              2,
                                              8,
                                              0);
                                }
                         };
                  };
                  node_itk.cv.NamedWindow(corners_window,node_itk.cv.CV_WINDOW_AUTOSIZE );
                  node_itk.cv.imshow( corners_window,dst_norm_scaled );
           }
    );
    node_itk.cv.WaitKey ( 0 );

    执行结果




    小结

    nodeitk实现角点检測是一件十分easy的事情,在后面我们将深入介绍相关特征识别的内容,当前特征识别模块已经开发完成。待续。

  • 相关阅读:
    MVC是什么意思?
    Paypal 在线支付接口应用从零开始,第2节,[支付API原理及流程]
    人人网
    百度框计算研究
    最近总被黑。然后。。发现了很多知识值得学习。。分享出来。
    首次购房契税下调至1% 首付降为20%
    由“百鸡问题”浅谈程序性能
    10月1日起机动车所有人可自行编排车牌号
    08中国互联网大会23在南京开幕
    MySQL联合创始人向Sun递交辞呈
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4070574.html
Copyright © 2011-2022 走看看