1. 程式人生 > >opencv學習(四十四)之影象角點檢測Harris

opencv學習(四十四)之影象角點檢測Harris

1.概述

角點是影象很重要的特徵,對影象圖形的理解和分析有很重要的作用,在保留影象圖形重要特徵的同時,可以有效減少資訊的資料量,使資訊的含量很高,有效提高計算速度,有利於影象的可靠匹配,使得實時處理成為可能。在物體識別、影象匹配、視覺跟蹤和三維重建等方面有很重要的應用。
角點可以認為是視窗向任意方向的移動都導致影象灰度的明顯變化。從影象分析的角度來定義角點可以有一下兩種:
1.角點可以是兩個邊緣的角點
2.角點是鄰域內具有兩個主方向的特徵點
前者往往需要對影象邊緣進行編碼,這在很大程度上依賴於影象的分割與邊緣提取,具有相當大的難度和計算量,且一旦待檢測目標局部發生變化,很可能導致操作的失敗。
角點檢測演算法可以歸納為三類:基於灰度影象的角點檢測、基於二值影象的角點檢測、基於輪廓曲線的角點檢測。基於灰度影象的檢測又可細分為基於梯度、基於模板、基於模板梯度組合三類方法,其中基於模板的方法主要考慮畫素鄰域點的灰度變化,即影象亮度的變化,將與鄰點亮度對比足夠大的點定義為角點。常見的基於模板的角點檢測演算法有Kitchen-Rosenfeld角點檢測,Harris角點檢測演算法,KLT角點檢測和SUSAN角點檢測。本文主要介紹Harris角點檢測。

2.Harris角點檢測原理

Harris角點檢測原理推導靠一篇部落格講清楚不太現實,這裡介紹一個比較直觀的概念而不是數學推導。
Harris角點檢測是一種直接基於灰度影象的角點提取演算法,穩定性高,尤其對L型角點檢測精度高。
人眼對角點的識別通常是在一個區域性的小區域或小視窗完成的。如下圖所示:

在各個方向上移動這個特徵的小視窗,視窗內區域的灰度發生了較大的變化,那麼久認為在視窗內遇到了角點,如果這個特定的視窗在影象各個方向上移動時,視窗內影象的灰度發生了很大變化,而在另一些方向上沒有發生變化,那麼視窗內的影象可能就是一條直線的線段。

3.opencv API

opencv提供cornerHarris()提取Harris角點。cornerHarris函式對每一個畫素在blockSize x blockSize鄰域內,計算2 x 2梯度的協方差矩陣M(x,y),,接著它計算如下公式

輸出區域性最大值,即為角點。

void cv::cornerHarris   (   InputArray  src,
                            OutputArray     dst,
                            int     blockSize,
                            int     ksize,
                            double  k,
                            int     borderType = BORDER_DEFAULT 
                        )   

src:輸入影象,Mat型別即可,必須為單通道8-bit或浮點型影象
dst:角點檢測的輸出結果,與原影象有相同的尺寸和型別
blockSize:鄰域大小,可以檢視cornerEigenValsAndVecs()得到更多關於blockSize的資訊
ksize:表示Sobel()運算元孔徑大小
**k:**Harris引數,用於判斷是否為角點
borderType:前面已多次介紹,為影象邊界模式,有預設值BORDER_DEFAULT

4.示例程式碼

#include <iostream>
#include <stdlib.h>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>

using namespace std;
using namespace cv;

//定義全域性變數
Mat srcImage, grayImage;
int thresh = 100;
const int threshMaxValue = 255;

//宣告回撥函式
void cornerHarris_detect(int, void*);

int main()
{
    srcImage = imread("harris.jpg");

    //判斷檔案是否載入成功
    if (srcImage.empty())
    {
        cout << "影象載入失敗!";
        return -1;
    }
    else
        cout << "影象載入成功..." << endl << endl;

    cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
    namedWindow("grayImage", WINDOW_AUTOSIZE);
    imshow("grayImage", grayImage);

    createTrackbar("Threshold:", "grayImage", &thresh, threshMaxValue, cornerHarris_detect);
    cornerHarris_detect(thresh, 0);

    waitKey(0);

    return 0;
}

