【OpenCv3】 VS C++ (三):图像识别

OpenCv专栏:https://blog.csdn.net/qq_40515692/article/details/102885061

以下代码均在VS配置的OpenCv3上运行成功,不需要其他额外配置。

使用关键点对目标进行识别是常用的方法。一般需要经过核心关键点检测、关键点过滤、匹配方法、结果显示等步骤。

具体可以参考opencv的官方文档:

https://docs.opencv.org/3.0-beta/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html#harris-detector

和《学习OpenCv3》第十六章-关键点和描述子

(1).首先是核心关键点检测:角点检测Shi-Tomasi算法,它是Harris算法的改进。实际使用时记得改下图片的读取路径。

#include <opencv2/opencv.hpp> 
#include <opencv2/imgproc.hpp>
#include <vector>

using namespace std;
using namespace cv;

Mat g_src, g_gray;
int g_num;

void fun(int, void*)
{
	vector<Point2f> corners;
	Mat copy = g_src.clone();

	//角点检测Shi-Tomasi算法,Harris算法的改进
	goodFeaturesToTrack(g_gray, corners, g_num, 0.01, 10, Mat(), 3, false, 0.04);
	RNG rng(12345);//随机数产生器

	for (unsigned int i = 0; i < corners.size(); i++)
	{
		//thickness = -1
		//      如果是正数,表示组成圆的线条的粗细程度。 否则, 表示圆是否被填充
		circle(copy, corners[i], 4, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)), -1);
	}
	imshow("角点检测", copy);
}

int main()
{
	// 注意更改图片位置
	g_src = imread("C:\\Users\\ttp\\Desktop\\5.jpg", 1);
	cvtColor(g_src, g_gray, COLOR_BGR2GRAY);
	namedWindow("角点检测", WINDOW_AUTOSIZE);
	createTrackbar("最大角点数", "角点检测", &g_num, 500, fun);
	imshow("角点检测", g_src);
	waitKey(0);
	return 0;
}

 

 

(2).OpenCv一般如何处理关键点和描述符的?

        cv::KeyPoint——关键点

        cv::Feature2D——找到关键点或计算描述符的抽象类,如下面的FastFeatureDetector即派生于Feature2D,定义了detect、compute、detectAndCompute等方法

然后这里给一个核心关键点检测:FAST算法的特征检测。实际使用时记得改下图片的读取路径。

#include "opencv2/opencv.hpp"
#include<opencv2/features2d.hpp>

using namespace cv;

int thre = 40;
Mat src;

void trackBar(int, void*)
{
	std::vector<KeyPoint> keypoints;
	Mat dst = src.clone();
	//Ptr智能指针
	/*
		Ptr<FILE> f(fopen("myfile.txt", "w"), fclose);
		if(!f) throw ...;
		fprintf(f, ....);
		...
		// the file will be closed automatically by f's destructor.
	*/
	Ptr<FastFeatureDetector> detector = FastFeatureDetector::create(thre);
	detector->detect(src, keypoints);
	drawKeypoints(dst, keypoints, dst, Scalar::all(-1), DrawMatchesFlags::DRAW_OVER_OUTIMG);
	imshow("output", dst);
}

int main(int argc, char** argv)
{
	// 注意更改文件位置
	src = imread("C:\\Users\\ttp\\Desktop\\5.jpg");
	if (src.empty())
	{
		printf("can not load image \n");
		return -1;
	}
	namedWindow("input", WINDOW_AUTOSIZE);
	imshow("input", src);

	namedWindow("output", WINDOW_AUTOSIZE);
	createTrackbar("threshould", "output", &thre, 255, trackBar);
	cvWaitKey(0);
	return 0;
}

 

 

(3).OpenCv一般如何处理关键点和描述符的?

        cv::KeyPoint——关键点

        cv::Feature2D——找到关键点或计算描述符的抽象类,如上面的FastFeatureDetector即派生于Feature2D,定义了detect、compute、detectAndCompute等方法

 

上面介绍的主要是查找角点、关键点,除此之外我们还需要下面这些步骤。

        cv::DMatch——匹配器

        cv::DescriptorMatcher——关键点匹配的抽象类,在下一节我们将在代码中具体使用它们。

  • 10
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值