Showing
1 changed file
with
125 additions
and
0 deletions
code/main_controller.py
0 → 100644
1 | +import serial | ||
2 | +import cv2 | ||
3 | +from time import sleep | ||
4 | +import numpy as np | ||
5 | +import ocr_image | ||
6 | +import findDB | ||
7 | + | ||
8 | +ser = serial.Serial('/dev/ttyAMA0',115200) | ||
9 | +if(ser.isOpen()): | ||
10 | + print("Serial Communication in operation") | ||
11 | + | ||
12 | +LiveCam = cv2.VideoCapture(0) | ||
13 | +YOLO_net = cv2.dnn.readNet('yolov3-tiny_best.weights','yolov3-tiny.cfg') | ||
14 | + | ||
15 | +classes = ['box'] | ||
16 | +layer_names = YOLO_net.getLayerNames() | ||
17 | +output_layers = [layer_names[i[0] - 1] for i in YOLO_net.getUnconnectedOutLayers()] | ||
18 | + | ||
19 | +frame_num = 0 | ||
20 | +count = 0 | ||
21 | +while LiveCam.isOpened(): | ||
22 | + | ||
23 | + ret, frame = LiveCam.read() | ||
24 | + if ret is False: | ||
25 | + print("No Video Input") | ||
26 | + break | ||
27 | + if frame_num != 20: | ||
28 | + frame_num += 1 | ||
29 | + elif frame_num == 20: | ||
30 | + frame_num = 0 | ||
31 | + | ||
32 | + h, w, c = frame.shape | ||
33 | + | ||
34 | + blob = cv2.dnn.blobFromImage(frame, 0.00392, (416, 416), (0, 0, 0), True, crop=False) | ||
35 | + YOLO_net.setInput(blob) | ||
36 | + outs = YOLO_net.forward(output_layers) | ||
37 | + | ||
38 | + class_ids = [] | ||
39 | + confidences = [] | ||
40 | + boxes = [] | ||
41 | + | ||
42 | + for out in outs: | ||
43 | + | ||
44 | + for detection in out: | ||
45 | + | ||
46 | + scores = detection[5:] | ||
47 | + class_id = np.argmax(scores) | ||
48 | + confidence = scores[class_id] | ||
49 | + | ||
50 | + if confidence > 0.4: | ||
51 | + center_x = int(detection[0] * w) | ||
52 | + center_y = int(detection[1] * h) | ||
53 | + dw = int(detection[2] * w) | ||
54 | + dh = int(detection[3] * h) | ||
55 | + x = int(center_x - dw / 2) | ||
56 | + y = int(center_y - dh / 2) | ||
57 | + boxes.append([x, y, dw, dh]) | ||
58 | + confidences.append(float(confidence)) | ||
59 | + class_ids.append(class_id) | ||
60 | + | ||
61 | + indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.45, 0.4) | ||
62 | + | ||
63 | + | ||
64 | + if confidences : | ||
65 | + bestscore = confidences.index(max(confidences)) | ||
66 | + best_x, best_y, best_w, best_h = boxes[bestscore] | ||
67 | + | ||
68 | + if best_x > 310 : | ||
69 | + print("오른쪽으로 이동") | ||
70 | + ser.write(serial.to_bytes([int('1',16)])) | ||
71 | + | ||
72 | + elif best_x + best_w < 330 : | ||
73 | + print("왼쪽으로 이동") | ||
74 | + ser.write(serial.to_bytes([int('2',16)])) | ||
75 | + | ||
76 | + else : | ||
77 | + print("직진") | ||
78 | + count = 1 | ||
79 | + | ||
80 | + | ||
81 | + cv2.rectangle(frame, (best_x, best_y), (best_x + best_w, best_y + best_h), (0, 0, 255), 5) | ||
82 | + cv2.putText(frame, 'box', (best_x, best_y - 20), cv2.FONT_ITALIC, 0.5, (255, 255, 255), 1) | ||
83 | + | ||
84 | + cv2.imshow("YOLOv3", frame) | ||
85 | + if count == 1 : | ||
86 | + if cv2.waitKey(100) > 0 : | ||
87 | + cv2.imwrite('cap_img.jpg', frame) | ||
88 | + ser.write(serial.to_bytes([int('3',16)])) | ||
89 | + break | ||
90 | + | ||
91 | + | ||
92 | + if cv2.waitKey(100) > 0: | ||
93 | + break | ||
94 | + | ||
95 | + | ||
96 | +image = cv2.imread("cap_img.jpg") | ||
97 | +template = cv2.imread("myform.jpg") | ||
98 | + | ||
99 | +ocr_result = ocr_image.ocr(image, template) | ||
100 | + | ||
101 | +(name, result) = ocr_result["name"] | ||
102 | +(address, result) = ocr_result["address"] | ||
103 | +(detail_address, result) = ocr_result["detail_address"] | ||
104 | + | ||
105 | +name = name.replace(" ","") | ||
106 | +address = address.replace(" ","") | ||
107 | +detail_address = detail_address.replace(" ","") | ||
108 | + | ||
109 | +print(name) | ||
110 | +print(address) | ||
111 | +print(detail_address) | ||
112 | + | ||
113 | +name = findDB.find_name(name) | ||
114 | +detail_address = findDB.find_address(detail_address) | ||
115 | + | ||
116 | +destination_num = findDB.set_destination(name, detail_address) | ||
117 | +print (destination_num) | ||
118 | + | ||
119 | +sleep(5) | ||
120 | + | ||
121 | +while(1) : | ||
122 | + ser.write(serial.to_bytes([int('6',16)])) | ||
123 | + | ||
124 | + | ||
125 | + |
-
Please register or login to post a comment