void cornerHarris_detect(int, void*)
{
    Mat dstImage, dst_norm_image, dst_norm_scaled;
    dstImage = Mat::zeros(srcImage.size(), CV_32FC1);

    //檢測器引數設定
    int blockSize = 2;          //鄰域尺寸
    int apertureSize = 3;       //Sobel運算元孔徑
    double k = 0.04;            //Harris引數

    //角點檢測
    cornerHarris(grayImage, dstImage, blockSize, apertureSize, k, BORDER_DEFAULT);

    normalize(dstImage, dst_norm_image, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
    convertScaleAbs(dst_norm_image, dst_norm_scaled);   //強歸一化後的影象線性變換為8位無符號整型

    //繪製角點
    for (int j = 0; j < dst_norm_image.rows; j++)
    {
        for (int i = 0; i < dst_norm_image.cols; i++)
        {
            if ((int)dst_norm_image.at<float>(j,i)>thresh)
            {
                circle(dst_norm_scaled, Point(i, j), 5, Scalar(0), 2, 8, 0);
                circle(grayImage, Point(i, j), 5, Scalar(0, 0, 255), 2, 8, 0);
            }
        }
    }
    namedWindow("cornerHarris", WINDOW_AUTOSIZE);
    imshow("cornerHarris", dst_norm_scaled);
    namedWindow("corner_grayImage", WINDOW_AUTOSIZE);
    imshow("corner_grayImage", grayImage);
}

執行結果

5.參考文獻

相關推薦

opencv學習()影象檢測Harris

1.概述 角點是影象很重要的特徵,對影象圖形的理解和分析有很重要的作用,在保留影象圖形重要特徵的同時,可以有效減少資訊的資料量,使資訊的含量很高,有效提高計算速度,有利於影象的可靠匹配,使得實時處理成為可能。在物體識別、影象匹配、視覺跟蹤和三維重建等方面有很重

opencv學習影象顏色通道分離和融合

在影象處理時,我們接觸到的彩色以RGB居多,為了分析影象在某一通道上的特性,需要將影象的顏色通道進行分離,或者是在對某一顏色通道處理後重新進行融合。opencv提供了split()函式來進行顏色通道的分離,提供了merge()函式來進行顏色通道的融合。 1.s

opencv學習(二)腐蝕與膨脹

腐蝕和膨脹是對二維圖片的進行操作的形態學運算,簡單來講形態學操作就是基於形狀的一系列影象處理操作,通過將結構元素作用於輸入影象來產生輸出影象。腐蝕(Erosion)和膨脹(Dilation)是最基本的形態學操作,他們運用廣泛主要有: . 消除噪聲

opencv學習(三)重對映remap

重對映就是把一個影象中一個為之的畫素放置到另一個圖片指定位置過程。為了完成重對映過程有必要獲得一些插值作為非整數畫素座標,因為原影象與目標影象的畫素座標不是一一對應的。我們通過重對映來表達每個畫素的位置(x, y): g(x, y)=f(h(x,y)) 這裡

opencv學習):直方圖的反向投影

