cnts = cnts[1] if imutils.is_cv3() else cnts[0] cnts = sorted(cnts, key=cv2.contourArea, reverse=True)[:4] cnts = contours.sort_contours(cnts)[0] # Initialize the output image as a "grayscale" image with 3 channels along with the output predictions output = cv2.merge([gray] * 3) predictions = [] # Loop over the contours for c in cnts: # Compute the bounding box for the contour then extract the digit (x, y, w, h) = cv2.boundingRect(c) roi = gray[y - 5:y + h + 5, x - 5:x + w + 5] # Pre-process the ROI and classify it roi = preprocess(roi, 28, 28) roi = np.expand_dims(img_to_array(roi), axis=0) pred = model.predict(roi).argmax(axis=1)[0] + 1 predictions.append(str(pred)) # Draw the prediction on the output image cv2.rectangle(output, (x - 2, y - 2), (x + w + 4, y + h + 4), (0, 255, 0), 1) cv2.putText(output, str(pred), (x - 5, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.55, (0, 255, 0), 2) # Show the output image print("[INFO]: Captcha: {}".format("".join(predictions))) cv2.imshow("Output", output) cv2.waitKey()
ap.add_argument("-d", "--dataset", required=True, help="path to input dataset") ap.add_argument("-m", "--model", required=True, help="path to output model") args = vars(ap.parse_args()) # Initialize the data and labels data = [] labels = [] # Loop over the input images for image_path in paths.list_images(args["dataset"]): # load the image, pre-process it, and store it in the data list image = cv2.imread(image_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) image = preprocess(image, 28, 28) image = img_to_array(image) data.append(image) # Extract the class label from the image path and update the labels list label = image_path.split(os.path.sep)[-2] labels.append(label) # Scale the raw pixel intensities to the range [0, 1] data = np.array(data, dtype="float") / 255.0 labels = np.array(labels) # Partition the data into training data (75%) and testing data (25%) (train_x, test_x, train_y, test_y) = train_test_split(data, labels, test_size=0.25, random_state=42) # Convert the labels from integers to vectors