Listing Program
public partial class MainWindow : Window {
MainSearchWindow win = new MainSearchWindow(); win.Show();
}
void btnhelp_Click(object sender, RoutedEventArgs e) {
HelpWindow win2 = new HelpWindow(); win2.Show();
{ private BackgroundWorker IndexBgWorker; private BackgroundWorker QueryBgWorker; private Stopwatch _stopWatch;
public MainSearchWindow() {
InitializeComponent(); }
private void frmMainSearch_Loaded(object sender, RoutedEventArgs e) {
InitIndexDirectory();
cmbAlgo.SelectedIndex = Properties.Settings.Default.SelectedAlgo; SelectedAlgo = GetSelectedAlgo();
cmbSurfApproach.SelectedIndex = Properties.Settings.Default.SurfAlgo; }
private void InitIndexDirectory() {
string indexDirecroty = Properties.Settings.Default.IndexFolder; if (string.IsNullOrEmpty(indexDirecroty))
private void SetIndexDirectory(string folder) {
Properties.Settings.Default.IndexFolder = folder;
IndexBgWorker.DoWork += new DoWorkEventHandler(IndexBgWorker_DoWork); IndexBgWorker.ProgressChanged += new ProgressChangedEventHandler
(IndexBgWorker_ProgressChanged);
IndexBgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (IndexBgWorker_RunWorkerCompleted);
IndexBgWorker.WorkerReportsProgress = true; IndexBgWorker.WorkerSupportsCancellation = true; QueryBgWorker = new BackgroundWorker();
QueryBgWorker.DoWork += new DoWorkEventHandler(QueryBgWorker_DoWork); QueryBgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler (QueryBgWorker_RunWorkerCompleted);
Properties.Settings.Default.SurfAlgo = cmbSurfApproach.SelectedIndex; Properties.Settings.Default.Save();
public FileInfo[] getFiles(string SourceFolder, string Filter, System.IO.SearchOption searchOption)
{
DirectoryInfo di = new DirectoryInfo(SourceFolder);
surfSetting.HessianThresh = Convert.ToDouble((cmbSurfThreshold.SelectedItem as ListBoxItem).Content);
private void cmbAlgo_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e) {
Properties.Settings.Default.SelectedAlgo = cmbAlgo.SelectedIndex; Properties.Settings.Default.Save();
string _folderName = IndexDirectory;
dlg1.RootFolder = System.Environment.SpecialFolder.MyComputer; System.Windows.Forms.DialogResult result = dlg1.ShowDialog();
private void btnIndex_Click(object sender, RoutedEventArgs e) {
{
private void IndexBgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbIndex.Value = e.ProgressPercentage + 1; }
//004b
else
private void AccordSurfAlgoIndexing(SurfSettings surfSetting) {
var imageFiles = getFiles(IndexDirectory, "*.gif|*.jpg|*.png|*.bmp|*.jpeg", SearchOption.TopDirectoryOnly);
openSurfDetails = mi;
private void mnuOpenSurfDetail_Click(object sender, RoutedEventArgs e) {
bool isObserverImagePathFound = !string.IsNullOrWhiteSpace(selectedObserverImage); isObserverImagePathFound = isObserverImagePathFound &&
File.Exists(selectedObserverImage);
bool isModelImagePathFound = !string.IsNullOrWhiteSpace(selectedModelImage); isModelImagePathFound = isObserverImagePathFound &&
} }
private void mnuOpenPic_Click(object sender, RoutedEventArgs e) {
bool isObserverImagePathFound = !string.IsNullOrWhiteSpace(selectedObserverImage); isObserverImagePathFound = isObserverImagePathFound &&
File.Exists(selectedObserverImage);
private void btnSelectQueryImage_Click(object sender, RoutedEventArgs e) {
private void btnQueryImage_Click(object sender, RoutedEventArgs e) {
if (string.IsNullOrWhiteSpace(Properties.Settings.Default.QueryFolder)) {
dlg.InitialDirectory = IndexDirectory; }
else {
dlg.InitialDirectory = Properties.Settings.Default.QueryFolder; }
// Set filter for file extension and default file extension dlg.DefaultExt = ".jpg";
dlg.Filter = "JPG Files (*.jpg)|*.jpg|JPEG Files (*.jpeg)|*.jpeg|PNG Files (*.png)|*.png|JPG Files (*.jpg)|*.jpg|GIF Files (*.gif)|*.gif";
// Display OpenFileDialog by calling ShowDialog method Nullable<bool> result = dlg.ShowDialog();
// Get the selected file name and display in a TextBox if (result == true)
{
// Open document
queryImageFilePath = dlg.FileName; txtQuery.Text = queryImageFilePath; QueryImageFullPath = queryImageFilePath;
imqQuery.Source = new BitmapImage(new Uri(queryImageFilePath)); Properties.Settings.Default.QueryFolder =
Path.GetDirectoryName(queryImageFilePath); Properties.Settings.Default.Save(); }
return queryImageFilePath; }
//009
private void QueryBgWorker_DoWork(object sender, DoWorkEventArgs e) {
this.Dispatcher.Invoke(() => {
btnSelectQueryImage.IsEnabled = false; btnQueryImage.IsEnabled = false; });
private void WriteQueryStatus(string msg)
private int GetNumberOfImageFilesInIndexDirectory() {
FileInfo[] imageFiles = getFiles(IndexDirectory, "*.gif|*.jpg|*.png|*.bmp|*.jpeg", SearchOption.TopDirectoryOnly);
/// Interaction logic for AccordSurf.xaml /// </summary>
Bitmap returnBitmap;
List<IPoint> ipts1 = new List<IPoint>(); List<IPoint> ipts2 = new List<IPoint>(); public string ModelImagePath { get; set; }
public AccordSurfWindow(string modelImagePath, string observerImagePath, SurfSettings setting) : this()
private void AccordSurfCompareWin_Loaded(object sender, RoutedEventArgs e) {
ShowImage(); }
protected void ShowImage() {
bool isModelImageMissing = string.IsNullOrEmpty(ModelImagePath); bool isObserverImageMissing = string.IsNullOrEmpty(ObserverImagePath); if (isModelImageMissing || isObserverImageMissing)
return;
}
private Bitmap CompareAndDrawImage(Bitmap modelImage, Bitmap observedImage, SurfSettings setting)
IntegralImage iimg1 = IntegralImage.FromImage(modelImage); ipts1 = FastHessian.getIpoints(hessianThreshold2, 5, 2, iimg1);
SurfDescriptor.DecribeInterestPoints(ipts1, false, false, iimg1);
IntegralImage iimg2 = IntegralImage.FromImage(observedImage); ipts2 = FastHessian.getIpoints(hessianThreshold2, 5, 2, iimg2);
SurfDescriptor.DecribeInterestPoints(ipts2, false, false, iimg2);
watch1.Stop();
}
private void PaintSURF(Bitmap img1, Bitmap img2, List<IPoint>[] matches) { pt.X, pt.Y), new System.Drawing.Point(x + pt.X + ptR.X, pt.Y + ptR.Y));
g.Dispose(); returnBitmap = bmp; }
} }
4. IntegralImage.cs using System;
using System.Collections.Generic; using System.Linq;
using System.Text; using System.Drawing; namespace Gataulah {
[Serializable] public class IntegralImage {
const float cR = .2989f; const float cG = .5870f; const float cB = .1140f; internal float[,] matriks; public int lebar, tinggi; public float this[int y, int x] {
get { return matriks[y, x]; } set { matriks[y, x] = value; } }
private IntegralImage(int lebar, int tinggi) {
this.lebar = lebar; this.tinggi = tinggi;
this.matriks = new float[tinggi, lebar]; }
//01
public static IntegralImage FromImage(BitPeta image) {
float barissum = 0;
for (int x = 0; x < image.lebar; x++) {
Color c = image.GetPixel(x, 0);
barissum += (cR * c.R + cG * c.G + cB * c.B) / 255f; pic[0, x] = barissum;
}
for (int y = 1; y < image.tinggi; y++) {
barissum = 0;
for (int x = 0; x < image.lebar; x++) {
Color c = image.GetPixel(x, y);
barissum += (cR * c.R + cG * c.G + cB * c.B) / 255f; pic[y, x] = barissum + pic[y - 1, x];
} }
return pic; }
public float BoxIntegral(int baris, int col, int bariss, int cols) {
int r1 = Math.Min(baris, tinggi) - 1; int c1 = Math.Min(col, lebar) - 1;
int r2 = Math.Min(baris + bariss, tinggi) - 1; int c2 = Math.Min(col + cols, lebar) - 1; float A = 0, B = 0, C = 0, D = 0;
if (r1 >= 0 && c1 >= 0) A = matriks[r1, c1]; if (r1 >= 0 && c2 >= 0) B = matriks[r1, c2]; if (r2 >= 0 && c1 >= 0) C = matriks[r2, c1]; if (r2 >= 0 && c2 >= 0) D = matriks[r2, c2]; return Math.Max(0, A - B - C + D);
}
public float HaarX(int baris, int kolom, int size) {
return BoxIntegral(baris - size / 2, kolom, size, size / 2)
}
public float HaarY(int baris, int kolom, int size) {
return BoxIntegral(baris, kolom - size / 2, size / 2, size)
- 1 * BoxIntegral(baris - size / 2, kolom - size / 2, size / 2, size); }
} }
5. FastHessian.cs using System;
using System.Collections.Generic; using System.Linq;
using System.Text;
using MathNet.Numerics.LinearAlgebra; namespace Gataulah
{
[Serializable] public class FastHessian {
private class simpananLayer {
public int lebar, tinggi, langkah, saring; public float[] simpanannya;
public byte[] laplasian;
public simpananLayer(int lebar, int tinggi, int langkah, int saring) {
this.lebar = lebar; this.tinggi = tinggi; this.langkah = langkah; this.saring = saring;
simpanannya = new float[lebar * tinggi]; laplasian = new byte[lebar * tinggi]; }
public byte getlaplasian(int baris, int kolom) {
return laplasian[baris * lebar + kolom]; }
{
int scale = this.lebar / src.lebar;
return laplasian[(scale * baris) * lebar + (scale * kolom)]; }
public float getsimpanan(int baris, int kolom) {
return simpanannya[baris * lebar + kolom]; }
public float getsimpanan(int baris, int kolom, simpananLayer src) {
int scale = this.lebar / src.lebar;
return simpanannya[(scale * baris) * lebar + (scale * kolom)]; }
}
public static List<IPoint> getIpoints(float thr, int oktaf, int init_contoh, IntegralImage img) {
FastHessian fh = new FastHessian(thr, oktaf, init_contoh, img); return fh.getIpoints();
}
public FastHessian(float thr, int oktaf, int init_contoh, IntegralImage img) {
this.thr = thr; this.oktaf = oktaf;
this.init_contoh = init_contoh; this.img = img;
}
private float thr; private int oktaf; private int init_contoh; private IntegralImage img; private List<IPoint> ipts;
private List<simpananLayer> simpananPeta; public List<IPoint> getIpoints()
{
int [,] saring_Peta = {{0,1,2,3}, {1,3,4,5}, {3,5,6,7}, {5,7,8,9}, {7,9,10,11}}; if (ipts == null) ipts = new List<IPoint>();
simpananLayer b, m, t;
for (int o = 0; o < oktaf; ++o) for (int i = 0; i <= 1; ++i) {
b = simpananPeta[saring_Peta[o,i]]; m = simpananPeta[saring_Peta[o,i+1]]; t = simpananPeta[saring_Peta[o,i+2]]; for (int r = 0; r < t.tinggi; ++r)
{
for (int c = 0; c < t.lebar; ++c) {
if (isExtremum(r, c, t, m, b)) {
interpolateExtremum(r, c, t, m, b); }
} } }
return ipts; }
void buildsimpananPeta() {
if (simpananPeta == null) simpananPeta = new List<simpananLayer>(); else simpananPeta.Clear();
int w = (img.lebar / init_contoh); int h = (img.tinggi / init_contoh); int s = (init_contoh);
if (oktaf >= 1) {
simpananPeta.Add(new simpananLayer(w, h, s, 9)); simpananPeta.Add(new simpananLayer(w, h, s, 15)); simpananPeta.Add(new simpananLayer(w, h, s, 21)); simpananPeta.Add(new simpananLayer(w, h, s, 27)); }
if (oktaf >= 2) {
if (oktaf >= 3)
buildsimpananLayer(simpananPeta[i]); }
}
Dxx *= inverse_area; Dyy *= inverse_area; Dxy *= inverse_area;
rl.simpanannya[index] = (Dxx * Dyy - 0.81f * Dxy * Dxy); rl.laplasian[index] = (byte)(Dxx + Dyy >= 0 ? 1 : 0);
} } }
bool isExtremum(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b) {
int layerBorder = (t.saring + 1) / (2 * t.langkah);
if (r <= layerBorder || r >= t.tinggi - layerBorder || c <= layerBorder || c >= t.lebar - layerBorder)
return false;
float candidate = m.getsimpanan(r, c, t); if (candidate < thr)
return false;
for (int rr = -1; rr <= 1; ++rr) {
for (int cc = -1; cc <= 1; ++cc) {
if (t.getsimpanan(r + rr, c + cc) >= candidate ||
((rr != 0 || cc != 0) && m.getsimpanan(r + rr, c + cc, t) >= candidate) || b.getsimpanan(r + rr, c + cc, t) >= candidate)
{
return false; }
} }
return true; }
void interpolateExtremum(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b) {
matriks D = matriks.Create(BuildDerivative(r, c, t, m, b)); matriks H = matriks.Create(BuildHessian(r, c, t, m, b)); matriks Hi = H.Inverse();
matriks Of = -1 * Hi * D;
int saringlangkah = (m.saring - b.saring);
private double[,] BuildDerivative(int r, int c, simpananLayer t, simpananLayer m, simpananLayer b)
H[1, 1] = dyy; H[1, 2] = dys; H[2, 0] = dxs; H[2, 1] = dys; H[2, 2] = dss; return H; }
} }
6. EuclideanDistance.cs using System;
using System.Collections.Generic; using System.Text;
namespace Gataulah {
public class Utils {
private const float FLT_MAX = 3.402823466e+38F;
public static List<IPoint>[] getMatches(List<IPoint> ipts1, List<IPoint> ipts2) {
double dist; double d1, d2;
IPoint match = new IPoint();
List<IPoint>[] matches = new List<IPoint>[2]; matches[0] = new List<IPoint>();
matches[1] = new List<IPoint>(); for (int i = 0; i < ipts1.Count; i++) {
d1 = d2 = FLT_MAX;
for (int j = 0; j < ipts2.Count; j++) {
dist = EuclideanDistance(ipts1[i], ipts2[j]); if (dist < d1)
{
d2 = d1; d1 = dist;
}
else if (dist < d2) {
d2 = dist; }
}
if (d1 / d2 < 0.77) {
matches[0].Add(ipts1[i]); matches[1].Add(match); }
}
return matches; }
public static double EuclideanDistance(IPoint ip1, IPoint ip2) {
int count = 0;
double sum = 0.0;
count = ip1.descriptor.Length;
for (int i = 0; i < count; i++) {
sum += Math.Pow(Math.Abs(ip1.descriptor[i] - ip2.descriptor[i]), 2); }
return Math.Sqrt(sum); }
CURRICULUM VITAE
Nama : Aulia Tarindah Putri
Alamat Sekarang : Jln. Gn. Leuser Blok A3 No.31 Tebing Tinggi Alamat Orang Tua : Jln. Gn. Leuser Blok A3 No.31 Tebing Tinggi Telp/ Hp : +6282366661549
Email : auliatarindahputri@gmail.com
Riwayat Pendidikan
2012 – 2016 : S1 Ilmu Komputer Universitas Sumatera Utara, Medan 2009 – 2012 : SMA Negeri 1 Tebing Tinggi
2006 – 2009 : SMP Negeri 1 Tebing Tinggi 2000 – 2006 : SD R.A. Kartini Sei Rampah
Keahlian
Bahasa : Indonesia, Inggris Pemrograman : C#, Java Android Database : MySql
Desain : Photoshop, Corel Draw Perkantoran : Microsoft Office
Kursus yang diikuti
TOEFL, IELTS
Pengalaman Organisasi
[2013– 2015] Imilkom USU
[2014– 2015] PEMA Fasilkom-TI USU
Pengalaman Kepanitiaan
[2012] Sekretaris Dies Natalis IMILKOM 2012
[2015] Ketua Panitia Seminar Karir PT. Paragon - Wardah
Seminar