您好,登錄后才能下訂單哦!
這篇文章主要介紹“Opencv圖色識別的用法”,在日常操作中,相信很多人在Opencv圖色識別的用法問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Opencv圖色識別的用法”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
最近研究了一下圖色識別,想用opencv測試一下,這里記錄一下過程。
參考網上的教程主要使用matchTemplate這個函數,看一下python的版本
兩張圖片:
生成圖片
可以看到通過模板(第一張圖)準確的匹配出了在第二張圖中的位置,我們改一下代碼打印一下時間
性能確實強勁,整個圖片掃描和過濾閥值使用了5毫秒左右
考慮的實際部署可能使用c++,順便測試一下
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
const char *image_window = "Source Image";
const char *templ_window = "Templ window";
void matchingMethod(Mat &img, Mat &templ);
int main(int argc, char **argv)
{
Mat img = imread(argv[1], IMREAD_GRAYSCALE);
Mat templ = imread(argv[2], IMREAD_GRAYSCALE);
matchingMethod(img, templ);
waitKey(0);
return 0;
}
void matchingMethod(Mat &img, Mat &templ)
{
TickMeter tm;
cout << "開始...\n";
tm.start();
Mat result;
matchTemplate(img, templ, result, 5);
int cols = templ.cols;
int rows = templ.rows;
int width = result.cols;
float *ip = (float *)result.data;
for (int i = 0, ilenght = result.rows; i < ilenght; i++)
{
for (int j = 0, jlenght = result.cols; j < jlenght; j++)
{
int index = i * width + j;
if (ip[index] >= 0.8) //大于0.8視為命中
{
Point p1 = Point(j, i);
Point p2 = Point(j + cols, i + rows);
rectangle(img, p1, p2, Scalar::all(255), 1, 1, 0);
}
}
}
tm.stop();
cout << "花費時間: " << tm.getTimeMilli() << "ms" << endl;
cout << "結束.\n";
imshow(image_window, img);
imshow(templ_window, templ);
}
由于在c++里面不能使用numpy庫,所以在閥值過濾的時候使用了雙重for循環,也嘗試過其他函數發現要在矩陣里面過濾閥值直接獲取索引的函數我沒有找到(對于并行操作來說這樣兩個for循環肯定效率很低),后面找到了再補充,運行看一下效果:
編譯,使用-O2優化:
g++ -std=c++11 -O2 main.cpp -o main `pkg-config --cflags –libs opencv4`
看一下效果
時間跟python差不多,如果去掉rectangle應該是要比python快的,如果能夠把閥值過濾通過矩陣的方式操作應該時間會更短。
到此,關于“Opencv圖色識別的用法”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。