cv:: Mat
t1, t2; pixelscanning
m1 , t1;
pixelscanning m2
, t2; size = t1.cols
persentase 100;
cv:: Rect
windowt1.cols - size - 1 ,0, size, 1; z1 = t1window;
z2 = t2window; }
double magnitude1 = 0.0;
double magnitude2 = 0.0;
double dotProduct = 0.0; for
unsigned int i = 0; i size; i++ {
double v1 = z1.at
double 0, i;
double v2 = z2.at
double 0, i;
magnitude1 += v1v1; magnitude2 += v2v2;
dotProduct += v1v2; }
cv:: Mat
dot = z1 z2.t; double
numerator = dot.at double
0, 0; double
denumerator = sqrtmagnitude1 sqrtmagnitude2; std::cout dot, num, denum numerator
\t dotProduct \t magnitude1
\t magnitude2 \t denumerator
\n; return
numerator denumerator; }
};
4.2.6 Tanpa Ekstraksi Ciri
TEMPLATE MATCHING std::
string ok =
[N] ;
cv:: Mat
chkTemplate; if
1 cv::matchTemplatefTemplate, test1, chkTemplate,
CV_TM_CCOEFF_NORMED ;
double minval, maxval, threshold = 0.6;
cv:: Point
minloc, maxloc; cv::minMaxLocchkTemplate, minval, maxval, minloc, maxloc;
if maxval = threshold {
ok = [Y]
; }
else int
match_method = 0; cv::matchTemplatefTemplate, test1, chkTemplate, match_method;
cv::normalize chkTemplate, chkTemplate, 0, 1, cv::NORM_MINMAX, -1, cv::Mat ;
Localizing the best match with minMaxLoc double
minVal; double
maxVal; cv::Point minLoc; cv::Point maxLoc; cv::minMaxLoc chkTemplate, minVal, maxVal, minLoc, maxLoc, cv::Mat ;
cv::Point matchLoc; matchLoc = match_method
== CV_TM_SQDIFF || match_method== CV_TM_SQDIFF_NORMED
? minLoc : maxLoc; TO_DO: check how to get this
if minVal 255 {
ok = [Y]
; }
endif
4.3 Pengujian Software Aplikasi Pengenalan Peralatan Bengkel Motor Secara Real Time
Sebelum memulai pengetesan, terlebih dahulu menentukan nilai “batas” dan nilai persentase windowing. Nilai batas dipakai untuk menentukan nilai atas dan bawah hasil
DCT dan Tanpa Ekstraksi Cirihasil pengetesan terhadap data training. Sedangkan nilai persentase windowing adalah untuk menentukan area windowing yang ingin dipakai. Nilai
100 pada nilai persentase windowing mempunyai arti bahwa scanning yang dilakukan adalah untuk setiap pixel. Windowing 100 memiliki waktu eksekusi program lebih lama
daripada persentase dibawahnya. Setelah persiapan selesai, maka selanjutnya masuk ke pendeteksian alat. Deteksi alat ini akan memunculkan hasil berupa text pengenalan DCT
dan Template Matching.
int DeteksiAlat {
config cfg
..\\..\\sample\\dct.xml ;
BasisData db..\\..\\sample\\basisdata.xml; BasisData
dbcfg.basisData; if
db.IsValid { std::cout
Config tidak bisa dibaca. \n
; return
-1; }
std:: vector
cv:: Mat
templates; for
unsigned int i = 0; i db.Data.size; i++ {
cv:: Mat
training= cv::imreaddb.Data[i].lokasiGambar, CV_LOAD_IMAGE_GRAYSCALE
;
if training.data == 0 {
std::cout Database untuk alat
db.Data[i].namaAlat tidak bisa dibaca.
\n Pastikan gambar
db.Data[i].lokasiGambar tersedia.
\n ;
return -1;
} cv::
Mat dTrain;
int res = dct::FastDcttraining, dTrain;
templates.emplace_backdTrain; }
for unsigned int
i = 0; i cfg.pathTestCases.size; i++ { cv::
Mat test1
= cv::imreadcfg.pathTestCases[i], CV_LOAD_IMAGE_GRAYSCALE
; double
nilaiKemiripanMaksimal = -2.0; unsigned int
indexMirip = 0; cv::
Mat d2;
int res = dct::FastDcttest1
, d2; for
unsigned int j = 0; j templates.size; j++ {
double cs = dct::CheckSimilaritytemplates[j], d2, db.Persentase;
if cs db.Data[j].batasMinimum
continue ;
if cs nilaiKemiripanMaksimal {
nilaiKemiripanMaksimal = cs; indexMirip = j;
} }
if nilaiKemiripanMaksimal 0.0f {
std::cout Gambar
cfg.pathTestCases[i] kemungkinan
adalah db.Data[indexMirip].namaAlat
dengan tingkat kimiripan:
nilaiKemiripanMaksimal \n
; }
else {
std::cout Gambar
cfg.pathTestCases[i] tidak dikenali
\n ;
} }
return 0;
}
4.3.1 Tabel Validasi
Training Testing 1
Testing 2 Testing 3
Testing 4 Testing 5
A B
A B
A B
A B
A B
Kunci Ring 0º 1
1 1
1 1
1 1
Kunci Ring 90º 1
1 1
1 1
1 1