diff --git a/fourcell/analyze.py b/fourcell/analyze.py index 306f07c..ac320f4 100644 --- a/fourcell/analyze.py +++ b/fourcell/analyze.py @@ -46,6 +46,23 @@ print(f'Analyzing {scanImage} and creating {templateFile}') img = cv2.imread(scanImage) height, width = img.shape[:2] +orientation = height > width +pageDim = (11, 8.5) +if not orientation : + pageDim = (8.5, 11) +pageRatio = pageDim[1] / pageDim[0] + +left=-1 +right=-1 +top=-1 +bottom=-1 + +if orientation : + left = width * 0.2 + right = width * 0.8 +else : + top = height * 0.2 + bottom = height * 0.8 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) @@ -57,52 +74,57 @@ canny = cv2.Canny(thresh, 75, 200) contours, hierarchy = cv2.findContours(canny, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE) -contour_list = [] -area_list = [] +contourList = [] +areaList = [] for contour in contours: - approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True) - area = cv2.contourArea(contour) - area_list.append(area) - contour_list.append(contour) + approx = cv2.approxPolyDP(contour, 0.03 * cv2.arcLength(contour, True), True) + if cv2.isContourConvex(approx) : + M = cv2.moments(contour) + cX = int(M["m10"] / M["m00"]) + cY = int(M["m01"] / M["m00"]) + if (orientation and ( cX < left or cX > right) ) or ( not orientation and ( cY < top or cY > bottom)) : + area = cv2.contourArea(contour) + areaList.append(area) + contourList.append(contour) maxArea=0 maxIndex=0 -for i in range(len(area_list)) : - area = area_list[i] +for i in range(len(areaList)) : + area = areaList[i] if area > maxArea: maxArea = area maxIndex = i count = 0 -hole_punches = [] +holePunches = [] centers = [] centersStr = [] -area_range = 0 +areaRange = 0 # pretty good # add position constraint while count < 6 : - area_range+=1 - for i in range(len(area_list)) : - area = area_list[i] - if area == maxArea or area * ((100 + area_range) / 100) > maxArea : - M = cv2.moments(contour_list[i]) + areaRange+=1 + for i in range(len(areaList)) : + area = areaList[i] + if area == maxArea or area * ((100 + areaRange) / 100) > maxArea : + M = cv2.moments(contourList[i]) cX = int(M["m10"] / M["m00"]) cY = int(M["m01"] / M["m00"]) strC = f'{cX},{cY}' if strC in centersStr : continue centersStr.append(strC) - corners.append((cX, cY)) + centers.append((cX, cY)) print(f'{cX},{cY}') cv2.circle(img, (cX, cY), 40, (255, 0, 0), -1) - hole_punches.append(contour_list[i]) + holePunches.append(contourList[i]) count+=1 -print(f'Found hole punches within {area_range}% of largest') +print(f'Found hole punches within {areaRange}% of largest') -cv2.drawContours(img, hole_punches, -1, (0, 255, 0), 20) +cv2.drawContours(img, holePunches, -1, (0, 255, 0), 20) display(img)