1. 程式人生 > >OpenCv3 VS C++ 影象識別(上)

OpenCv3 VS C++ 影象識別(上)

以下程式碼均在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——關鍵點匹配的抽象類,在下一節我們將在程式碼中具體使用它們。