亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV中如何基于Hu矩實現輪廓匹配

發布時間:2022-01-16 18:25:51 來源:億速云 閱讀:789 作者:小新 欄目:開發技術

這篇文章將為大家詳細講解有關OpenCV中如何基于Hu矩實現輪廓匹配,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

一、查找輪廓

原圖

OpenCV中如何基于Hu矩實現輪廓匹配

測試圖

OpenCV中如何基于Hu矩實現輪廓匹配

vector<vector<Point>>findContour(Mat Image)
{
    Mat gray;
    cvtColor(Image, gray, COLOR_BGR2GRAY);

    Mat thresh;
    threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);

    vector<vector<Point>>contours;
    findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    vector<vector<Point>>EffectConts;
    for (int i = 0; i < contours.size(); i++)
    {
        double area = contourArea(contours[i]);

        if (area > 1000)
        {
            EffectConts.push_back(contours[i]);
        }
    }

    return EffectConts;
}

OpenCV中如何基于Hu矩實現輪廓匹配

如圖所示,這就是找到的最外輪廓。接下來,我們基于輪廓進行匹配。

二、計算Hu矩

OpenCV提供moments API計算圖像的中心矩;HuMoments API用于中心矩計算Hu矩。關于moments HuMoments相關知識請大家自行查找。    

Moments m_test = moments(test_contours[0]);
    Mat hu_test;
    HuMoments(m_test, hu_test);

    double MinDis = 1000;
    int MinIndex = 0;
    for (int i = 0; i < src_contours.size(); i++)
    {
        Moments m_src = moments(src_contours[i]);
        Mat hu_src;
        HuMoments(m_src, hu_src);

        double dist = matchShapes(hu_test, hu_src, CONTOURS_MATCH_I1, 0);

        if (dist < MinDis)
        {
            MinDis = dist;
            MinIndex = i;
        }
    }

上面代碼段大致思路是:首先計算測試圖的Hu矩;然后使用一個for循環計算原圖中所有輪廓的Hu矩,依次計算兩Hu矩的相似程度。在這里使用matchShapes API計算兩個Hu矩。函數返回值代表兩Hu矩的相似程度。完全相同返回值為0。即這里通過計算兩Hu矩的相似程度,找到返回值最小的那個作為成功匹配。

三、顯示效果

	drawContours(src, src_contours, MinIndex, Scalar(0, 255, 0), 2);

	Rect rect = boundingRect(src_contours[MinIndex]);

	rectangle(src, rect, Scalar(0, 0, 255), 2);

最終效果如圖所示。

OpenCV中如何基于Hu矩實現輪廓匹配

OpenCV中如何基于Hu矩實現輪廓匹配

四、源碼

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;


vector<vector<Point>>findContour(Mat Image)
{
    Mat gray;
    cvtColor(Image, gray, COLOR_BGR2GRAY);

    Mat thresh;
    threshold(gray, thresh, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);

    vector<vector<Point>>contours;
    findContours(thresh, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
    vector<vector<Point>>EffectConts;
    for (int i = 0; i < contours.size(); i++)
    {
        double area = contourArea(contours[i]);

        if (area > 1000)
        {
            EffectConts.push_back(contours[i]);
        }
    }

    return EffectConts;
}


int main()
{

    Mat src = imread("test/hand.jpg");
    Mat test = imread("test/test-3.jpg");

    if (src.empty() || test.empty())
    {
        cout << "No Image!" << endl;
        system("pause");
        return -1;
    }

    vector<vector<Point>>src_contours;
    vector<vector<Point>>test_contours;

    src_contours = findContour(src);
    test_contours = findContour(test);

    Moments m_test = moments(test_contours[0]);
    Mat hu_test;
    HuMoments(m_test, hu_test);

    double MinDis = 1000;
    int MinIndex = 0;
    for (int i = 0; i < src_contours.size(); i++)
    {
        Moments m_src = moments(src_contours[i]);
        Mat hu_src;
        HuMoments(m_src, hu_src);

        double dist = matchShapes(hu_test, hu_src, CONTOURS_MATCH_I1, 0);

        if (dist < MinDis)
        {
            MinDis = dist;
            MinIndex = i;
        }
    }

    drawContours(src, src_contours, MinIndex, Scalar(0, 255, 0), 2);

    Rect rect = boundingRect(src_contours[MinIndex]);

    rectangle(src, rect, Scalar(0, 0, 255), 2);

    imshow("test", test);
    imshow("Demo", src);
    waitKey(0);
    system("pause");
    return 0;
}

關于“OpenCV中如何基于Hu矩實現輪廓匹配”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴忠市| 金阳县| 突泉县| 柯坪县| 隆德县| 革吉县| 恩施市| 滦南县| 德江县| 荆门市| 仙居县| 自治县| 白玉县| 霍城县| 南阳市| 澎湖县| 浑源县| 获嘉县| 大同县| 德保县| 贡嘎县| 鄯善县| 大关县| 稷山县| 巴彦县| 桦甸市| 柏乡县| 绿春县| 肥乡县| 平南县| 乐清市| 临海市| 西盟| 通海县| 慈利县| 石首市| 文登市| 宿迁市| 新营市| 商河县| 澄江县|