이재빈

에지클라우드_ 전처리 이미지 전송 모듈 작성

1 +import socket
2 +import cv2
3 +import numpy as np
4 +from queue import Queue
5 +from _thread import *
6 +enclose_q = Queue()
7 +import time
8 +def filter_img(img):
9 + #이미지의 RGB값을 분석하여 찾는 실내 Tag가 맞는지 판별
10 + img = cv2.resize(img, (10,10))
11 + first = [0,0,0]
12 + for x_loc in range(0, 10):
13 + for y_loc in range(0, 10):
14 + bgr_value = img[x_loc,y_loc]
15 + first=first+bgr_value
16 + first[0] = first[0]/100
17 + first[1] = first[1]/100
18 + first[2] = first[2]/100
19 + blue = first[0]<200 and first[0]>120
20 + green = first[1]>120 and first[1]<210
21 + red = first[2]>130 and first[2]<230
22 +
23 + if(blue and green and red):
24 + return True
25 + else:
26 + return False
27 +
28 +def bboxes(inp):
29 + #Frame을 인자로 전달받음
30 + img = inp
31 + start = time.time()
32 + curTime = time.time()
33 + # img2gray = cv2.imread(fname,0)
34 + # img = cv2.namedWindow(img,cv2.WINDOW_NORMAL)
35 + # img = cv2.resizeWindow(img,600,600)
36 + img_final = inp
37 + img2gray = cv2.cvtColor(inp, cv2.COLOR_BGR2GRAY) #GRAY Image 8bit per pixel
38 + ret, mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY) #threshold : distinguish background, object
39 + image_final = cv2.bitwise_and(img2gray, img2gray, mask=mask) #bitwise
40 + ret, new_img = cv2.threshold(img_final, 180, 255, cv2.THRESH_BINARY) # Nfor black text , cv.THRESH_BINARY_IV
41 + newimg = cv2.cvtColor(new_img, cv2.COLOR_BGR2GRAY) #Gray Image converting
42 + _,contours, _ = cv2.findContours(newimg, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_NONE) # get contours
43 + #cv2.CHAIN_APPROX_NONE: 모든 컨투어 포인트를 반환
44 + for contour in contours:
45 + [x, y, w, h] = cv2.boundingRect(contour)
46 +
47 + if h / w > 1.0 or w / h > 2.0:
48 + continue
49 + #if h>40 or w>70:
50 + #continue
51 + if y>150:
52 + continue
53 + cropped = img_final[y :y + h , x : x + w]
54 + if(filter_img(cropped)):
55 + cv2.rectangle(img, (x, y), (x + w, y + h), (0, 0, 255), 3)
56 + cv2.putText(img,"cropped", (x-50,y-10), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0,0,255), 1)
57 + else:
58 + continue
59 + return cropped
60 +
61 +def threaded(Client_socket, addr, queue):
62 + print("Connected by : ", addr[0], " : ", addr[1])
63 + while True:
64 + try :
65 + data = Client_socket.recv(1024)
66 + if not data:
67 + print("Disconnected")
68 + break
69 + StringData = queue.get()
70 + Client_socket.send(str(len(StringData)).ljust(16).encode())
71 + Client_socket.send(StringData)
72 + except ConnectionResetError as e:
73 + print("Disconnected")
74 + Client_socket.close()
75 +
76 +
77 +def webcam(queue):
78 + capture = cv2.VideoCapture(0)
79 + while True:
80 + ret, frame = capture.read()
81 +
82 + if ret == False:
83 + continue
84 + frame = bboxes(frame)
85 + encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90]
86 + result, imgencode = cv2.imencode('.jpg', frame, encode_param)
87 + data = np.array(imgencode)
88 + stringData = data.tostring()
89 + queue.put(stringData)
90 + cv2.imshow('image', frame)
91 + key = cv2.waitKey(1)
92 + if key == 27:
93 + break
94 +
95 +if __name__ == '__main__':
96 + HOST = '127.0.0.1'
97 + PORT = 9999
98 +
99 + server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
100 + server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
101 + server_socket.bind((HOST, PORT))
102 + server_socket.listen()
103 +
104 + print('server start')
105 +
106 + start_new_thread(webcam, (enclose_q,))
107 +
108 + while True:
109 + print('wait')
110 +
111 + client_socket, addr = server_socket.accept()
112 + start_new_thread(threaded, (client_socket, addr, enclose_q,))
113 + server_socket.close()