Opencv3——特征点检测

Opencv3中特征点检测有很多与opencv2不同的地方,特别是在特征点检测这一块

想要用opencv3进行特征点检测,有很多前期的准备工作要做有一大堆的配置,

参见:http://blog.csdn.net/linshuhe1/article/details/51221015

实验代码如下:

/***************************************************************************
*检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。
*如果测试了候选点周围每隔90度角的4个点,应该至少有3个和候选点的灰度值差足够大,否则则不用再计算其他点,直接认为该候选点不是特征点。候选点周围的圆的选取半径是一个很重要的参数,
*http://www.tuicool.com/articles/NzE77nB
*http://blog.sina.com.cn/s/blog_a98e39a201017pgn.html
*http://www.xuebuyuan.com/582341.html
*http://blog.csdn.net/poem_qianmo/article/details/33320997
***************************************************************************/

#include <iostream>
#include<opencv2\opencv.hpp>
#include"opencv2/xfeatures2d.hpp"

using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
using namespace cv::ml;

int main()
{
	Mat a = imread( "1.jpg" , 0 );    //读取灰度图像
	Mat b = imread( "2.jpg" , 0 );

	Ptr<SURF> surf;                   //创建方式和opencv2中的不一样
//	Ptr<SIFT> sift;
	surf = SURF::create( 800 );       //阈值

	BFMatcher matcher;                //匹配器
	Mat c , d;
	vector<KeyPoint> key1 , key2;
	vector<DMatch> matches;

	//结果为一个Mat矩阵,它的行数与特征点向量中元素个数是一致的。每行都是一个N维描述子的向量
	surf->detectAndCompute( a , Mat() , key1 , c );      //检测关键点和匹配描述子
	surf->detectAndCompute( b , Mat() , key2 , d );

	matcher.match( c , d , matches );         // 匹配,得到匹配向量

	sort( matches.begin() , matches.end() );  // 匹配点排序
	vector< DMatch > good_matches;            // 匹配两幅图像的描述子
	int ptsPairs = min( 50 , ( int ) ( matches.size() * 0.15 ) );
	cout << ptsPairs << endl;
	for( int i = 0; i < ptsPairs; i++ )       // 将匹配较好的特征点存入good_matches中
	{
		good_matches.push_back( matches[i] );
	}
	Mat outimg;
	drawMatches(                               // 绘制匹配点
		a ,                                    // 原图像1
		key1 ,                                 // 原图像1的特征点
		b ,                                    // 原图像2
		key2 ,                                 // 原图像2的特征点
		good_matches ,                         // 原图像1的特征点匹配原图像2的特征点[matches[i]]
		outimg ,                               // 输出图像具体由flags决定
		Scalar::all( -1 ) ,                    // 匹配的颜色(特征点和连线),若matchColor==Scalar::all(-1),颜色随机
		Scalar::all( -1 ) ,                    // 单个点的颜色,即未配对的特征点,若matchColor==Scalar::all(-1),颜色随机
		vector<char>() ,                       // Mask决定哪些点将被画出,若为空,则画出所有匹配点
		DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );  //Fdefined by DrawMatchesFlags

	imshow( "匹配图" , outimg );
	waitKey();

	vector<Point2f> obj;
	vector<Point2f> scene;

	for( size_t i = 0; i < good_matches.size(); i++ )
	{
		good_matches[i].queryIdx保存着第一张图片匹配点的序号,keypoints_1[good_matches[i].queryIdx].pt.x 为该序号对应的点的x坐标
		obj.push_back( key1[good_matches[i].queryIdx].pt );
		scene.push_back( key2[good_matches[i].trainIdx].pt );
	}

	vector<Point2f> scene_corners( 4 );
	vector<Point2f> obj_corners( 4 );
	obj_corners[0] = Point( 0 , 0 );
	obj_corners[1] = Point( a.cols , 0 );
	obj_corners[2] = Point( a.cols , a.rows );
	obj_corners[3] = Point( 0 , a.rows );

	Mat H = findHomography(              // 在两个平面之间寻找单映射变换矩阵
		obj ,                            // 在原平面上点的坐标
		scene ,                          // 在目标平面上点的坐标
		RANSAC );                        // 用于计算单映射矩阵的方法

	perspectiveTransform(                // 向量组的透视变换
		obj_corners ,                    // 输入两通道或三通道的浮点数组,每一个元素是一个2D/3D 的矢量转换
		scene_corners ,                  // 输出和src同样的size和type
		H );                             // 3x3 或者4x4浮点转换矩阵


	// 绘制
	line( outimg , scene_corners[0] + Point2f( ( float ) a.cols , 0 ) , scene_corners[1] + Point2f( ( float ) a.cols , 0 ) , Scalar( 0 , 255 , 0 ) , 2 , LINE_AA );       
	line( outimg , scene_corners[1] + Point2f( ( float ) a.cols , 0 ) , scene_corners[2] + Point2f( ( float ) a.cols , 0 ) , Scalar( 0 , 255 , 0 ) , 2 , LINE_AA );
	line( outimg , scene_corners[2] + Point2f( ( float ) a.cols , 0 ) , scene_corners[3] + Point2f( ( float ) a.cols , 0 ) , Scalar( 0 , 255 , 0 ) , 2 , LINE_AA );
	line( outimg , scene_corners[3] + Point2f( ( float ) a.cols , 0 ) , scene_corners[0] + Point2f( ( float ) a.cols , 0 ) , Scalar( 0 , 255 , 0 ) , 2 , LINE_AA );
	imshow( "匹配图" , outimg );
	waitKey( 0 );
}





  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 人脸识别系统是一种利用计算机技术对人脸进行识别和验证的系统。其中,opencv人脸检测是一种基于opencv库的人脸检测算法,可以通过计算机视觉技术对图像或视频中的人脸进行检测和识别,具有高效、准确、实时等特点,广泛应用于安防、人机交互、智能家居等领域。 ### 回答2: 人脸识别系统是一种可以通过对人脸进行特征提取、比对和识别的技术,目前已广泛应用在生物特征识别、安防监控等领域。而OpenCV人脸检测是在计算机视觉领域中应用广泛的一种算法。 OpenCV是一个开源计算机视觉库,提供了很多图像处理和机器视觉算法,其中人脸检测是OpenCV中应用最广泛的算法之一。OpenCV人脸检测的基本思路是利用Haar-like特征进行人脸检测。 Haar-like特征是一组由Viola和Jones在2001年提出的能够对图像进行分类的特征,主要由白色和黑色的矩形块组成。这些特征可以在人脸区域和非人脸区域产生显著的区别,因此可以用来进行人脸检测。在OpenCV中,利用Adaboost算法来训练分类器,从而实现人脸检测。 OpenCV人脸检测有以下几个优点: 1. 检测速度快:OpenCV的人脸检测算法可以实现实时检测,能够处理实时视频,并对每一帧进行人脸检测。 2. 高检测率和低误检率:OpenCV人脸检测算法经过大量的训练和优化,能够准确地检测人脸,且误检率低。 3. 应用广泛:由于OpenCV是一个开源库,其特性与应用广泛,可以应用于不同领域的人脸检测。 4. 动态人脸识别:OpenCV人脸检测算法能够在不同角度、不同光照条件下对人脸进行检测和识别。 5. 简单易用:OpenCV提供了简单的API调用,即可完成人脸检测。同时,OpenCV还提供了丰富的文档和示例,使得人脸检测的实现变得更加简单。 总之,OpenCV人脸检测算法是一种可靠的人脸检测技术,可以广泛应用于不同领域。通过不断地优化和训练,OpenCV的人脸检测算法仍有望在未来得到进一步的提升。 ### 回答3: 人脸识别是一种高科技应用,它可以在不进行人工干预的情况下识别人们的身份。在过去的几年里,随着计算机技术的不断发展壮大,人脸识别技术得到了迅速的发展和应用。 Opencv人脸检测是一种常见的人脸识别技术,它可以快速、准确地检测人脸并提取出相关的数据信息。Opencv人脸检测使用基于统计学的模型,可以快速检索出整张图像中的所有人脸,并用边缘高亮标出。其识别空间包括面部区域,由眼睛、口鼻、眉毛和脸型等特征组成。而为了提高识别的准确度,Opencv人脸检测还涉及到其他一些算法,比如特征提取、人脸分类和智能识别。 Opencv人脸检测是非常重要的安全工具,它可以用于认证和安全访问控制、图像搜索和媒体应用。在计算机视觉和机器学习领域,Opencv人脸检测是重要的探究之一,因为对于如何解决图像多样性问题的机器人操作的研究而言,人脸检测是非常关键的。Opencv人脸检测还可以用于许多领域,如自然语言处理、光学字符识别等,进一步方便了计算机与人类之间的交流。 在未来,Opencv人脸检测技术有望得以发展与扩展,实现更加准确、精密的人脸识别,为广大人民群众的生产生活提供更多的便利与保障。诚然,Opencv人脸检测仅仅是人脸识别的一个小部分,但它在其中占有重要的地位,在此我们真诚地期待着Opencv人脸检测技术能够顺利地实现更深入的发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值