目標:  直方圖反向投影 原理:  反向投影可以用來做影象分割,尋找感興趣區間。它會輸出與輸入影象大小相同的影象,每一個畫素值代表了輸入影象上對應點屬於目標物件的概率,簡言之,輸出影象中畫素值越高的點越可能代表想要查詢的目標。直方圖投影經常與camshift(追蹤演

OpenCV學習:watershed 分水嶺演算法

1. watershed  void watershed( InputArray image, InputOutputArray markers ); 第一個引數 image,必須是一個8bit 3通道彩色影象矩陣序列,第一個引數沒什麼要說的。 關鍵是第二個引數 mar

opencv學習(二八)基本影象閾值操作threshold

在二維數字影象中,其每個畫素點對應了不同的畫素值,其畫素值各不相同。可以對畫素值特定範圍內的影象影象進行操作,劃分這個範圍的值就被稱為影象閾值,它不是一個固定的量級,是根據每幅影象和處理要求動態改變。例如我們可以從影象中利用閾值分割出我們需要的部分,利用其畫素值

OpenCV探索路(五):檢測

回調函數 閾值 source and 類型 幾何 擁有 .com named 角點檢測是計算機視覺系統中用來獲取圖像特征的一種方法。我們都常說,這幅圖像很有特點,但是一問他到底有哪些特點,或者這幅圖有哪些特征可以讓你一下子就識別出該物體,你可能就說不出來了。其實說圖像的特征

opencv學習章 估算影象之間的投影關係

opencv學習 第十章 估算影象之間的投影關係 10.2 計算影象對的基礎矩陣 #include"stdafx.h" #include<iostream> #include<opencv2/core/core.hpp> #include<ope

python實現opencv學習一:影象的開閉操作

作用:刪除影象的小的干擾項原始碼如下:# -*- coding=GBK -*- import cv2 as cv #影象的開閉操作 def open_image(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY

opencv學習(七)影象卷積運算函式filter2D()

接上篇 在其官方文件中,filter2D()函式在掩模板介紹中一筆帶過,我認為該函式應該進行詳細介紹。 對於使用掩模板矩陣(kernel)計算每個畫素值,結合函式filter2D()函式,其定義如下: CV_EXPORTS_W void filter2D(

opencv學習九):Canny邊緣檢測

參考學習連結:https://www.cnblogs.com/mightycode/p/6394810.html 程式碼如下: #匯入cv模組 import cv2 as cv import numpy as np #Canny邊緣提取 def edge_demo(image):

Python+OpenCV學習(15)---Lucas Kanade 光流軌跡跟蹤

利用python學習OpenCV,個人感覺比較方便。函式的形式與C++基本相同,所以切換過來還是比較好的,對於像我這種對python不太熟練的人,使用python的整合開發環境PyCharm進行學習,可以設定斷點除錯,有助於我這類初學者理解掌握。 Lucas Kanad

opencv學習影象放縮與金字塔

在opencv中影象有時候過大導致進行操作時候資訊量過大,耗時較長,一般可以將影象壓縮,然後根據進行初步資訊搜尋,減少搜尋範圍,然後定位可能搜尋區域進行再次分析。opencv有對影象進行放大(向上取樣)和縮小(向下取樣)兩個函式PyrUp()和PyrDown(),可以直接操作

opencv學習(一)尋找凸包convexHull()

1.概述 凸包(Convex Hull)是一個計算幾何(圖形學)中的概念,在一個實數向量空間V中,對於給定集合X,所有包含X的凸集的交集S被稱為X的凸包。 X的凸包可以用X內所有點(x1, x2….xn)的線性組合來構造。在二維歐幾里得空間中,凸包可以想象為

kvm虛擬化學習筆記()kvm虛擬機靜態遷移

虛擬主機 kvm 虛擬機遷移 kvm虛擬化 這裏提到的靜態遷移同是基於KVM虛擬主機之間的遷移,非異構虛擬化平臺的靜態遷移。1.靜態遷移就是虛擬機在關機狀態下,拷貝虛擬機虛擬磁盤文件與配置文件到目標虛擬主機中,實現的遷移。(1)虛擬主機各自使用本地存儲存放虛擬機磁盤文件本文實現基於本地磁盤存儲

Linux學習總結()lnmpphp-fpm相關配置

lnmp pool open_basedir error_log 慢執行日誌 1 php-fpm的進程pool 之前我們在nginx 配置文件裏加入了一句 include vhost/*.conf; 然後實現了各個虛擬主機的隔離,php-fpm 作為一個獨立的服務,有沒有類似的操作呢?

python學習天(前端HTML標簽)

增加 engine 區域 什麽 公司 交叉 頭標簽 pad 問題  今日主要內容:   web標準   瀏覽器內核   HTML介紹,規範,結構詳解   字體標簽   排版標簽   超鏈接   圖片標簽 1.web標準 web準備介紹: w3c:萬維網聯盟組織,用來制

機器學習numpy和matplotlib學習

今天繼續來講numpy中的一些基本函式使用。 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Author : SundayCoder-俊勇 # @File : numpy6.py import numpy as np # n

opencv學習筆記:移動物件統計

步驟: 利用背景消除法找到移動的物體; 預處理:進行中值濾波消除椒鹽噪聲,然後二值化再開操作; 尋找輪廓; 畫出輪廓最小矩形並統計。 #include<opencv2\opencv.hpp> using namespace cv; using namesp