CornerHarris函數詳解

一、CornerHarris概述

CornerHarris函數是一種常用的角點檢測算法,又稱Harris角點檢測算法。其基本思想是利用圖像像素點的灰度值變化情況,通過計算像素梯度的變化率,來判斷圖像上的角點位置。

CornerHarris函數的定義形式如下:

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

參數含義如下:

  • src: 輸入圖像
  • dst: 輸出圖像,包含每個像素的響應強度
  • blockSize: 計算協方差矩陣時每個小區域的大小
  • ksize: Sobel算子的大小
  • k: Harris算子中的自由參數
  • borderType: 圖像邊界處理方式,默認為BORDER_DEFAULT

二、CornerHarris的實現原理

1. Sobel算子計算圖像梯度

CornerHarris函數首先利用Sobel算子計算圖像每個像素的梯度值,而Sobel算子本質上是一個二維濾波器。

Sobel算子的定義形式如下:

void CV_EXPORTS Sobel(InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3, double scale=1, double delta=0, int borderType=BORDER_DEFAULT);

參數含義如下:

  • src: 輸入圖像
  • dst: 輸出圖像,包含每個像素的梯度強度
  • ddepth: 輸出圖像的數據類型
  • dx: x方向的差分階數
  • dy: y方向的差分階數
  • ksize: Sobel算子的大小
  • scale: 縮放因子
  • delta: 偏移量
  • borderType: 圖像邊界處理方式,默認為BORDER_DEFAULT

2. 協方差矩陣計算

利用Sobel算子計算得到的梯度值,我們可以計算圖像局部區域的協方差矩陣,其中包括x方向的梯度統計值和y方向的梯度統計值。

協方差矩陣的計算公式如下:

3. Harris響應函數計算

接下來,我們需要計算每個像素的Harris響應函數值:

其中,k為Harris算子中的自由參數,一般取值為0.04到0.06之間。

4. 非極大值抑制

通過計算得到每個像素的Harris響應函數值,我們現在需要篩選出角點的位置。通常情況下,我們會選擇對響應函數值較大的、極值點進行保留,而非極大值抑制則是一種常用的處理方式。

三、CornerHarris應用場景

1. 角點檢測

作為一種角點檢測算法,CornerHarris的主要應用場景便是在計算機視覺領域中。例如,我們可以利用CornerHarris算法檢測攝像頭捕捉到的圖像中的人臉位置,並在人臉位置處添加特定的處理,如眼睛的識別、人臉的三維重建、人臉素描的生成等。

2. 物體跟蹤

除了角點檢測之外,CornerHarris還可以廣泛應用於物體跟蹤等其他方面。例如,在移動機器人的路徑規劃中,我們可以藉助CornerHarris算法來檢測機器人行進的路徑上是否有較為複雜的轉角。

3. 三維重建

在進行圖像處理和計算機視覺方面的研究時,CornerHarris算法還可以幫助我們進行三維重建等工作。例如,在建模一個房間的時候,我們可以在每個角落中運用CornerHarris算法來檢測出每個牆壁之間的空間並加以準確描述。

四、CornerHarris代碼示例

1. Python代碼

import cv2
import numpy as np

# Load the image
img = cv2.imread('chessboard.png')

# Convert the image to grayscale
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# Detect Harris corners
dst = cv2.cornerHarris(gray,2,3,0.04)

# Threshold to obtain the optimal value
dst = cv2.dilate(dst,None)
ret, dst = cv2.threshold(dst,0.01*dst.max(),255,0)

# Draw corners on the original image
img[dst>0.01*dst.max()] = [0,0,255]

# Display the image
cv2.imshow('dst',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

2. C++代碼

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include 

using namespace cv;
using namespace std;

int main()
{
    // Load the image
    Mat src = imread("chessboard.png");

    // Convert the image to grayscale
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);

    // Detect Harris corners
    Mat dst;
    int blockSize = 2;
    int ksize = 3;
    double k = 0.04;
    cornerHarris(gray, dst, blockSize, ksize, k);

    // Threshold to obtain the optimal value
    Mat dst_norm, dst_norm_scaled;
    normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
    convertScaleAbs(dst_norm, dst_norm_scaled);

    // Draw corners on the original image
    for (int i = 0; i < dst_norm.rows; i++)
    {
        for (int j = 0; j < dst_norm.cols; j++)
        {
            if ((int)dst_norm.at(i, j) > 100)
            {
                circle(src, Point(j, i), 5, Scalar(0, 0, 255), 2, 8, 0);
            }
        }
    }

    // Display the image
    imshow("dst", src);
    waitKey(0);

    return 0;
}

原創文章,作者:ZXCS,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/149202.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZXCS的頭像ZXCS
上一篇 2024-11-04 17:51
下一篇 2024-11-04 17:51

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python函數名稱相同參數不同:多態

    Python是一門面向對象的編程語言,它強烈支持多態性 一、什麼是多態多態是面向對象三大特性中的一種,它指的是:相同的函數名稱可以有不同的實現方式。也就是說,不同的對象調用同名方法…

    編程 2025-04-29
  • 分段函數Python

    本文將從以下幾個方面詳細闡述Python中的分段函數,包括函數基本定義、調用示例、圖像繪製、函數優化和應用實例。 一、函數基本定義 分段函數又稱為條件函數,指一條直線段或曲線段,由…

    編程 2025-04-29

發表回復

登錄後才能評論