溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Opencv圖色識(shí)別的用法

發(fā)布時(shí)間:2021-06-23 09:38:19 來(lái)源:億速云 閱讀:288 作者:chen 欄目:編程語(yǔ)言

這篇文章主要介紹“Opencv圖色識(shí)別的用法”,在日常操作中,相信很多人在Opencv圖色識(shí)別的用法問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”O(jiān)pencv圖色識(shí)別的用法”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

最近研究了一下圖色識(shí)別,想用opencv測(cè)試一下,這里記錄一下過(guò)程。

參考網(wǎng)上的教程主要使用matchTemplate這個(gè)函數(shù),看一下python的版本

Opencv圖色識(shí)別的用法

兩張圖片:

Opencv圖色識(shí)別的用法

Opencv圖色識(shí)別的用法

生成圖片

Opencv圖色識(shí)別的用法

可以看到通過(guò)模板(第一張圖)準(zhǔn)確的匹配出了在第二張圖中的位置,我們改一下代碼打印一下時(shí)間

Opencv圖色識(shí)別的用法

性能確實(shí)強(qiáng)勁,整個(gè)圖片掃描和過(guò)濾閥值使用了5毫秒左右

考慮的實(shí)際部署可能使用c++,順便測(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 << "開(kāi)始...\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 << "花費(fèi)時(shí)間: " << tm.getTimeMilli() << "ms" << endl;

    cout << "結(jié)束.\n";

    imshow(image_window, img);

    imshow(templ_window, templ);

}

由于在c++里面不能使用numpy庫(kù),所以在閥值過(guò)濾的時(shí)候使用了雙重for循環(huán),也嘗試過(guò)其他函數(shù)發(fā)現(xiàn)要在矩陣?yán)锩孢^(guò)濾閥值直接獲取索引的函數(shù)我沒(méi)有找到(對(duì)于并行操作來(lái)說(shuō)這樣兩個(gè)for循環(huán)肯定效率很低),后面找到了再補(bǔ)充,運(yùn)行看一下效果:

編譯,使用-O2優(yōu)化:

g++ -std=c++11 -O2 main.cpp -o main `pkg-config --cflags –libs opencv4`

看一下效果

Opencv圖色識(shí)別的用法

時(shí)間跟python差不多,如果去掉rectangle應(yīng)該是要比python快的,如果能夠把閥值過(guò)濾通過(guò)矩陣的方式操作應(yīng)該時(shí)間會(huì)更短。

到此,關(guān)于“Opencv圖色識(shí)別的用法”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI