Java OpenCV圖像處理之SIFT角點檢測詳解
介紹
在某些情況下對圖像進行縮放後,角點信息可能會丟失,這時候Harri便不能檢測到所有的角點。SIFT(scale-invariant feature transform) 剛好克服瞭這個問題,對圖像特征的檢測,盡量不受圖像尺寸變化的影響.SIFT並不直接檢測關鍵點。
其中關鍵點的檢測是由DOG(Difference of Gaussians)檢測完成的(DOG是通過不同的高斯濾波器對同一張圖像進行處理,來得到關鍵點的)。SIFT僅通過特征向量來描述特征點周圍的像素情況。
示例代碼
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 測試文件 * @Package com.xu.Image * @author: hyacinth * @date: 2022年2月18日12點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 角點檢測 * * @return void * @Author: hyacinth * @Title: harris * @Description: TODO * @date: 2022年2月18日12點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 角點檢測", src); HighGui.waitKey(0); } }
效果圖
補充
角點檢測除瞭有SIFT算法,還有FAST算法
FAST(Features from Accelerated Segment Test)算法會在像素周圍繪制一個圓,圓內包含16個像素,FAST算法是將圓內的像素分別與加上一個閾值的圓心像素作比較,若圈內出現連續的幾個像素比加上一個閾值的像素還亮或是暗,則可認為圓心是角點.FAST是一個很有效率的檢測算法,但是需要確定閾值參數來檢測角點。
BRIEF(Binary Robust Independent Elementary Features)在OpenCV中主要是通過detectAndCompute()來實現,這個函數包含兩個部分,檢測和計算,同時也返回兩個結果.一個是檢測到的關鍵點,一個是描述符.SIFT和SURF也是這樣.關鍵點的描述符包含瞭圖像的關鍵信息,可看作是圖像的另一種表現形式,在比較兩個圖像的時候可以通過比較兩個圖像的特征描述來實現.也可以用來做圖像特征的匹配。
下面將展示通過FAST算法進行角點檢測的示例代碼,需要的可以參考一下
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 測試文件 * @Package com.xu.Image * @author: hyacinth * @date: 2022年2月18日12點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 角點檢測", src); HighGui.waitKey(0); } }
效果圖
到此這篇關於Java OpenCV圖像處理之SIFT角點檢測詳解的文章就介紹到這瞭,更多相關Java OpenCV 角點檢測內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java OpenCV圖像處理之自定義圖像濾波算子
- SpringBoot整合OpenCV的實現示例
- 基於OpenCV與JVM實現矩陣處理圖像
- Java圖像處理之獲取用戶感興趣的區域
- 基於Python和openCV實現圖像的全景拼接詳細步驟