simple omr suite with python and latex
Use LaTeX with the style file src/marksheet/marksheet.sty.
Copy marksheet.sty to the same directory/folder as your LaTeX src.
Put the command \usepackage{marksheet} in your preamble,
and use commands,
\brankmark,
\positionmarkerH,
\positionmarkerV,
\positionmarkerNE and so on.
See sample/sample-5x15.tex for usage of them.
The package marksheet requires
packages
graphicx,
qrcode, and
makebarcode.
\brankmark: \brankmark{} makes a brank oval symbol to fill by pen/pencil.
\brankmark{hoge} makes an oval symbol with the hint hoge.
\positionmarkerH: \positionmarkerH{HOGE} makes a barcode (of CODE39) for HOGE.
This barcode tells that there exist oval symbols in the row where this barcode lies,
and that the name of the row is HOGE.
Since the name of row is encoded as CODE39,
the name should be a string of 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.
The size of barcode depends on the length of the string.
Each \brankmark{} should be contained by at least one \positionmarkerH.
\positionmarkerV: \positionmarkerV{FUGA} makes a barcode (of CODE39) for FUGA.
This barcode tells that there exist oval symbols in the column where this barcode lies,
and that the name of the column is FUGA.
Since the name of row is encoded as CODE39,
the name should be a string of 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.
The size of barcode depends on the length of the string.
Each \brankmark{} should be contained by at least one \positionmarkerV.
NOTICE: All of names of rows and columns in the same page should be different one another.
\positionmarkerNE: \positionmarkerNE{fuga} makes a QR code for fuga.
This QR code tells
that there exist \positionmarkerV in the row where this QR code lies,
that there exist \positionmarkerH in the column where this QR code lies,
and that the name of suite of questions is fuga.
\positionmarkerSE: \positionmarkerSE{fuga} makes a QR code for fuga.
This QR code tells
that there exist \positionmarkerV in the row where this QR code lies,
that there exist \positionmarkerH in the column where this QR code lies,
and that the name of suite of questions is fuga.
\positionmarkerNW: \positionmarkerNW{fuga} makes a QR code for fuga.
This QR code tells
that there exist \positionmarkerV in the row where this QR code lies,
that there exist \positionmarkerH in the column where this QR code lies,
and that the name of suite of questions is fuga.
\positionmarkerSW: \positionmarkerSW{fuga} makes a QR code for fuga.
This QR code tells
that there exist \positionmarkerV in the row where this QR code lies,
that there exist \positionmarkerH in the column where this QR code lies,
and that the name of suite of questions is fuga.
NOTICE:
Each \positionmarkerH should be contained by at least one of \positionmarkerNE, \positionmarkerSE, \positionmarkerNW and \positionmarkerSW.
NOTICE:
Each \positionmarkerV should be contained by at least one of \positionmarkerNE, \positionmarkerSE, \positionmarkerNW and \positionmarkerSW.
NOTICE: Toyomr recognize the angle of scaned image by QR codes. At least one of the following is required:
\positionmarkerNEand\positionmarkerSEin the same column.\positionmarkerNWand\positionmarkerSWin the same column.\positionmarkerNEand\positionmarkerNWin the same row.\positionmarkerSEand\positionmarkerSWin the same row.
src/toyomr.py requires
opencv cv2,
zbar pyzbar and
numpy numpy.
At this moment, functions to read scaned pdf files are not implemented.
toyomr.py reads a image from a document camera, or ELMO.