Wiki › Project

OMR exam system

Project · app · 2026 · Key work

OMR exam system is a full exam-management platform built around optical mark recognition (OMR): reading filled-in bubbles on scanned answer sheets. It follows an exam from setup through printing, scanning and marking to the final reports.

What it covers

  • Classrooms and subjects, with their students.
  • Exams:
    • question papers and answer keys, both exportable as PDF;
    • seating plans, with seat assignments and a printable PDF.
  • Scanning: scanned sheets are uploaded in batches, and each sheet becomes a processing job.
  • Review: a reviewer checks the fields the reader wasn't sure about, side by side with the image of the sheet.
  • Analytics: results for each exam and each student, exported as CSV or as a report.

Reading the sheets

The recognition engine uses OpenCV:

  1. It converts each scan to black and white with adaptive thresholding.
  2. It finds the sheet's outline and straightens it.
  3. It reads the QR code printed on the sheet to identify it.
  4. It decides which bubbles are filled.

Uncertain fields go to the review queue instead of being guessed.

How it's built

Back end
a Flask API in Python, served by Gunicorn, with database migrations and a PDF generator.
Front end
React in TypeScript, with pages for each step and tests.
Running it
Docker Compose and a Makefile.

Its answer sheets come from the same idea as his Thai OMR answer sheet generator.

See also

In the knowledge graph

OMR exam system and the 16 things it is linked to. Open any dot for its page, or explore it in the full graph.

When
2023202420252026
Mar 2026 · 3 commits

As data

Everything on this page is read from triples in the knowledge graph. These are the 30 it states about OMR exam system, and 5 more its ontology implies; the console runs SPARQL over the whole graph, here in your browser.

Download
@prefix id: <https://ask.chaipat.cc/id/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix cj: <https://ask.chaipat.cc/ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

id:OMRXS
    a cj:Project ;
    rdfs:label "OMR exam system" ;
    cj:description "Exam management and OMR analytics system: classrooms, question papers, seating, review and reports." ;
    cj:context id:OpenSource ;
    cj:repository "https://github.com/AppleBoiy/omr-xs"^^xsd:anyURI ;
    cj:firstCommit "2026-03-18"^^xsd:date ;
    cj:lastCommit "2026-03-18"^^xsd:date ;
    cj:commitCount 3 ;
    cj:kind "app" ;
    cj:license "MIT" ;
    cj:theme id:ThemeWeb , id:ThemeML ;
    cj:uses id:Python ,
            id:Flask ,
            id:TypeScript ,
            id:React ,
            id:Docker ,
            id:OpenCV ,
            id:Gunicorn ,
            id:Make ;
    cj:tier 1 ;
    cj:keyRank 11 ;
    cj:implements id:OMR , id:AdaptiveThresholding ;
    cj:handles id:PDFFormat , id:CSVFormat ;
    cj:relatedTo id:OMRGenerator ;
    cj:article "https://ask.chaipat.cc/wiki/OMRXS"^^xsd:anyURI ;
    cj:activeIn id:Y2026 ;
    cj:activity _:b114 .