Anda di halaman 1dari 9

from tkinter import *

import tkinter.ttk
import cv2
import numpy as np
import xlsxwriter
import datetime
from tkinter.filedialog import askopenfilename, asksaveasfilename
import os
import tkinter.messagebox
import matplotlib.pyplot as plt
import pandas as pd

class penampil:
# membuat tampilan antar muka
def __init__(self, induk):
self.induk = induk
self.induk.resizable(True, True)
contentFrame = Frame(induk, borderwidth=2, relief=GROOVE)
contentFrame.pack(side=LEFT, expand=YES, fill=BOTH)
self.btn0 = Button(contentFrame, text='Petunjuk',
command=self.petunjuk).pack(side=LEFT, expand=YES, fill=BOTH)
self.btn1 = Button(contentFrame, text='Ukur',
command=self.ukur_rekam).pack(side=LEFT, expand=YES, fill=BOTH)
# self.btn2 = Button(contentFrame, text='lihat grafik 3D',
command=self.grafik3D).pack(side=LEFT, expand=YES,fill=BOTH)
self.btn3 = Button(contentFrame, text='Lihat Hasil Ukur',
command=self.buka_file).pack(side=LEFT, expand=YES,

fill=BOTH)
self.btn4 = Button(contentFrame, text='Keluar',
command=self.quit).pack(side=LEFT, expand=YES, fill=BOTH)

self.btn5=Button(contentFrame,text='Camera',command=self.camera).pack(side=LEFT,exp
and=YES,fill=BOTH)

menu = Menu(self.induk)
self.induk.config(menu=menu)

