溫馨提示×

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

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

Java?OpenCV中SIFT角點(diǎn)檢測(cè)的方法

發(fā)布時(shí)間:2022-02-18 17:12:24 來(lái)源:億速云 閱讀:157 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹“Java OpenCV中SIFT角點(diǎn)檢測(cè)的方法”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“Java OpenCV中SIFT角點(diǎn)檢測(cè)的方法”文章能幫助大家解決問(wèn)題。

介紹

在某些情況下對(duì)圖像進(jìn)行縮放后,角點(diǎn)信息可能會(huì)丟失,這時(shí)候Harri便不能檢測(cè)到所有的角點(diǎn)。SIFT(scale-invariant feature transform) 剛好克服了這個(gè)問(wèn)題,對(duì)圖像特征的檢測(cè),盡量不受圖像尺寸變化的影響.SIFT并不直接檢測(cè)關(guān)鍵點(diǎn)。

其中關(guān)鍵點(diǎn)的檢測(cè)是由DOG(Difference of Gaussians)檢測(cè)完成的(DOG是通過(guò)不同的高斯濾波器對(duì)同一張圖像進(jìn)行處理,來(lái)得到關(guān)鍵點(diǎn)的)。SIFT僅通過(guò)特征向量來(lái)描述特征點(diǎn)周圍的像素情況。

示例代碼

package com.xu.opencv;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.Scalar;
import org.opencv.features2d.Features2d;
import org.opencv.features2d.SIFT;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @Title: Image.java
 * @Description: OpenCV-4.0.0 測(cè)試文件
 * @Package com.xu.Image
 * @author: hyacinth
 * @date: 2022年2月18日12點(diǎn)20分
 * @version: V-1.0.0
 * @Copyright: 2019 hyacinth
 */
public class Image {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        sift();
    }

    /**
     * OpenCV-4.1.0 SIFT 角點(diǎn)檢測(cè)
     *
     * @return void
     * @Author: hyacinth
     * @Title: harris
     * @Description: TODO
     * @date: 2022年2月18日12點(diǎn)32分
     */
    public static void sift() {
        Mat src = Imgcodecs.imread("D:\\OneDrive\\桌面\\1.png");
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
        SIFT sift = SIFT.create(8000);
        MatOfKeyPoint point = new MatOfKeyPoint();
        sift.detect(gray, point);
        Features2d.drawKeypoints(src, point, src, new Scalar(0, 0, 255), Features2d.DrawMatchesFlags_DRAW_RICH_KEYPOINTS);
        HighGui.imshow("SIFT 角點(diǎn)檢測(cè)", src);
        HighGui.waitKey(0);
    }
}

效果圖

Java?OpenCV中SIFT角點(diǎn)檢測(cè)的方法

補(bǔ)充

角點(diǎn)檢測(cè)除了有SIFT算法,還有FAST算法

FAST(Features from Accelerated Segment Test)算法會(huì)在像素周圍繪制一個(gè)圓,圓內(nèi)包含16個(gè)像素,F(xiàn)AST算法是將圓內(nèi)的像素分別與加上一個(gè)閾值的圓心像素作比較,若圈內(nèi)出現(xiàn)連續(xù)的幾個(gè)像素比加上一個(gè)閾值的像素還亮或是暗,則可認(rèn)為圓心是角點(diǎn).FAST是一個(gè)很有效率的檢測(cè)算法,但是需要確定閾值參數(shù)來(lái)檢測(cè)角點(diǎn)。

BRIEF(Binary Robust Independent Elementary Features)在OpenCV中主要是通過(guò)detectAndCompute()來(lái)實(shí)現(xiàn),這個(gè)函數(shù)包含兩個(gè)部分,檢測(cè)和計(jì)算,同時(shí)也返回兩個(gè)結(jié)果.一個(gè)是檢測(cè)到的關(guān)鍵點(diǎn),一個(gè)是描述符.SIFT和SURF也是這樣.關(guān)鍵點(diǎn)的描述符包含了圖像的關(guān)鍵信息,可看作是圖像的另一種表現(xiàn)形式,在比較兩個(gè)圖像的時(shí)候可以通過(guò)比較兩個(gè)圖像的特征描述來(lái)實(shí)現(xiàn).也可以用來(lái)做圖像特征的匹配。

下面將展示通過(guò)FAST算法進(jìn)行角點(diǎn)檢測(cè)的示例代碼,需要的可以參考一下

package com.xu.opencv;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfKeyPoint;
import org.opencv.core.Scalar;
import org.opencv.features2d.Features2d;
import org.opencv.features2d.ORB;
import org.opencv.features2d.SIFT;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

/**
 * @Title: Image.java
 * @Description: OpenCV-4.0.0 測(cè)試文件
 * @Package com.xu.Image
 * @author: hyacinth
 * @date: 2022年2月18日12點(diǎn)20分
 * @version: V-1.0.0
 * @Copyright: 2019 hyacinth
 */
public class Image {

    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        fast();
    }

    public static void fast() {
        Mat src = Imgcodecs.imread("D:\\OneDrive\\桌面\\5.jpeg");
        Mat gray = new Mat();
        Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
        ORB orb = ORB.create(500, 1.2f, 8, 31, 0, 2, ORB.HARRIS_SCORE, 31, 20);
        MatOfKeyPoint point = new MatOfKeyPoint();
        orb.detect(gray, point);
        Features2d.drawKeypoints(src, point, src, new Scalar(0, 0, 255), Features2d.DrawMatchesFlags_DRAW_RICH_KEYPOINTS);
        HighGui.imshow("FAST 角點(diǎn)檢測(cè)", src);
        HighGui.waitKey(0);
    }
}

效果圖

Java?OpenCV中SIFT角點(diǎn)檢測(cè)的方法

關(guān)于“Java OpenCV中SIFT角點(diǎn)檢測(cè)的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向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