BAB II DASAR TEORI
4.2 Coding Program Pengenalan Alat Bengkel Motor
4.2.2 Pembuatan Database Citra Training............ ................................. 41-42
Pembuatan Database citra training dilakukan dengan terlebih dahulu menentukan jumlah dan jenis tool yang akan digunakan. Tool yang digunakan disini berjumlah 10 dengan jenis sebagai berikut: Kunci Soket Kunci Inggris kunci L Kunci Ring Senter Obeng Plus Penggaris Palu Tang Kunci Pas
Masing-masing tool akan diambil data citra nya dengan dilakukan rotasi 0o, 90o, 180o, dan 270. Sehingga total citra dari tool yang digunakan untuk database berjumlah 40buah.
Coding pembuatan database training :
<?xml version="1.0" encoding="utf-8"?>
<BasisData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Persentase>100</Persentase>{
<Alat batas="0.5" nama="kunci_ring">..\..\sample\kunci_ring.png</Alat> <Alat batas="0.5" nama="kunci_ring_90">..\..\sample\kunci_ring_90.png</Alat> <Alat batas="0.5" nama="kunci_ring_180">..\..\sample\kunci_ring_180.png</Alat> <Alat batas="0.5" nama="kunci_ring_270">..\..\sample\kunci_ring_270.png</Alat> <Alat batas="0.5" nama="palu">..\..\sample\palu.png</Alat>
<Alat batas="0.5" nama="palu_90">..\..\sample\palu_90.png</Alat> <Alat batas="0.5" nama="palu_180">..\..\sample\palu_180.png</Alat> <Alat batas="0.5" nama="palu_270">..\..\sample\palu_270.png</Alat> <Alat batas="0.5" nama="senter">..\..\sample\senter.png</Alat> <Alat batas="0.5" nama="senter_90">..\..\sample\senter_90.png</Alat> <Alat batas="0.5" nama="senter_180">..\..\sample\senter_180.png</Alat> <Alat batas="0.5" nama="senter_270">..\..\sample\senter_270.png</Alat> <Alat batas="0.5" nama="kunci_L">..\..\sample\kunci_L.png</Alat> <Alat batas="0.5" nama="kunci_L_90">..\..\sample\kunci_L_90.png</Alat> <Alat batas="0.5" nama="kunci_L_180">..\..\sample\kunci_L_180.png</Alat> <Alat batas="0.5" nama="kunci_L_270">..\..\sample\kunci_L_270.png</Alat> <Alat batas="0.5" nama="kunci_inggris">..\..\sample\kunci_inggris.png</Alat> <Alat batas="0.5" nama="kunci_inggris_90">..\..\sample\kunci_inggris_90.png</Alat> <Alat batas="0.5"nama="kunci_inggris_180">..\..\sample\kunci_inggris_180.png</Alat> <Alat batas="0.5"nama="kunci_inggris_270">..\..\sample\kunci_inggris_270.png</Alat> <Alat batas="0.5" nama="obeng_plus">..\..\sample\obeng_plus.png</Alat>
<Alat batas="0.5" nama="obeng_plus_90">..\..\sample\obeng_plus_90.png</Alat> <Alat batas="0.5" nama="obeng_plus_180">..\..\sample\obeng_plus_180.png</Alat> <Alat batas="0.5"nama="obeng_plus_270">..\..\sample\obeng_plus_270.png</Alat> <Alat batas="0.5" nama="tang">..\..\sample\tank.png</Alat>
<Alat batas="0.5" nama="tang_90">..\..\sample\tank_90.png</Alat> <Alat batas="0.5" nama="tang_180">..\..\sample\tank_180.png</Alat> <Alat batas="0.5" nama="tang_270">..\..\sample\tank_270.png</Alat> <Alat batas="0.5" nama="kunci_pas">..\..\sample\kunci_pas.png</Alat> <Alat batas="0.5" nama="kunci_pas_90">..\..\sample\kunci_pas_90.png</Alat> <Alat batas="0.5" nama="kunci_pas_180">..\..\sample\kunci_pas_180.png</Alat> <Alat batas="0.5" nama="kunci_pas_270">..\..\sample\kunci_pas_270.png</Alat> <Alat batas="0.5" nama="kunci_soket">..\..\sample\kunci_soket.png</Alat> <Alat batas="0.5"nama="kunci_soket_90">..\..\sample\kunci_soket_90.png</Alat> <Alatbatas="0.5"nama="kunci_soket_180">..\..\sample\kunci_soket_180.png</Alat> <Alat batas="0.5"nama="kunci_soket_270">..\..\sample\kunci_soket_270.png</Alat> <Alat batas="0.5" nama="penggaris">..\..\sample\penggaris.png</Alat>
<Alat batas="0.5" nama="penggaris_90">..\..\sample\penggaris_90.png</Alat> <Alat batas="0.5" nama="penggaris_180">..\..\sample\penggaris_180.png</Alat> <Alatbatas="0.5"nama="penggaris_270">..\..\sample\penggaris_270.png</Alat> </BasisData>
4.2.3 Preprocessing
Proses preprocessing terdiri dari grayscale, threshold, cropping, dan resizing sebagai berikut :
A. Grayscale
cv::Rect viewPort(0,0 , length, length); while (key != 27) { HWND hwnd = (HWND)cvGetWindowHandle(nameWindow.c_str()); key = cv::waitKey(50); if (hwnd == 0 || !IsWindowVisible(hwnd)) { key = 27; break; } vc >> frame;cv::Mat bin = frame(crop);
cv::cvtColor(bin, bin, CV_RGB2GRAY);
cv::resize(bin, bin, cv::Size(length, length)); cv::Mat feed = canvas(viewPort);
bin.copyTo(feed); switch(mouse) { case 67: // (C)heck key = mouse; mouse = 0; break; }
B. Threshold
cv::Mat dTrain; if (cfg.toApply) { cv::Mat temp; if (cfg.method == 0) {cv::threshold(training, temp, cfg.param1, 225,CV_THRESH_BINARY); } else {
cv::threshold(training, temp, 0, 225,CV_THRESH_BINARYCV_THRESH_OTSU); }
res = dct::FastDct(temp, dTrain); } else {
res = dct::FastDct(training, dTrain); }
C.
Croppingstatic void onMouse( int event, int x, int y, int flag, void *data ) {
if( event != CV_EVENT_LBUTTONDOWN ) return; if (data == 0) return; int length = 256; int panel = 200; int margin = 10; int thickness = 23;
if ( (length+margin) > x || x > (length+panel-margin)) return;
if ( (margin) > y || y > (panel-margin)) return;
unsigned char temp = 0;
if ( (margin) <= y && y <= (thickness+margin)) { temp = 67; // "C"
}
if (temp == 0) return;
unsigned char *sel;
try {
sel = static_cast<unsigned char *>(data); } catch(...) { return; } *sel = temp; } int TestCroppedStreaming() {
int idCamera = -1; // cek di aplikasi camera (index mulai dari 0
config cfg("..\\..\\sample\\dct.xml");
// TO_DO: get cameraid
idCamera = 1;
cv::VideoCapture vc(idCamera); std::string nameWindow = "DCT - CS";
cv::namedWindow( nameWindow, cv::WINDOW_AUTOSIZE ); cv::Mat frame;
cv::Rect crop(0,0 // ujung kiri atas
, 479, 479); // ukuran crop
unsigned char key = 0;
unsigned char mouse = 0; detection det(cfg);
cv::setMouseCallback( nameWindow, onMouse, static_cast<void *>(&mouse) );
unsigned int i = 0;
int length = 256;
int margin = 10;
int lenZigzag = 35;
int thickness = 23; cv::Mat canvas(cv::Size(length+panel, length+thickness+margin), CV_8UC1, cv::Scalar(200));
Tombol utama(cv::Point(length+margin+40, margin+13), 'C', "Deteksi Alat", false); utama.sudut.emplace_back(cv::Point(length+margin, margin));
utama.sudut.emplace_back(cv::Point(length+panel-margin, margin));
utama.sudut.emplace_back(cv::Point(length+panel-margin, margin+thickness)); utama.sudut.emplace_back(cv::Point(length+margin, margin+thickness)); Tombol dct256(cv::Point(margin/2+3, length+margin/2+15), '8', "256", true); dct256.sudut.emplace_back(cv::Point(margin/2, length+margin/2));
dct256.sudut.emplace_back(cv::Point(margin/2 + lenZigzag, length+margin/2));
dct256.sudut.emplace_back(cv::Point(margin/2 + lenZigzag,length+thickness+margin/2)); dct256.sudut.emplace_back(cv::Point(margin/2 , length+thickness+margin/2));
Tombol dct128(cv::Point(margin/2+52, length+margin/2+15), '7', "128", true); dct128.sudut.emplace_back(cv::Point(margin/2+50, length+margin/2));
dct128.sudut.emplace_back(cv::Point(margin/2+50 + lenZigzag, length+margin/2)); dct128.sudut.emplace_back(cv::Point(margin/2+50lenZigzag,length+thickness+margin/2)); dct128.sudut.emplace_back(cv::Point(margin/2+50 , length+thickness+margin/2));
Tombol dct64(cv::Point(margin/2+108, length+margin/2+15), '6', "64", true); dct64.sudut.emplace_back(cv::Point(margin/2+100, length+margin/2));
dct64.sudut.emplace_back(cv::Point(margin/2+100 + lenZigzag, length+margin/2)); dct64.sudut.emplace_back(cv::Point(margin/2+100lenZigzag,length+thickness+margin/2)); dct64.sudut.emplace_back(cv::Point(margin/2+100 , length+thickness+margin/2));
Tombol dct32(cv::Point(margin/2+157, length+margin/2+15), '5', "32", true); dct32.sudut.emplace_back(cv::Point(margin/2+150, length+margin/2));
dct32.sudut.emplace_back(cv::Point(margin/2+150 + lenZigzag, length+margin/2)); dct32.sudut.emplace_back(cv::Point(margin/2+150lenZigzag,length+thickness+margin/2)); dct32.sudut.emplace_back(cv::Point(margin/2+150 , length+thickness+margin/2));
Tombol dct16(cv::Point(margin/2+206, length+margin/2+15), '4', "16", true); dct16.sudut.emplace_back(cv::Point(margin/2+200, length+margin/2));
dct16.sudut.emplace_back(cv::Point(margin/2+200 + lenZigzag, length+margin/2)); dct16.sudut.emplace_back(cv::Point(margin/2+200 +lenZigzag,
length+thickness+margin/2));
dct16.sudut.emplace_back(cv::Point(margin/2+200 , length+thickness+margin/2)); Tombol dct8(cv::Point(margin/2+262, length+margin/2+15), '3', "8", true); dct8.sudut.emplace_back(cv::Point(margin/2+250, length+margin/2));
dct8.sudut.emplace_back(cv::Point(margin/2+250 + lenZigzag, length+margin/2)); dct8.sudut.emplace_back(cv::Point(margin/2+250 + lenZigzag, length+thickness+margin/2)); dct8.sudut.emplace_back(cv::Point(margin/2+250 , length+thickness+margin/2)); TombolPlus kontrolUi; kontrolUi.tombols.emplace_back(utama); kontrolUi.tombols.emplace_back(dct256); kontrolUi.tombols.emplace_back(dct128); kontrolUi.tombols.emplace_back(dct64);
kontrolUi.tombols.emplace_back(dct32); kontrolUi.tombols.emplace_back(dct16); kontrolUi.tombols.emplace_back(dct8);
cv::setMouseCallback( nameWindow, onMouse, static_cast<void *>(&kontrolUi) ); std::vector<cv::Point> blank;
blank.emplace_back(cv::Point(length+margin, margin+thickness+1)); blank.emplace_back(cv::Point(length+panel-margin, margin+thickness+1)); blank.emplace_back(cv::Point(length+panel-margin, length-margin)); blank.emplace_back(cv::Point(length+margin, length-margin)); std::vector< std::vector<cv::Point> > blanks;
blanks.push_back(blank); cv::Rect viewPort(0,0
, length, length);
while (key != 27) {
GambarTombol(canvas, kontrolUi.tombols, key);
HWND hwnd = (HWND)cvGetWindowHandle(nameWindow.c_str()); key = cv::waitKey(50); if (hwnd == 0 || !IsWindowVisible(hwnd)) { key = 27; break; }
D. Resizing
vc >> frame;cv::Mat bin = frame(crop);
cv::cvtColor(bin, bin, CV_RGB2GRAY);
cv::resize(bin, bin, cv::Size(length, length)); cv::Mat feed = canvas(viewPort);
feed.setTo(cv::Scalar(0)); // set item semua
cv::Rect viewSelected(0,0 , length, length); feed = canvas(viewSelected); bin.copyTo(feed);
switch(kontrolUi.terpilih) {
case '8': length = 256; break;
case '7': length = 128; break;
case '6': length = 64; break;
case '5': length = 32; break;
case '4': length = 16; break;
case '3': length = 8; break;
case 67: // (C)heck
key = kontrolUi.terpilih;
kontrolUi.terpilih = 1; // reset
break; }