예제 #1
0
    def getMyHand(self):
        img = self.selectMyHand()
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY)[1]
        cnts, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_LIST,
                                           cv2.CHAIN_APPROX_SIMPLE)
        cnts = contours.sort_contours(cnts, method="left-to-right")[0]
        locs = []

        for c in cnts:
            peri = cv2.arcLength(c, True)
            approx = cv2.approxPolyDP(c, 0.02 * peri, True)
            x, y, w, h = cv2.boundingRect(approx)
            if 20 <= h < 40:
                rect = (x, y, w, h)
                locs.append(rect)
                cv2.rectangle(thresh, (x, y), (x + w, y + h), (0, 255, 0), 1)

        cv2.imshow("thresh", thresh)
        output = []

        for (i, (x, y, w, h)) in enumerate(locs):
            roi = thresh[y:y + h, x:x + w]
            roi = cv2.resize(roi, (57, 88))

            scores = []

            for (digit, digitROI) in self.ocrRef.items():
                result = cv2.matchTemplate(roi, digitROI, cv2.TM_CCOEFF)
                (_, score, _, _) = cv2.minMaxLoc(result)
                scores.append(score)
            output.append(Card(int(np.argmax(scores)), 0))
        return output
예제 #2
0
def save_card():
    if request.method == 'POST':
        if 'id' in request.form:
            card = Card.find_by_id(request.form['id'])
        else:
            card = Card()
            card.user = current_user.id

        card.word = request.form['word']
        card.definition = request.form['definition']
        card.save()

    return flask.redirect(url_for('admin_blueprint.card_form',
                                  card_id=card.id))
예제 #3
0
async def mau(websocket, path):
    # register(websocket) sends user_event() to websocket
    await register(websocket)
    try:
        async for message in websocket:
            data = json.loads(message)

            if data["action"] == "create_room":
                player = Player(data["name"], websocket)
                room = Room(player)
                ROOMS.append(room)
                await notify_users_about_rooms()

            elif data["action"] == "join_room":
                player_name = data["player_name"]
                player = Player(player_name, websocket)
                LONELY_USERS.remove(player.websocket)
                room = get_room_by_name(data["room_name"])
                await room.add_player(player)
                await notify_users_about_rooms()

            elif data["action"] == "start_game":
                room = get_room_by_name(data["room_name"])
                await room.start_round()

            elif data["action"] == "put_card":
                player_name = data["player_name"]
                card = data["card"]
                room = get_room_by_name(data["room_name"])
                player = room.get_player_by_name(player_name)
                card = Card(card["number"], get_enum_from_suit_type(card["type"]))
                await room.round.play(player, card)

            elif data["action"] == "take_card":
                player_name = data["player_name"]
                room = get_room_by_name(data["room_name"])
                player = room.get_player_by_name(player_name)
                await room.round.draw(player)
            else:
                logging.error("unsupported event: {}", data)
    finally:
        logging.info("unregistered");
        await unregister(websocket)
예제 #4
0
def card_form(card_id=None):
    if card_id is None:
        card = Card()
    else:
        card = Card.find_by_id(card_id)
    return flask.render_template('admin/card_form.html', card=card)
예제 #5
0
def index():
    user_cards = Card.all_for_current_user(current_user.id)
    return flask.render_template('admin/card_list.html', cards=user_cards)
예제 #6
0
def test_create_card():
    newCard = Card(
        word='Banana',
        definition='Seriously?...its the worlds most popular fruit!')

    # a new card at 0 should still move to bucket 1 when marked wrong
    newCard.mark_wrong()
    assert newCard.bucket == 1

    # a card in bucket 1 should not drop below 1
    newCard.mark_wrong()
    assert newCard.bucket == 1

    cardAvailable = (datetime.now() + timedelta(seconds=5)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    # every wrong answer should count
    assert newCard.wrong_count == 2

    newCard.mark_right()
    assert newCard.bucket == 2
    cardAvailable = (datetime.now() + timedelta(seconds=25)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 3
    cardAvailable = (datetime.now() + timedelta(minutes=2)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 4
    cardAvailable = (datetime.now() + timedelta(minutes=10)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 5
    cardAvailable = (datetime.now() + timedelta(hours=1)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    # marking the card right should not add to the wrong count
    assert newCard.wrong_count == 2

    newCard.mark_right()
    assert newCard.bucket == 6
    cardAvailable = (datetime.now() + timedelta(hours=5)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_wrong()
    assert newCard.bucket == 5
    cardAvailable = (datetime.now() + timedelta(hours=1)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)
    assert newCard.wrong_count == 3

    newCard.mark_right()
    assert newCard.bucket == 6
    cardAvailable = (datetime.now() + timedelta(hours=5)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 7
    cardAvailable = (datetime.now() + timedelta(days=1)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 8
    cardAvailable = (datetime.now() + timedelta(days=5)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 9
    cardAvailable = (datetime.now() + timedelta(days=25)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 10
    cardAvailable = (datetime.now() + timedelta(days=121)).timestamp()
    assert newCard.available.timestamp() == pytest.approx(cardAvailable)

    newCard.mark_right()
    assert newCard.bucket == 11
    daysInOneHundredAndFiftyYears = math.floor(365.4 * 150)
    cardStillNotAvailable = (
        datetime.now() +
        timedelta(days=daysInOneHundredAndFiftyYears)).timestamp()
    assert newCard.available.timestamp() > cardStillNotAvailable

    # a card should never go higher than bucket 11 even if a user manages to mark it
    # right when its in bucket 11 (should actually never be seen)
    newCard.mark_right()
    assert newCard.bucket == 11

    newCard.mark_right()
    newCard.mark_right()
    newCard.mark_right()
    newCard.mark_right()
    newCard.mark_right()
    assert newCard.bucket == 11
예제 #7
0
def mark_wrong(card_id=None):
    if card_id is not None:
        card = Card.find_by_id(card_id)
        card.mark_wrong()
        card.save()
    return flask.redirect(flask.url_for('userspace_blueprint.index'))
예제 #8
0
def index():
    next_card = Card.get_next(current_user.id)
    return flask.render_template('cards.html', card=next_card, user=current_user)
예제 #9
0
 def build(self):
     for suit in [Suits.HEARTS, Suits.SPADES, Suits.DIAMONDS, Suits.CLUBS]:
         for value in range(1, 14):
             self.cards.append(Card(value, suit))