Home » » Introduction to SIFT (Scale-Invariant Feature Transform)

Introduction to SIFT (Scale-Invariant Feature Transform)


Gambar dibawah ini menggunakan metode SIFT coba amati sejenak kawan
pada gambar tersebut terlihat 1 gambar yang akan dicari dan satunya gambar yang berisi campuran gambar lain, nah dengan metode ini kalian dapat menentukan posisi dari gambar tersebut.

Scale Invariant Feature Transform (SIFT), yaitu fitur untuk mengambil ciri khas atau titik uniq dari suatu gambar dari skala keypoint, yang mengekstrak keypoint dan menghitung descriptor atau vektornya

Karena keypoint harus dicari dengan perbedaan skala, SIFT menggunakan gaussian blurring, maka akan didapatkan X Y a yang artinya ada potensi keypoint pada titik tersebut. SIFT ini menggunakan Difference of Gaussian yang diperoleh sebagai perbedaan Gaussian Blurring dari 2 gambar yang berbeda. Proses ini dilakukan untuk oktaf yang berbeda pada Piramida Gaussian, terlihat seperti gambar dibawah.

Setelah keypoint ditemukan, dibandingkan dengan 8 pixel tetangga dan 9 pixel sebelum dan sesudah skala.

Agar hasil lebih akurat, dilakukan tresshold contrast. Setelahnya dilakukan rotasi gambar untuk mengambil pixel tetangga, magnitude dan gradient magnitude. Histogram dibuat dengan 36 tempat yang mewakili 360 derajat, peak tertinggi dalam histogram diambil dan peak apaun diatas 0% terhitung orientasi. Hal ini membuat hasil menjadi stabil.
Lokalisasi Keypoint adalah setelah lokasi keypoint ditemukan, maka keypoint tersebut harus disempurnakan agar mendapatkan hasil yang lebih akurat. Perluasan yang digunakan adalah perluasan skala ruang Taylor yang lebih kuat, dan jika intensitas kurang dari nilai ambang (0,03 per paper), maka akan ditolak. Ambang batas ini disebut contrastThreshold
Orientation Assignment adalah pengaturan orientasi ditujukan untuk mendapatkan perubahan dari rotasi gambar. Agar nantinya keypoint tetap terdeteksi walaupun gambar sudah diubah orientasinya
Keypoint Descriptor adalah pengambilan nilai matriks dari keypoint yang telah dideteksi, hal ini bertujuan agar dalam penggambaran vektor dari keypoint sesuai dengan nilai vektor dalam gambar. Dan yang terakhir yakni Keypoint Matching, hal ini bertujuan untuk mencocokkan keypoint yang telah dideteksi antara 2 gambar yang berbeda, agar dapat ditarik garis antara 2 keypoint tersebut

Oke langsung ke caranya :
DOWNLOAD APLIKASI CMAKE dimana aplikasi ini unuk menngekstrak Library yang ada pada OpenCV.

Buka CMake.exe pastikan berjalan dalam mode Administrator. Sebaiknya laptop terkoneksi dengan internet dan tanpa proxy

 Akan muncul jendela aplikasi sebagai berikut:


.
Isikan letak folder opencv pada source code yang akan di build (sesuai dengan hasil extract) dan folder untuk hasil build.

Setelah terisi tekan tombol Configure

Uncheck, WITH_CUBLAS, BUILD_DOC, CUILD EXAMPLES, WITH_OPENGL, WITH_TBB, WITH_IPP, BUILD_TBB, Kemudian tekan Configure



Setelah configuring done dan tidak muncul error (tidak berwarna merah) maka klik Generate.
 Setelah muncul notifikasi Generating done maka klik button Open Project akan terbuka aplikasi Visual Studio (sesuai dengan generator yang dipilih) yang akan menampilkan project OPENCV. Bisa juga dengan membuka folder C:\opencv\OpenCV.sln

 Pada Visual Studio di tab Solution Explorer akan muncul seperti gambar berikut :

Atur untuk debug 32 bit

Build solution pada ZERO_CHECK, ALL_BUILD, INSTALL dengan debug 32 bit




 Melakukan hal yang sama pada relese namun dengan mengganti link library khusus release

Setelah Instalasi selesai, maka akan muncul folder berikut :
Buat path pada environment windows Pada jendela System Properties pilih Environment Variables, Akan muncul jendela berikut :


Tambahkan C:\OpenCV3.1\install\x64\vc12\bin pada Path

Klik OK sampai seluruh jendea tertutup. Sampai sini seluruh proses instalasi OPENCV telah selesai.



Membuat new project pada visual studio

Buka visual studio dan buat project baru

Pada jendela utama pilih Project -> … Properties

Pada VC++ Directories, tambahkan pada Include Directories C: \OpenCV3.1\new_build\install\include Tambahkan pada Library Directories  : \OpenCV3.1\new_build\install\x86\vc12\lib Untuk 32 bit

Pada Linker -> Input -> Additional Dependencies tambahkan
-          opencv_ts310d.lib
-          opencv_world310d.lib

SCRIPT PROGRAM

----------------------------------------------------------------------------------------------------------------
/       Taufiq Choirul Amri
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace cv::xfeatures2d;

int main()
{

VideoCapture cap(0); // open the default camera  
if (!cap.isOpened())  // check if we succeeded   
return -1;

for (;;)  {
Mat img_2;
cap >> img_2;
Mat img_1 = imread("g.jpg", CV_LOAD_IMAGE_COLOR);
//Mat img_2 = imread("a.jpg", CV_LOAD_IMAGE_COLOR);
//-- Step 1: Detect the keypoints using SIFT Detector
int minHessian = 50;

//SIFTFeatureDetector detector(minHessian);
Ptr<SIFT> detector = SIFT::create(minHessian);

std::vector<KeyPoint> keypoints_1, keypoints_2;

detector->detect(img_1, keypoints_1);
detector->detect(img_2, keypoints_2);

//-- Step 2: Calculate descriptors (feature vectors)
//SurfDescriptorExtractor extractor;
Ptr<SIFT> extractor = SIFT::create();

Mat descriptors_1, descriptors_2;

extractor->compute(img_1, keypoints_1, descriptors_1);
extractor->compute(img_2, keypoints_2, descriptors_2);

//-- Step 3: Matching descriptor vectors with a brute force matcher
BFMatcher matcher(NORM_L2);
std::vector< DMatch > matches;
matcher.match(descriptors_1, descriptors_2, matches);

//-- Draw matches
Mat img_matches;
drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);

//-- Show detected matches
resize(img_matches, img_matches, Size(640, 480));
imshow("Matches", img_matches);

if (waitKey(1) >= 0) break;
//waitKey(0);
}
return 0;
----------------------------------------------------------------------------------------------------------------
Hasil yang akan ditampilkan jika menggunakan Kamera dengan program diatas:
gambar fd.jpg dan kamera

jika menggunakan 2 gambar yaitu dengan menghapus fungsi kamera dan membuka comment dari img_2 maka hasilnya : 
gambar ini adalah gambar a.jpg dan g.jpg

Cukup dulu ulasan tentang SIFT, terkadang memang hasil dari gambar kurang tepat karena faktor cahaya dan kesamaan warna antar 2 objek yang di hasilkan. semoga bermanfaat 

0 komentar:

Post a Comment