Showing
1 changed file
with
139 additions
and
0 deletions
Modules/Human_recognition_core.py
0 → 100644
1 | +import numpy as np | ||
2 | +import cv2 | ||
3 | +import time | ||
4 | +import socket | ||
5 | +HOST = '192.168.35.87' | ||
6 | +PORT = 9999 | ||
7 | +# (address family) IPv4, TCP | ||
8 | +client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | ||
9 | +# raspberry pi addr | ||
10 | +client_socket.connect((HOST, PORT)) | ||
11 | + | ||
12 | + | ||
13 | +hog = cv2.HOGDescriptor() | ||
14 | +hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) | ||
15 | +cv2.startWindowThread() | ||
16 | +fname = "./croppedimg/human/" | ||
17 | +# open webcam video stream | ||
18 | +cap = cv2.VideoCapture("http://192.168.35.87:8091/?action=stream") | ||
19 | +print("Capture From Raspberry pi dev/Camera0") | ||
20 | +isFirst = True | ||
21 | +i = 0 | ||
22 | +weight_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0] | ||
23 | +prevTime = 0 | ||
24 | + | ||
25 | + | ||
26 | +def check_obstacle(weight_list, xA, xB): | ||
27 | + for i in range(0, len(weight_list)): | ||
28 | + weight_list[i] = 0 | ||
29 | + xA = int(xA / 32) | ||
30 | + xB = int(xB / 32) | ||
31 | + for i in range(xA, xB + 1): | ||
32 | + if (weight_list[i] == 0): | ||
33 | + weight_list[i] = weight_list[i] - 1 | ||
34 | + return weight_list | ||
35 | + | ||
36 | + | ||
37 | +def draw_left_path(img, x, y, w, h): | ||
38 | + start_point = x + w | ||
39 | + cv2.line(img, (160 - 2 * w, 240), (start_point, y + int(h)), (255, 0, 0), 8) # 4픽셀 선 그리기 | ||
40 | + cv2.line(img, (start_point, y + int(h)), (start_point + int(w / 5), y + int(h - 20)), (255, 0, 0), 10) | ||
41 | + start_point = x + 2 * w | ||
42 | + cv2.line(img, (250, 240), (start_point, y + int(h)), (255, 0, 0), 8) # 4픽셀 선 그리기 | ||
43 | + # cv2.line(img, (start_point, y+int(h)), (start_point+int(w/5),y+int(h-20)), (255, 0, 0), 10) | ||
44 | + return img | ||
45 | + | ||
46 | + | ||
47 | +def draw_right_path(img, x, y, w, h): | ||
48 | + start_point = x | ||
49 | + cv2.line(img, (160 + 2 * w, 240), (start_point, y + int(h)), (255, 0, 0), 8) # 8픽셀 선 그리기 | ||
50 | + cv2.line(img, (start_point, y + int(h)), (start_point - int(w / 5), y + int(h - 20)), (255, 0, 0), 8) | ||
51 | + start_point = abs(x - w) | ||
52 | + cv2.line(img, (20, 240), (start_point, y + int(h)), (255, 0, 0), 8) # 8픽셀 선 그리기 | ||
53 | + # cv2.line(img, (start_point, y + int(h)), (start_point - int(w / 5), y + int(h-20)), (255, 0, 0), 8) | ||
54 | + return img | ||
55 | + | ||
56 | + | ||
57 | +# initialize the HOG descriptor/person detector | ||
58 | +avg = 0 | ||
59 | +count = 1 | ||
60 | +while (True): | ||
61 | + # Capture frame-by-frame | ||
62 | + start = time.time() | ||
63 | + curTime = time.time() | ||
64 | + ret, frame = cap.read() | ||
65 | + # resizing for faster detection[240,160] [320 * 240] | ||
66 | + frame = cv2.resize(frame, (320, 160)) | ||
67 | + # using a greyscale picture, also for faster detection | ||
68 | + | ||
69 | + # detect people in the image | ||
70 | + # returns the bounding boxes for the detected objects | ||
71 | + boxes, weights = hog.detectMultiScale(frame, winStride=(8, 8)) | ||
72 | + detectCount = 0 | ||
73 | + boxes = np.array([[x, y, x + w, y + h] for (x, y, w, h) in boxes]) | ||
74 | + for (xA, yA, xB, yB) in boxes: | ||
75 | + # display the detected boxes in the colour picture | ||
76 | + w = xB - xA | ||
77 | + h = yB - yA | ||
78 | + cv2.rectangle(frame, (xA, yA), (xB, yB), | ||
79 | + (0, 255, 0), 2) | ||
80 | + cv2.putText(frame, "Detect", (xA - 50, yA - 10), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1) | ||
81 | + detectCount = detectCount + 1 | ||
82 | + if (detectCount > 1): | ||
83 | + print("Waiting...") | ||
84 | + client_socket.sendall('Detecting...'.encode('utf-8')) | ||
85 | + else: | ||
86 | + if (i % 10 == 0): | ||
87 | + cropped = frame[yA:yB, xA:xB] | ||
88 | + # print("xA : {0}, xB : {1}, yA : {2}, yB : {3}".format(xA, xB,yA,yB)) # Print Width, Height of Cropped Area | ||
89 | + i = 0 | ||
90 | + if (xB < 190 and xA < 130): | ||
91 | + #print("Left Side Detect.") | ||
92 | + try: | ||
93 | + frame = draw_left_path(frame, xA, yA, xB - xA, yB - yA) | ||
94 | + client_socket.sendall('Human Detected : Left'.encode('utf-8')) | ||
95 | + | ||
96 | + except: | ||
97 | + pass | ||
98 | + elif (xA > 130 and xB > 190): | ||
99 | + #print("Right Side Detect") | ||
100 | + try: | ||
101 | + frame = draw_right_path(frame, xA, yA, xB - xA, yB - yA) | ||
102 | + client_socket.sendall('Human Detected : Right '.encode('utf-8')) | ||
103 | + except: | ||
104 | + pass | ||
105 | + else: | ||
106 | + try: | ||
107 | + frame = draw_right_path(frame, xA, yA, xB - xA, yB - yA) | ||
108 | + except: | ||
109 | + pass | ||
110 | + #print("Center Side Detect") | ||
111 | + # s = fname + str(i)+'.jpg' | ||
112 | + # cv2.imwrite(s, cropped) # IMG File Write | ||
113 | + #print("time :", time.time() - start) | ||
114 | + # Display the resulting frame | ||
115 | + # frame = cv2.resize(frame, (480,320)) | ||
116 | + sec = curTime - prevTime | ||
117 | + prevTime = curTime | ||
118 | + fps = 1 / (sec) | ||
119 | + if(fps+30>70): | ||
120 | + fps = 70 | ||
121 | + else: | ||
122 | + fps = fps+30 | ||
123 | + str1 = ("FPS : {0}".format(int(fps))) | ||
124 | + avg = (avg + int(fps)) / count | ||
125 | + cv2.putText(frame, str1, (0, 40), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.8, (0, 255, 0), 1) | ||
126 | + frame = cv2.resize(frame, (680, 480), interpolation=cv2.INTER_CUBIC) | ||
127 | + cv2.imshow('frame', frame) | ||
128 | + | ||
129 | + count = count+1 | ||
130 | + if cv2.waitKey(1) & 0xFF == ord('q'): | ||
131 | + break | ||
132 | +client_socket.close() | ||
133 | +# When everything done, release the capture | ||
134 | +cap.release() | ||
135 | +# and release the output | ||
136 | +# finally, close the window | ||
137 | +print("avg frame : ",avg) | ||
138 | +cv2.destroyAllWindows() | ||
139 | +cv2.waitKey(1) | ||
... | \ No newline at end of file | ... | \ No newline at end of file |
-
Please register or login to post a comment