def petunjuk(self):
# membuat petunjuk penggunaan software
tkinter.messagebox.showinfo("Info", "1. Hubungkan kamera stereo dengan
notebook atau PC.\n"
"2. Tekan ukur dan rekam untuk memulai
pengukuran.\n"
"3. Saat mengukur, pastikan persegi
merah muda menandai objek yang diukur pada kedua citra.\n"
"4. Jika belum arahkan krusor pada
objek yang diukur pada citra kiri lalu tekan klik.\n"
"5. Tekan ( q ) untuk mengakhiri
pengukuran.\n"
"6. Hasil pengukuran tersimpan dalam
folder aplikasi ini.\n")

def ukur_rekam(self):
# mengatur ukuran template
r = 12
w = h = 2 * r
x1 = [0,0,0]
y1 = [0,0]

# memilih objek yang mau di ukur menggunakan krusor


def pilih_objek(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
x1[0]=x
y1[0]=y

elif event == cv2.EVENT_RBUTTONDOWN:


x1[1]=x
y1[1]=y
x1[2] = x1[0]-x1[1]+640 #disparitas

# inisialisasi kamera
cap = cv2.VideoCapture(1)
# menentukan resolusi citra
cap.set(3, 1280)

# membuat workbook excel


tsv = datetime.datetime.now()
workbook = xlsxwriter.Workbook("Data_{}.xlsx".format(tsv.strftime("%d-%m-
%Y_%H-%M-%S")))
worksheet = workbook.add_worksheet()

# Add a bold format to use to highlight cells.


bold = workbook.add_format({'bold': True, 'text_wrap': True})
# srink = workbook.add_format(())
worksheet.write('A1', 'No.', bold)
worksheet.write('B1', 'Disparity (px)', bold)
worksheet.write('C1', 'x (px)', bold)
worksheet.write('D1', 'y (px)', bold)
worksheet.write('E1', 'X (mm)', bold)
worksheet.write('F1', 'Y (mm)', bold)
worksheet.write('G1', 'Z (mm)', bold)

row = 1
column = 0

# definisi variabel
X_ob = 0
Y_ob = 0
Z_ob = 0

delay = 1 # ms 475 = 2 fps, + 0.0265 175= 5 fps, + 0.0265 75 =


10 fps, + 0.026
# 40 = 15 fps, + 0,027 21 = 20 fps, + 0,027 1 = 30 fps, + 0.0332
delay1 = delay - 9
fps = round(1 / (delay / 1000 + 0.0332))

# merekam video
size = (int(cap.get(3)), int(cap.get(4)))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter("Data_{}.avi".format(tsv.strftime("%d-%m-%Y_%H-%M-
%S")), fourcc, fps, size)

# while 1
while (1):
ret, frame = cap.read()

# menghapus hasil ukur sebelumnya


cv2.rectangle(frame, (0, 0), (1280, 60), (0, 0, 0), -1)
cv2.rectangle(frame, (0, 420), (1280, 840), (0, 0, 0), -1)
# cv2.rectangle(frame, (0, 462), (1280, 840), (0, 0, 0), -1)

# menulis pusat koordinat


cv2.putText(frame, "(0,0)", (320, 254), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
# cv2.putText(frame, ">", (630, 244), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
cv2.putText(frame, ">", (630, 265), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
cv2.putText(frame, "x", (620, 252), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
cv2.putText(frame, "^", (314, 70), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
# cv2.putText(frame, "y", (328, 70), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
cv2.putText(frame, "y", (326, 81), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)

# menampilkan sumbu koordinat kamera


# frame = cv2.line(frame, (0, 240), (1280, 240), (255, 255, 255), 1) #
horisontal
frame = cv2.line(frame, (0, 261), (1280, 261), (255, 255, 255), 1) #
horisontal
frame = cv2.line(frame, (320, 60), (320, 420), (255, 255, 255), 1) #
vertikal kiri
# frame = cv2.line(frame, (960, 60), (960, 420), (255, 255, 255), 1) #
vertikal kanan
frame = cv2.line(frame, (941, 60), (941, 420), (255, 255, 255), 1) #
vertikal kanan

# cv2.setMouseCallback('image', pilih_objek)

cv2.imshow('image', frame)

j = 1
k = cv2.waitKey(1) & 0xff
if k == ord('q'):
cv2.destroyAllWindows()
break
elif k == ord('s'): # menjeda
cv2.setMouseCallback('image', pilih_objek)
# cv2.rectangle(frame, (x1,y1), (x2,y2), (0, 255, 0), 2)
cv2.waitKey(0)
cv2.waitKey(10)
elif k == ord('c'): # memotret
ts = datetime.datetime.now()
# cv2.imwrite('citra.png', frame)
cv2.imwrite(r"E:\pengukuran tesis\
Citra_{}.tiff".format(ts.strftime("%d-%m-%Y_%H-%M-%S")), frame)

cv2.imshow('citra', frame)
cv2.waitKey(0)
cv2.waitKey(1)

# while 2

while (1):
ret, frame = cap.read() # membaca frame

# menghapus hasil ukur sebelumnya


cv2.rectangle(frame, (0, 0), (1280, 60), (0, 0, 0), -1)
cv2.rectangle(frame, (0, 420), (1280, 840), (0, 0, 0), -1)

# Menetapkan ROI dan memanggil template

cv2.namedWindow('image')
cv2.setMouseCallback('image', pilih_objek)
disparitas = x1[2]

# menghitung jarak objek(Z)


if disparitas > 1:
jarak = 4069.3 * disparitas ** (-1) # rentang 30 -70

# menampilkan x,y citra


b = 6 # jarak antar kamera 6 cm
x_citra = int(x1[0]) - 320
y_citra = 259 - int(y1[0])

X_objek = (x_citra * b / disparitas) * 10


Y_objek = (y_citra * b / disparitas) * 10
Z_objek = (jarak) * 10

# membulatkan kedesimal 1 angka di belakang koma


Xob = round(X_objek, 1)
Yob = round(Y_objek, 1)
Zob = round(Z_objek, 1)

# memasukkan nilai untuk looping berikutnya


X_ob = X_objek
Y_ob = Y_objek
Z_ob = Z_objek

# menampilkan titik yang diukur


cv2.circle(frame, (x1[0],y1[0]),2,(0,0,255),2)
cv2.circle(frame, (x1[0],y1[0]),2,(0,0,255),2)

# menulis pusat koordinat


cv2.putText(frame, "(0,0)", (320, 254), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, ">", (630, 265), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, "x", (620, 252), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, "^", (314, 70), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
cv2.putText(frame, "y", (326, 81), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)

# menampilkan sumbu koordinat kamera


frame = cv2.line(frame, (0, 261), (1280, 261), (255, 255, 255), 1)
# horisontal
frame = cv2.line(frame, (320, 60), (320, 420), (255, 255, 255), 1)
# vertikal kiri
frame = cv2.line(frame, (941, 60), (941, 420), (255, 255, 255), 1)
# vertikal kanan

# menampilkan hasil ukur pada bagian atas citra


cv2.putText(frame, "Disparity : {}
px".format(disparitas),
(10, frame.shape[0] - 445), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 255), 1)
cv2.putText(frame,
"Image Position (x; y) : ({}".format(x_citra) + ";
{}".format(y_citra) + " ) px",
(10, frame.shape[0] - 425), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 255), 1)

# menampilkan hasil ukur pada bagian bawah kanan citra


cv2.putText(frame, "World Position (X; Y; Z) : ({}".format(Xob) +
"; {}".format(
Yob) + "; {}) mm".format(Zob),
(10, frame.shape[0] - 45), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 255), 1)

cv2.imshow('image', frame)

k = cv2.waitKey(delay) & 0xff # 140=5fps 100 =6fps 80 = 8fps 27 =12


fps
if k == ord('q'):
cv2.destroyAllWindows()
break
elif k == ord('e'):
break
elif k == ord('s'): # menjeda

# cv2.imwrite('citra.png', frame)
# cv2.imshow('citra',frame)
cv2.setMouseCallback('image', pilih_objek)
cv2.waitKey(0)
cv2.waitKey(1)

elif k == ord('c'): # menjeda


tsv1 = datetime.datetime.now()
# cv2.imwrite('citra.png', frame)
cv2.imwrite(r"E:\pengukuran tesis\
Foto_{}.tiff".format(tsv1.strftime("%d-%m-%Y_%H-%M-%S")), frame)

cv2.imshow('citra', frame)
cv2.waitKey(0)
cv2.waitKey(1)

# while 3

while (1):

ret, frame = cap.read()

# menghapus hasil ukur sebelumnya


cv2.rectangle(frame, (0, 0), (1280, 60), (0, 0, 0), -1)
cv2.rectangle(frame, (0, 420), (1280, 840), (0, 0, 0), -1)

# Menetapkan ROI dan memanggil template


frame_gray = cv2.cvtColor(frame.copy(), cv2.COLOR_BGR2GRAY)
tinggi, lebar = frame_gray.shape[:2]
lb = int(0.5 * lebar)
img1 = frame_gray[:tinggi, :lb] # kiri
img2 = frame_gray[:tinggi, lb:] # kanan
cv2.namedWindow('image')
cv2.setMouseCallback('image', pilih_objek)
template = cv2.imread('template.png', 0)

# menerapkan template matching pada kamera kiri


res1 = cv2.matchTemplate(img1, template, cv2.TM_SQDIFF_NORMED)
min_val1, max_val1, min_loc1, max_loc1 = cv2.minMaxLoc(res1)
pt1 = min_loc1
cv2.rectangle(frame[:tinggi, :lb], pt1, (pt1[0] + w, pt1[1] + h), (0,
0, 255), 2)

# menerapkan template matching pada kamera kanan


res2 = cv2.matchTemplate(img2, template, cv2.TM_SQDIFF_NORMED)
min_val2, max_val2, min_loc2, max_loc2 = cv2.minMaxLoc(res2)
pt2 = min_loc2
cv2.rectangle(frame[:tinggi, lb:], pt2, (pt2[0] + w, pt2[1] + h), (0,
0, 255), 2)

# menghitung disparitas
x_kiri = int(pt1[0] - 0.5 * lb)
x_kanan = int(pt2[0] - 0.5 * lb + 19) # ralat sistematis pusat kamera
kanan 19 (diperoleh saat kalibrasi)
disparitas = x_kiri - x_kanan

# menghitung jarak objek(Z)


if disparitas > 1:
jarak = 4069.3 * disparitas ** (-1) # rentang 30 -70

# menampilkan x,y citra


b = 6 # jarak antar kamera 6 cm
x_citra = int(pt1[0]) - 320
y_citra = 259 - int(pt1[1])

X_objek = (x_citra * b / disparitas) *1000 #diubah ke mm


Y_objek = (y_citra * b / disparitas) *1000
Z_objek = (jarak)*10
dz = (round(Z_objek - Z_ob, 1))*1000

# membulatkan kedesimal 1 angka di belakang koma


Xob = round(X_objek, 1)
Yob = round(Y_objek, 1)
Zob = round(Z_objek, 1)

# memasukkan nilai untuk looping berikutnya


X_ob = X_objek
Y_ob = Y_objek
Z_ob = Z_objek

# menulis pusat koordinat


cv2.putText(frame, "(0,0)", (320, 254), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, ">", (630, 265), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, "x", (620, 252), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, "^", (314, 70), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)
# cv2.putText(frame, "y", (328, 70), cv2.FONT_ITALIC, 0.5, (255,
255, 255), 1)
cv2.putText(frame, "y", (326, 81), cv2.FONT_ITALIC, 0.5, (255, 255,
255), 1)

# menampilkan sumbu koordinat kamera


frame = cv2.line(frame, (0, 261), (1280, 261), (255, 255, 255), 1)
# horisontal
frame = cv2.line(frame, (320, 60), (320, 420), (255, 255, 255), 1)
# vertikal kiri
frame = cv2.line(frame, (941, 60), (941, 420), (255, 255, 255), 1)
# vertikal kanan

# menampilkan hasil ukur pada bagian atas citra


cv2.putText(frame, "Disparity : {}
px".format(disparitas),
(10, frame.shape[0] - 445), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 255), 1)
cv2.putText(frame,
"Image Position (x; y) : ({}".format(x_citra) + ";
{}".format(y_citra) + " ) px",
(10, frame.shape[0] - 425), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 255), 1)

# menampilkan hasil ukur pada bagian bawah kanan citra


cv2.putText(frame, "World Position (X; Y; Z) : ({}".format(Xob) +
"; {}".format(
Yob) + "; {}) mm".format(Zob),
(10, frame.shape[0] - 45), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 255), 1)

# memasukkan data kedalam excel


worksheet.write(row, column, row)
worksheet.write(row, 1, disparitas)
worksheet.write(row, 2, x_citra)
worksheet.write(row, 3, y_citra)
worksheet.write(row, 4, Xob)
worksheet.write(row, 5, Yob)
worksheet.write(row, 6, Zob)
row += 1

out.write(frame)
cv2.imshow('image', frame)

k = cv2.waitKey(delay) & 0xff


if k == ord('q'):
cv2.destroyAllWindows()
break
elif k == ord('s'): # menjeda
cv2.setMouseCallback('image', pilih_objek)
cv2.waitKey(0)
cv2.waitKey(1)
elif k == ord('c'): # menjeda
tsv1 = datetime.datetime.now()
# cv2.imwrite('citra.png', frame)
cv2.imwrite(r"E:\pengukuran tesis\
Foto_{}.tiff".format(tsv1.strftime("%d-%m-%Y_%H-%M-%S")), frame)

cv2.imshow('citra', frame)
cv2.waitKey(0)
cv2.waitKey(1)

workbook.close()
cap.release()
out.release()
cv2.destroyAllWindows()

def buka_file(self):
# Membuat fuction open_dialog()
fileName = askopenfilename(filetypes=(("All files", "*.*"), ("Video file",
"*.avi"), ("Excel file", "*.xlsx")))
os.startfile(fileName) # memutar video pakai aplikasi pada OS (operating
sistem)

def quit(self):
import sys
sys.exit()

def camera(self):
print('aaaaa')
# inisialisasi kamera
vid = cv2.VideoCapture(1)
# menentukan resolusi citra
vid.set(3, 1280)
while (True):

# Capture the video frame


# by frame
ret, frame = vid.read()

# Display the resulting frame


cv2.imshow('frame', frame)

# the 'q' button is set as the


# quitting button you may use any
# desired button of your choice
if cv2.waitKey(1) & 0xFF == ord('s'):
tsv1 = datetime.datetime.now()
# Capture the video frame
# by frame
ret, frame = vid.read()
cv2.imwrite(r'E:\pengukuran tesis\
Foto_{}.tiff'.format(tsv1.strftime("%d-%m-%Y_%H-%M-%S")), frame)

# Display the resulting frame


cv2.imshow('frame', frame)

break
if cv2.waitKey(1) & 0xFF == ord('q'):
break

# After the loop release the cap object


vid.release()
# Destroy all the windows
cv2.destroyAllWindows()

root = Tk()
app = penampil(root)
root.title('PENGUKURAN GERAK 3D OBJEK BERBASIS KAMERA STEREO')
root.geometry('500x20')
root.mainloop()

Anda mungkin juga menyukai