def __init__(self, path, show_steps=False, save=False): self.image = Helpers.load_image(path) # build the prepocessing pipleine pipeline = Pipeline([ Helpers.convert_to_grayscale, lambda image: Helpers.blur(image, 5), Helpers.thresholdify, Helpers.ellipse_morph ]) processed_image = pipeline.process_pipeline(self.image) # get the contour, crop it out, find the corners and straighten contour = Helpers.largest_contour(processed_image) processed_image_cropped = Helpers.cut_out_rect(processed_image, contour) corners = Helpers.get_corners(processed_image_cropped) # apply the same cropping and warping to the original image image_cropped = Helpers.cut_out_rect(self.image, contour) straigtened_image = Helpers.warp_perspective(corners, image_cropped) if show_steps: Helpers.show(processed_image, 'Preprocessing') Helpers.show(processed_image_cropped, 'Processed image cropped') Helpers.show(image_cropped, 'Original image cropped') Helpers.show(straigtened_image, 'Final image') self.final = straigtened_image if save: Helpers.save_image( f'{Helpers.IMAGE_DIRECTORY}/extractor_finish.png', self.final) return None
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) # print("height", height) # print("width", width) # print("d x", dx) # print("d y", dy) # print(beliefs) # print("blu rring", blurring) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): for j, cell in enumerate(row): # print("i", i) # print("j", j) if (i + dy) >= 0 and (i + dy) < height: new_i = (i + dy) % width else: new_i = ((i + dy) % width) - width if (j + dx) >= 0 and (i + dy) < width: new_j = (j + dx) % height else: new_j = ((j + dx) % height) - height # print("new_i", new_i) # print("new_j", new_j) # pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def get_student_responses(self): student_responses = {} for num, cell in enumerate(self.cells): # clean the cell gray = Helpers.convert_to_grayscale(cell) thresh = self.cell_pipeline.process_pipeline(cell) corners = self.find_corners_inside_largest_contour(thresh, gray) warp = Helpers.warp_perspective(corners, gray, size="same", verbose=False) #Helpers.show(warp, "clean cell") # find the contour of the text warp = Helpers.dilate(warp, 1) blur = Helpers.blur(warp, 3) thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] contours = Helpers.find_contours(255 - thresh, mode_type="external", min_area=20) contours = Helpers.sort_contours(contours, method="left-to_right") rects = [] for contour in contours: rect = Helpers.cut_out_rect(warp, contour) rects.append(rect) student_responses[num] = rects return student_responses
def move(self, dy, dx ): new_beliefs = [[0.0 for i in range(self.width)] for j in range(self.height)] for i in range(self.height): for j in range(self.width): previous_belief = self.beliefs[i][j] new_i = (i + dy) % self.height new_j = (j + dx) % self.width new_beliefs[int(new_i)][int(new_j)] = previous_belief self.beliefs = blur(new_beliefs)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = (i + dy) % height new_j = (j + dx) % width new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i in range(height): for j in range(width): new_i = (i + dy) % height new_j = (j + dx) % width # pdb.set_trace() new_G[int(new_i)][int(new_j)] = beliefs[i][j] return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): for j, cell in enumerate(row): # debugging info : the "height" and "width" in the modulo part was interchanged. new_i = (i + dy) % height new_j = (j + dx) % width new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) #rows width = len(beliefs[0]) #cols new_G = [[0.0 for j in range(width)] for i in range(height)] for i, row in enumerate(beliefs): #row for j, cell in enumerate(row): #col new_i = (i + dx) % height new_j = (j + dy) % width #pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): for j, cell in enumerate(row): # There was error in the height and wisth positions in new_i & new_j; sol : change them interchangably new_i = (i + dy ) % height new_j = (j + dx ) % width # pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): # i corresponds to height for j, cell in enumerate(row): # j corresponds to width new_i = (i + dy ) % height new_j = (j + dx ) % width #height # pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] # print("new_G",(len(new_G),len(new_G[0])),(dy,dx)) for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = (i + dy) % (height) new_j = (j + dx) % (width) # pdb.set_trace() # print(new_i,new_j) new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] #np.zeros((width, height)) # for y, row in enumerate(beliefs): for x, cell in enumerate(row): new_y = (y + dy) % height new_x = (x + dx) % width #print("y:", y, "x:", x, '\n') #print("new y:", new_y, "new x:", new_x, '\n') #pdb.set_trace() new_G[int(new_y)][int(new_x)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) #new_G = [[0.0 for i in range(height)] for j in range(width)] new_G = [None] * height for i in range(height): new_G[i] = [None] * width for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = (i + dy) % (height) new_j = (j + dx) % (width) # pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): new_i = (i + dy) % height for j, cell in enumerate(row): new_j = (j + dx) % width #debugger, pasue code, and read temp value #pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def captureHistogram(source=None): source = 0 if source is None else source if source is not None and str(type(source)) != "<class 'int'>": raise ValueError("source: integer value expected") cap = cv2.VideoCapture(source) boxSize = 100 centerX = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH) / 2) centerY = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT) / 3) padding = boxSize + 10 while True: _, frame = cap.read() frame = cv2.flip(frame, 1) box1 = (centerY + padding * 0, centerX + padding * 0, boxSize, boxSize) box2 = (centerY + padding * 0, centerX + padding * 1, boxSize, boxSize) box3 = (centerY + padding * 1, centerX + padding * 0, boxSize, boxSize) box4 = (centerY + padding * 1, centerX + padding * 1, boxSize, boxSize) box5 = (centerY + padding * 2, centerX + padding * 0, boxSize, boxSize) box6 = (centerY + padding * 2, centerX + padding * 1, boxSize, boxSize) helpers.drawBoxes(frame, helpers.PURPLE, [box1, box2, box3, box4]) boxOne = helpers.crop(frame, box1) boxTwo = helpers.crop(frame, box2) boxThree = helpers.crop(frame, box3) boxFour = helpers.crop(frame, box4) boxFourBlurred = helpers.blur(boxFour, 15) helpers.copyTo(frame, box5, boxFour) helpers.copyTo(frame, box6, boxFourBlurred) cv2.imshow("Video Feed", frame) key = cv2.waitKey(10) if key == 97: objectColor = finalHistImage cv2.destroyAllWindows() break if key == 27: cv2.destroyAllWindows() cap.release() exit() hsvObjectColor = cv2.cvtColor(objectColor, cv2.COLOR_BGR2HSV) objectHist = cv2.calcHist([hsvObjectColor], [0, 1], None, [12, 15], [0, 180, 0, 256]) cv2.normalize(objectHist, objectHist, 0, 255, cv2.NORM_MINMAX) return objectHist
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = (i + dy) % width new_j = (j + dx) % height #pdb.set_trace() if new_i >= height: new_i = new_i - height if new_j >= width: new_j = new_j - width new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def process_image(self): ''' Process the image by thresholding and other techniques to make the cells easy to extract. Return value ---------- returns a black and white version of the image ''' # build the prepocessing pipleine pipeline = Pipeline([ Helpers.convert_to_grayscale, lambda image: Helpers.blur(image, 5), Helpers.thresholdify, Helpers.ellipse_morph ]) return pipeline.process_pipeline(self.image)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] #print new_G[0][3] #print new_G for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = ( i + dy ) % height #fix - previousltheight and width were interchanged new_j = (j + dx) % width #pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = ( i + dy ) % height # the problem was here. It was being modulo'ed with width instead of height new_j = ( j + dx ) % width # the problem was here. It was being modulo'ed with height instead of width # pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) new_G = [[0.0 for i in range(width)] for j in range(height)] heighti = len(new_G) widthi = len(new_G[0]) for i, row in enumerate(beliefs): for j, cell in enumerate(row): new_i = (i - dy ) % height new_j = (j - dx ) % width #pdb.set_trace() new_G[int(new_i)][int(new_j)] = cell return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): height = len(beliefs) width = len(beliefs[0]) #print('height', height) #print('width', width) new_G = [[0.0 for i in range(width)] for j in range(height)] #print('new_G', new_G) for i, row in enumerate(beliefs): new_i = 0 for j, cell in enumerate(row): new_i = (i + dy) % height new_j = (j + dx) % width #pdb.set_trace() #print('new_i', new_i, 'new_j', new_j, 'dy', dy, 'dx', dx) new_G[int(new_i)][int(new_j)] = beliefs[i][j] return blur(new_G, blurring)
def move(dy, dx, beliefs, blurring): #get the world size height = len(beliefs) width = len(beliefs[0]) #creat a new belife grid new_G = [[0.0 for i in range(width)] for j in range(height)] #go through the original belief for i, row in enumerate(beliefs): for j, cell in enumerate(row): #calculate new position new_i = (i + dy) % height new_j = (j + dx) % width #pdb.set_trace() #update beliefs new_G[int(new_i)][int(new_j)] = cell #movement uncertainty return blur(new_G, blurring)
from helpers import blur new_G = [[0 for i in range(3)] for j in range(3)] new_G[1][1] = 1 print(blur(new_G, 0.12))