OpenCv3 VS C++ 影象識別(上)
阿新 • • 發佈:2019-01-13
以下程式碼均在VS配置的OpenCv3上執行成功,不需要其他額外配置。
使用關鍵點對目標進行識別是常用的方法。一般需要經過核心關鍵點檢測、關鍵點過濾、匹配方法、結果顯示等步驟。
具體可以參考opencv的官方文件:
和《學習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——關鍵點匹配的抽象類,在下一節我們將在程式碼中具體使用它們。