使用nodeitk进行对象识别
前言
东莞,晴,29至27度。忙了一天,最终能够写写东西了。今天继续昨天的话题,我们在昨天的例了基础上完好,通过匹配关键点求出映射从而找到场景中的已知对象。
目标
本文你将学习
- 採用nodeitk的findHomography和perspectiveTransform进行对象识别。
- 此外,样例基本包括nodeitk的一些基本数据结构的使用:NodeOpenCVMat, NodeOpenCVKeyPoint, NodeOpenCVPoint
- 上述主要的数据结构在nodeitk版本号稳定后将会在使用手冊中说明
代码
var node_itk = require('./node-itk');
var img_object = node_itk.cv.imread( "./images/box.png", node_itk.cv.CV_LOAD_IMAGE_GRAYSCALE );
var img_scene = node_itk.cv.imread( "./images/box_in_scene.png", node_itk.cv.CV_LOAD_IMAGE_GRAYSCALE );
minHessian = 400
detector = new node_itk.cv.NodeOpenCVFeatureDetector("SURF")
detector.Set("hessianThreshold", minHessian)
keypoints_object = detector.Detect( img_object );
keypoints_scene = detector.Detect( img_scene );
extractor = new node_itk.cv.NodeOpenCVDescriptorExtractor("SURF");
descriptors_object = extractor.Compute(img_object, keypoints_object)
descriptors_scene = extractor.Compute(img_scene, keypoints_scene)
matcher = new node_itk.cv.NodeOpenCVDescriptorMatcher("FlannBased");
matches = matcher.Match(descriptors_object, descriptors_scene);
max_dist=0
min_dist=100
for (var i = 0; i < descriptors_object.Rows(); i++ ) {
dist = matches[i].GetDistance();
if (dist < min_dist) min_dist = dist;
if (dist > max_dist) max_dist = dist;
};
console.log("-- Max dist : " + max_dist + "\n")
console.log("-- Min dist : " + min_dist + "\n")
var good_matches = [];
for( var i = 0; i < descriptors_object.Rows(); i++ ){
if( matches[i].GetDistance() <= 3*min_dist )
{ good_matches.push( matches[i] ); }
}
img_matches = node_itk.cv.DrawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches);
var obj=[], scene=[];
for (var i = 0; i < good_matches.length; i++) {
obj.push( keypoints_object[good_matches[i].GetQueryIdx()].PT() )
scene.push( keypoints_scene[good_matches[i].GetTrainIdx()].PT() )
};
H = node_itk.cv.FindHomography( obj, scene, node_itk.cv.CV_RANSAC );
obj_corners = []
obj_corners[0] = new node_itk.cv.NodeOpenCVPoint("Point2d", [0,0])
obj_corners[1] = new node_itk.cv.NodeOpenCVPoint("Point2d", [img_object.Cols(),0])
obj_corners[2] = new node_itk.cv.NodeOpenCVPoint("Point2d", [img_object.Cols(),img_object.Rows()])
obj_corners[3] = new node_itk.cv.NodeOpenCVPoint("Point2d", [0,img_object.Rows()])
tmp = new node_itk.cv.NodeOpenCVPoint("Point2d", [img_object.Cols(),0]);
color = new node_itk.cv.NodeOpenCVScalar("Scalar", [0,255,0]);
scene_corners = node_itk.cv.PerspectiveTransform(obj_corners, H.res);
node_itk.cv.Line(img_matches, scene_corners[0].Add(tmp), scene_corners[1].Add(tmp), color, 2)
node_itk.cv.Line(img_matches, scene_corners[1].Add(tmp), scene_corners[2].Add(tmp), color, 2)
node_itk.cv.Line(img_matches, scene_corners[2].Add(tmp), scene_corners[3].Add(tmp), color, 2)
node_itk.cv.Line(img_matches, scene_corners[3].Add(tmp), scene_corners[0].Add(tmp), color, 2)
node_itk.cv.NamedWindow( "Good Matches & Object detection", node_itk.cv.CV_WINDOW_AUTOSIZE );
node_itk.cv.imshow( "Good Matches & Object detection", img_matches );
node_itk.cv.WaitKey ( 0 );
结果
小结
本文是昨天话题的深化,代码依旧比較简洁。这是nodeitk遵循的原则:以简单的方式高速实现图像处理应用。喜欢的朋友就点踩,想说点东西的就评论吧!^_^ 待续
使用nodeitk进行对象识别的更多相关文章
- 写给程序员的机器学习入门 (九) - 对象识别 RCNN 与 Fast-RCNN
因为这几个月饭店生意恢复,加上研究 Faster-RCNN 用掉了很多时间,就没有更新博客了.这篇开始会介绍对象识别的模型与实现方法,首先会介绍最简单的 RCNN 与 Fast-RCNN 模型,下一篇 ...
- 写给程序员的机器学习入门 (十) - 对象识别 Faster-RCNN - 识别人脸位置与是否戴口罩
每次看到大数据人脸识别抓逃犯的新闻我都会感叹技术发展的太快了,国家治安水平也越来越好了
- 写给程序员的机器学习入门 (十一) - 对象识别 YOLO - 识别人脸位置与是否戴口罩
这篇将会介绍目前最流行的对象识别模型 YOLO,YOLO 的特征是快,识别速度非常快
- Hibernate 系列 08 - 对象识别机制
目录导读: Hibernate 系列 学习笔记 目录 本篇目录: 为了区别不同的对象,有两种识别方法: 1. 内存地址识别(“==”号识别) 2. equals()和hashCode()识别 1. 以 ...
- QTP对象识别tips
1.已添加的对象无法再次识别成功,编辑对象存储库中测试对象详细信息.子对象无法识别成功时,先检查父对象是否可成功识别. 2.使用.NET Windows Forms 侦测器检测后再使用object s ...
- SilkTest天龙八部系列7-动态对象识别
在测试web应用时,我们常常需要面对web页面对象变化频繁,并且使用预定义方式识别对象慢的困难.为了解决这些问题,SilkTest引入了dynamic object recognition技术,它使用 ...
- 【Selenium专题】 FAQ_对象识别_Compound class names are not supported
测试代码 public void login(){ WebDriver driver = new ChromeDriver(); driver.get("http://IP:Port/cli ...
- python imageai 对象检测、对象识别
imageai库里面提供了目标识别,其实也可以说是目标检测,和现在很多的收集一样就是物体识别.他可以帮你识别出各种各样生活中遇见的事物.比如猫.狗.车.马.人.电脑.收集等等. 感觉imageai有点 ...
- QTP技术支持之QTP对象无法识别(转自582357212的个人空间,链接:http://www.51testing.com/html/64/305564-847787.html)
QTP自动化测试从业者,或者很多练习使用QTP开发自动化测试代码的人员遇到最多的问题恐怕就是对象无法识别了,对象无法识别原因有很多种,根据经常对QTP自动化测试脚本开发人员的技术Support,我总结 ...
随机推荐
- HTML5之Canvas影片广场
HTML5之Canvas影片广场 1.设计源代码 <!DOCTYPE html> <head> <meta charset="utf-8" /> ...
- Cocos2d-x3.1回调函数具体解释
Cocos2d-x3.1回调函数的定义CCRef.h声明.源代码,例如,下面的: typedef void (Ref::*SEL_CallFunc)(); typedef void (Ref::*SE ...
- iOS发展- backBarButtonItem 颜色/文字修改
iOS7之后. 默认返回button字体颜色为蓝色, 在父母的陈列柜VC(老界面)的title 假设做出改变, 通过下面的方法可以: 1. 更改字体颜色 (1) 在plist里面, 加View con ...
- Session小案例------完成用户登录
Session小案例------完成用户登录 在项目开发中,用户登陆功能再平常只是啦,当用户完毕username和password校验后.进入主界面,须要在主界面中显示用户的信息,此时用ses ...
- Objective-C开发编码规范
Objective-C 编码规范,内容来自苹果.谷歌的文档翻译,自己的编码经验和对其它资料的总结. 概要 Objective-C 是一门面向对象的动态编程语言,主要用于编写 iOS 和 Mac 应用程 ...
- CreateEvent、SetEvent、ResetEvent和WaitForSingleObject
事件对象就像一个开关:它仅仅有两种状态---开和关.当一个事件处于"开"状态.我们称其为"有信号".否则称为"无信号". 能够在一个线程的运 ...
- overflow的几个坑
在android 4.0的原生浏览器上注意: html元素上不要加overflow: auto;的样式,否则会造成有些元素无法点击 在absolute元素上 不要加 overflow: auto; 否 ...
- 初学者应学会如何加快seo
新手学习如何加快seo 介绍: 应该如何初学者学习SEO,前弯路.真正的高手SEO知识. 作为一个新人,学习如何加快seo知识吧? 多人天天都在学习seo知识.看别人的文章.看多了就感觉 ...
- 【Stackoverflow好问题】祛烦“!=null"()判处空语句
问题 为了避免空指针调用,我们常常会看到这种语句 ...if (someobject != null) { someobject.doCalc();}... 终于.项目中会存在大量判空代码.多么丑陋繁 ...
- VS2012 安装出错 :通道正在关闭
从微软官网下的安装包iso,解压后安装时总是出现 3个错误,提示什么管道正在关闭,看了很多解决办法,挑了一个简单的:安装包有问题,重新下载一个,就好了(持续更新....)