Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Playing card scanner and matcher, image recognition, opencv
branch: master
Failed to load latest commit information.
data blank inventory file
doc/screenshots/gatherer_downloader screenshots
misc/magic_assistant_format misc things, might remove them
.gitignore
LICENSE
README.mediawiki changed Run to Runnning in readme
cache.py init
cv_utils.py
detect_card.py
magicassistantcsv.py init
match_card.py init
requirements.txt init
scan_card.py init
setcache.py init
test.py init
text2speech.py init

README.mediawiki

Table of Contents

Credit

Code mostly taken from card_scan by YenTheFirst. Chose not fork because of the amount of code change.

Overview

Magic the Gathering card recognition for purposes of quickly digitizing your inventory.

Features

  • Uses image recognition software opencv to quickly identify Magic the Gathering Cards
  • Outputs recognized cards in Magic Workstation csv format
  • Says the name of the card using Text-to-Speech festival
  • Runs in real-time

Screenshots

Dependency

  • a camera
  • python, opencv, numpy, SQLAlchemy, Flask, elixer
sudo apt-get install python-opencv
sudo pip install -r requirements.txt
  • festival
sudo apt-get install festival

MTG Set Images

apt-get install wine
unzip GathererDownloader*.zip

Setup

One variable is required to be set that denotes the location of the Magic the Gathering cards you wish to index against.

BASE_SET_DIR/
variable in test.py root directory of the images.

MTG Set Images

The matching algorithm is designed to find a matching card of a taken image. Thus, we need a database of cards to match against.

File Structure

BASE_SET_DIR/
variable in test.py root directory of the images.
BASE_SET_DIR/<set_name_abbreviation>
where set_name_abbreviation is a unique identifier for the set comprised of letters and numbers.
BASE_SET_DIR/<set_name_abbreviation>/<card_name>.full.jpg
where card_name is unique within a given set. Note that all the cards end in full.jpg

Gatherer Downloader

Automates downloading of full Magic the Gathering sets, both card listings and card images.


Start it

wine ./GathererDownloader.exe

Download the card database for the sets you wish to recognize/inventory. Note the "And all Sets After" option box for easily downloading multiple sets.

Now we will get the images associated with the cards but first, because we have a particular file directory structure, we need to ensure the naming convention is correct.

Click on Options -> Image Formats. Select Magic Workstation from the dropdown box and click Load Defaults. Then click Ok to save.

Click Download Card Images and select the directory you have set BASE_SET_DIR.

Running

./test.py
Note that matches cards are appended to the csv file configured via CSV_FILE in the file test.py

Controls

Note that the background should be a solid color. I used a piece of white printer paper.

  • r
    refresh the background
  • b
    save found match to csv database

Common Problems

test.py invalid camera.

OpenCV Error: Bad argument (Array should be CvMat or IplImage) in cvGetSize, file /build/buildd/opencv-2.3.1/modules/core/src/array.cpp, line 1238
Traceback (most recent call last):
  File "./test.py", line 87, in <module>
    capture = scanCard.check_for_card()
  File "/home/meyers/Dropbox/Code/python_card_scan/scan_card.py", line 173, in check_for_card
    self.grab_frame()
  File "/home/meyers/Dropbox/Code/python_card_scan/scan_card.py", line 119, in grab_frame
    frame_gray = to_gray_image(frame)
  File "/home/meyers/Dropbox/Code/python_card_scan/cv_utils.py", line 73, in to_gray_image
    gray = create_dummy_image(img)
  File "/home/meyers/Dropbox/Code/python_card_scan/cv_utils.py", line 65, in create_dummy_image
    return cv.CreateImage(cv.GetSize(img), 8,1)
cv2.error: Array should be CvMat or IplImage

Adding new magic sets and cards to the database to match against may require deleting the analyzed cache SET_CACHE_FILE in test.py

Something went wrong with that request. Please try again.