· Buat aplikasi AppWizard dan beri nama project dengan Lat17
· Buat disain dialog seperti pada gambar berikut dengan 6 buah control picture dan 7 buah button.
·
Ubah properti control dan tambahkan class variabel control tipe dan membernya seperti pada tabel berikut:
· Tambahkan program untuk melakukan konversi dari data pixel ke RGB dan dari data RGB ke data Pixel. Seperti berikut.
// merubah data pixel ke RGB
void WarnaToRGB(long
int warna,int *Red, int *Green, int *Blue)
{
*Red = warna & 0x000000FF;
*Green = (warna &
0x0000FF00) >> 8;
*Blue = (warna &
0x00FF0000) >> 16
;
}
//merubah RGB
ke data pixel
long int RGBToWarna(int Re
d, int Green, int Blue)
{
return(Red+(Green<<8)+(blue<<1
6));
}
· Tambahkan program pada button1 click seperti di bawah ini,yang berfungsi untuk melakukan load gambar angka1 (Load Angka [1]).
void
CLat17Dlg::OnButton
1()
{
// TODO: Add your control notification handler code here
static char BASED_CODE
szFilter[]="Bitmap Files
(*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE, "*.bmp", name,
OFN_HIDEREADONL
Y|OFN_OVERWRITEP
ROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetP
athName();
}
CDC* p
DC = m_pic1.GetDC();//
mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd
bitmap
CRect rect;//kotak di picture
BITMAP bm;//mendefinisikan
fungsi2 yg ada d bitmap
HBITMA
P hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP,
0, 0, LR_LOADFROMFIL
E|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.Del
eteObject())
m_bmpBitmap.Detach
();
m_bmpBitmap.Attach(h
Bitmap);
}
m_pic1.GetClientRect(rect);
m_bmpBitmap.GetB
itmap(&bm);
dcMem.CreateCompati
bleDC(pDC);
//pDC->MoveTo(10,190);
//pDC->LineTo(300,190);
dcMem.SelectObje
ct(&m_bmpBitmap);
pDC->StretchBlt(0,0
,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button2 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Horizontal terhadap angka 1 (gambar1) dan menampilkannya pada Picture 5 (gambar 5).
void CLat17Dlg::OnButton
2()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic1.GetDC();
CDC dcMem;
CRect rect; //kotak di
picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitm
ap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BIT
MAP, 0, 0, LR_LOADFROMFILE|L
R_CREATEDIBSEC
TION);
m_pic1.GetClientRect(rect);
m_bmpBitmap.GetBit
map(&bm);
dcMem.CreateComp
atibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(j=0;j
{
hx[j]=0;
for(i=0;i
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hx[j]+=(float)(255-red)/255;
}
hx[j]=hx[j]/2;
}
CDC* pDC1 = m_pic5.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
pDC1->MoveTo(i*3.5,0);
pDC1->LineTo(i*3.5,hx[i]);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button3 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Vertical terhadap angka 1 (gambar1) dan menampilkannya pada Picture 2 (gambar 2).
void CLat17Dlg::OnButton3()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic1.GetDC();
CDC dcMem;
CRect rect; //kotak di picture
BITMAP bm;//mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_pic1.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(i=0;i
{
hy[i]=0;
for(j=0;j
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hy[i]+=(float)(255-red)/255;
}
hy[i]=hy[i]/2;
}
CDC* pDC1 = m_pic2.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
pDC1->MoveTo(0,i*2);
pDC1->LineTo(hy[i],i*2);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button4 click seperti di bawah ini,yang berfungsi untuk melakukan load gambar angka2 (Load Angka [2]).
void CLat17Dlg::OnButton4()
{
// TODO: Add your control notification handler code here
static char BASED_CODE szFilter[]="Bitmap Files (*.bmp)|*.bmp||";
CFileDialog m_ldFile(TRUE, "*.bmp", name, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, szFilter);
if(m_ldFile.DoModal()==IDOK)
{
name=m_ldFile.GetPathName();
}
CDC* pDC = m_pic3.GetDC(); // mengarah kontrol picture
CDC dcMem; //mengarahkan obyek yg sdh dipilih pd bitmap
CRect rect; //kotak di picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
if(hBitmap)
{
if(m_bmpBitmap.DeleteObject())
m_bmpBitmap.Detach();
m_bmpBitmap.Attach(hBitmap);
}
m_pic3.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
//pDC->MoveTo(10,190);
//pDC->LineTo(300,190);
dcMem.SelectObject(&m_bmpBitmap);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button5 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Horizontal terhadap angka 2 (gambar3) dan menampilkannya pada Picture 6 (gambar 6).
void CLat17Dlg::OnButton5()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic3.GetDC();
CDC dcMem;
CRect rect; //kotak di picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_pic3.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(j=0;j
{
hx2[j]=0;
for(i=0;i
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
//penggunaan red, tidak terikat, bisa green atau blue
// digunakan 255- , supaya bisa masuk/mendapatkan warna hitam
hx2[j]+=(float)(255-red)/255;
}
hx2[j]=hx2[j]/2;
}
CDC* pDC1 = m_pic6.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
// dimulai dari 0 ke atas, sehingga gambar histogramnya kebalik
pDC1->MoveTo(i*2,0);
pDC1->LineTo(i*2,hx2[i]);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button6 click seperti di bawah ini,yang akan melakukan proses Integral Proyeksi Vertical terhadap angka 2 (gambar3) dan menampilkannya pada Picture 4 (gambar 4).
void CLat17Dlg::OnButton6()
{
// TODO: Add your control notification handler code here
int i,j;
int red,green,blue;
long int warna,warna1;
//float h[384];
CDC* pDC = m_pic3.GetDC();
CDC dcMem;
CRect rect; //kotak di picture
BITMAP bm; //mendefinisikan fungsi2 yg ada d bitmap
HBITMAP hBitmap=(HBITMAP)::LoadImage(AfxGetInstanceHandle(),
name ,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);
m_pic3.GetClientRect(rect);
m_bmpBitmap.GetBitmap(&bm);
dcMem.CreateCompatibleDC(pDC);
dcMem.SelectObject(&m_bmpBitmap);
for(i=0;i
{
hy2[i]=0;
for(j=0;j
{
warna=dcMem.GetPixel(j,i);
WarnaToRGB(warna,&red,&green,&blue);
hy2[i]+=(float)(255-red)/255;
}
hy2[i]=hy2[i]/2;
}
CDC* pDC1 = m_pic4.GetDC();
for(i=1;i
{
//1.3 nilai x atau lebar
pDC1->MoveTo(0,i*2);
pDC1->LineTo(hy2[i],i*2);
}
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,
0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
}
· Tambahkan program pada button7 click seperti di bawah ini,yang berfungsi untuk melakukan load pencocokan antara angka1 dengan angka 2 dengan membandingkan perhitungan kedua integral proyeksinya,baik horizontal maupun vertical dari kedua gambar angka yang dibandingkan (Matching).
void CLat17Dlg::OnButton7()
{
// TODO: Add your control notification handler code here
CDC* pDC1 = GetDC();//
float dx=0,dy=0,d;
int i;
char str[5];
float jhx=0,jhy=0,jhx2=0,jhy2=0;
//digunakan untuk normalisasi angka1
for(i=0;i<50;i++)
jhx+=hx[i];
for(i=0;i<80;i++)
jhy+=hy[i];
for(i=0;i<50;i++)
hx[i]=hx[i]/jhx;
for(i=0;i<80;i++)
hy[i]=hy[i]/jhy;
//digunakan untuk normalisasi angka2
for(i=0;i<50;i++)
jhx2+=hx2[i];
for(i=0;i<80;i++)
jhy2+=hy2[i];
for(i=0;i<50;i++)
hx2[i]=hx2[i]/jhx2;
for(i=0;i<80;i++)
hy2[i]=hy2[i]/jhy2;
//hitung jarak
for(i=0;i<50;i++)
dx=dx+fabs (hx[i]-hx2[i]);
for(i=0;i<80;i++)
dy=dy+fabs (hy[i]-hy2[i]);
d=dx/50+dy/80;
sprintf(str,"%f",d);
pDC1->TextOut(60,320,str);
}
2. Menambah header file
· Buka file Lat17Dlg.h
· Tambahkan program seperti dibawah ini
public:
CLat17Dlg(CWnd* pParent = NULL); // standard constructor
CBitmap m_bmpBitmap;
CBitmap m_bmpBitmap2;
CString name;
float hx[300],hy[300];
float hx2[300],hy2[300];
3. Cara menjalankan program (Running Program)
· Pilih menu : Build->Execute (!)
· Click button1(Load Angka1 ): picture 1 akan menampilkan gambar angka1
· Click button2 (Integral Proyeksi Horizontal [1]): picture 5 akan menampilkan hasil integral proyeksi dari gambar angka1.
· Click button3 (Integral Proyeksi Vertical [1]): picture 2 akan menampilkan hasil integral proyeksi dari gambar angka1.
· Click button4(Load Angka2 ): picture 3 akan menampilkan gambar angka2
· Click button5 (Integral Proyeksi Horizontal [2]): picture 6 akan menampilkan hasil integral proyeksi dari gambar angka2.
· Click button6 (Integral Proyeksi Vertical [2]): picture 4 akan menampilkan hasil integral proyeksi dari gambar angka2.
· Click button7 (Matching): Akan dilakukan perhitungan kemiripan antara angka1 dengan angka2 berdasarkan bentuk integral proyeksi horizontal & integral proyeksi verticalnya.
· Hasil Running Aplikasi tampak seperti pada gambar berikut:
Tampilan Hasil Exsekusi program:
Pada Tampilan diatas dilakukan proses pembandingan antara angka 0 dan angka 6 berdasarkan integral proyeksi horizontal & integral proyeksi vertikalnya.dan diperoleh nilai error 0.012879. Semakin kecil nilai errornya (semakin mendekati 0) maka dua macam obyek akan semakin memiliki tingkat kemiripan yang tinggi.
Pada tampilan diatas dilakukan pengenalan angka terhadap obyek yang sama yaitu,angka 0 dan diperoleh hasil nilai error = 0.000000 (kedua obyek sama).
Tidak ada komentar:
Posting Komentar