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:
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
.
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;
#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