码迷,mamicode.com
首页 > 其他好文 > 详细

使用nodeitk进行角点检测

时间:2014-07-01 14:32:17      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:机器视觉   源代码   

前言

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


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

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

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

理论

什么是特征?

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

2.        当我们说匹配点时,一般意义是指我们可以很容易在场景中识别的特征。

3.        那么什么是特征呢?

a)        它必须是独有的可以识别的特性。

图像特征的类型

大概有:

1.        边缘

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

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

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

为什么角点那么特别?

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

算法描述

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

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

bubuko.com,布布扣

其中

1.        是在位置的窗口

2.        是在位置的灰度

3.        是移动窗口处的灰度

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

使泰勒展式:

bubuko.com,布布扣

展开等式并化简:

bubuko.com,布布扣

使用矩阵形式表示:

bubuko.com,布布扣

bubuko.com,布布扣

那么等式可以表示为:

bubuko.com,布布扣

对于每个窗口,采用下面评价函数以确定窗口是否包含角点

bubuko.com,布布扣

这里

1.        bubuko.com,布布扣

2.         bubuko.com,布布扣

当一个窗口的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 );

运行结果

bubuko.com,布布扣

bubuko.com,布布扣bubuko.com,布布扣

bubuko.com,布布扣


小结

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

使用nodeitk进行角点检测,布布扣,bubuko.com

使用nodeitk进行角点检测

标签:机器视觉   源代码   

原文地址:http://blog.csdn.net/wenfengmtd/article/details/36179535

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!