Skip to content

june-oh/OMR_Checker_for_Quiz

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

19 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Speech Lab OMR Check

OMR ๋‹ต์•ˆ์ง€๋ฅผ ์›น์—์„œ ์—…๋กœ๋“œํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ธ์‹ํ•˜๊ณ  ์ฑ„์ ํ•˜์—ฌ CSV ๊ฒฐ๊ณผ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์›์Šคํ†ฑ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

์›๋ณธ ํ”„๋กœ์ ํŠธ: OMRChecker by Udayraj Deshmukh๋ฅผ forkํ•˜์—ฌ, ์›น ๊ธฐ๋ฐ˜ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ถ”๊ฐ€ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Web UI

์ฃผ์š” ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์„ค๋ช…
์›น ๊ธฐ๋ฐ˜ UI ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋“œ๋ž˜๊ทธ์•ค๋“œ๋กญ์œผ๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ, ๊ฒฐ๊ณผ ํ™•์ธ, CSV ๋‹ค์šด๋กœ๋“œ
์šฉ์ง€ ์ž๋™ ํฌ๋กญ 3๊ฐœ ์ฝ”๋„ˆ ๋งˆ์ปค๋ฅผ ๊ฐ์ง€ํ•˜์—ฌ OMR ์šฉ์ง€ ์˜์—ญ๋งŒ ์ž๋™ ์ •๋ ฌ ๋ฐ ํฌ๋กญ
์ปฌ๋Ÿฌ ๋“œ๋กญ์•„์›ƒ ๋นจ๊ฐ„์ƒ‰ ์ธ์‡„ ํ…œํ”Œ๋ฆฟ์ด ๋งˆํ‚น์œผ๋กœ ์˜ค์ธ์‹๋˜์ง€ ์•Š๋„๋ก max(B,G,R) ๊ธฐ๋ฒ•์œผ๋กœ ์ปฌ๋Ÿฌ ์ž‰ํฌ ์ œ๊ฑฐ
๊ฐ€๋กœ/์„ธ๋กœ ์ž๋™ ํŒ๋ณ„ ์„ธ๋กœ ์ด๋ฏธ์ง€๋Š” ์–‘๋ฐฉํ–ฅ ํšŒ์ „ ์‹œ๋„ ํ›„ ์ตœ์  ๋ฐฉํ–ฅ์„ ์ž๋™ ์„ ํƒ (๋งˆ์ปค ๊ฒ€์ถœ + ํ•™๋ฒˆ ์ธ์‹๋ฅ  ๊ธฐ๋ฐ˜)
๋‹ต์•ˆ ํ‚ค CSV ์ฑ„์  ๋‹ต์•ˆ ํ‚ค CSV ์—…๋กœ๋“œ ์‹œ ์ž๋™ ์ฑ„์  (์ •๋‹ต/์˜ค๋‹ต/๋ฏธ๊ธฐ์ž… ๋ฐฐ์  ์„ค์ • ๊ฐ€๋Šฅ)
์„ ํ–‰ 0 ๋ฌด์‹œ 08๊ณผ 8์„ ๋™์ผํ•œ ์ •๋‹ต์œผ๋กœ ์ธ์ •
๊ฐ€๋ณ€ ๋ฌธ์ œ ์ˆ˜ ๋‹ต์•ˆ ํ‚ค CSV์— ์žˆ๋Š” ๋ฌธ์ œ๋งŒ ์ฑ„์  (Q1~Q38์ด๋ฉด 38๋ฌธ์ œ๋งŒ)
๋””๋ฒ„๊ทธ ๋ชจ๋“œ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ” ํ–‰ ํด๋ฆญ ์‹œ ์ „์ฒด ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ํ™•์ธ (์›๋ณธโ†’ํšŒ์ „โ†’๋งˆ์ปค๊ฒ€์ถœโ†’Affineโ†’์ „์ฒ˜๋ฆฌโ†’์ตœ์ข…๊ฒฐ๊ณผ)
๋นˆ ๋‹ต์•ˆ ํ‚ค ํ…œํ”Œ๋ฆฟ 44/38/22๋ฌธํ•ญ ๋นˆ CSV ํ…œํ”Œ๋ฆฟ ๋‹ค์šด๋กœ๋“œ ์ œ๊ณต
๋‹ค์–‘ํ•œ ์Šค์บ๋„ˆ ์ง€์› ๋งˆ์ปค ํฌ๊ธฐ ์ž๋™ ์กฐ์ • (30~120px)์œผ๋กœ ์—ฌ๋Ÿฌ ์Šค์บ๋„ˆ ํ˜ธํ™˜

์„ค์น˜

์š”๊ตฌ์‚ฌํ•ญ

  • Python 3.8+
  • pip

์„ค์น˜ ๋ฐฉ๋ฒ•

pip install -r requirements.txt

์‹คํ–‰

python3 web_app.py

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:5000 ์œผ๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ

๋ฒ„๋ธ” ์œ„์น˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ณ  ์ง์ ‘ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

http://localhost:5000/template-editor

๊ธฐ๋Šฅ:

  • ํ…œํ”Œ๋ฆฟ JSON ์‹ค์‹œ๊ฐ„ ํŽธ์ง‘
  • ๋ฒ„๋ธ” ์œ„์น˜ ์‹œ๊ฐํ™” (๋นˆ ์บ”๋ฒ„์Šค์— ๋…น์ƒ‰ ์‚ฌ๊ฐํ˜• ํ‘œ์‹œ)
  • JSON ํฌ๋งท ์ž๋™ ์ •๋ฆฌ
  • ์ €์žฅ ์‹œ ์ž๋™ ๋ฐฑ์—… ์ƒ์„ฑ
  • ํ†ต๊ณ„ ํ‘œ์‹œ (ํŽ˜์ด์ง€/๋ฒ„๋ธ” ํฌ๊ธฐ, Field Block ์ˆ˜)

OMR ๋‹ต์•ˆ์ง€ ์ธ์‡„

template/44_questions.pdf ํŒŒ์ผ์„ ์ธ์‡„ํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” OMR ๋‹ต์•ˆ์ง€๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • 44๋ฌธํ•ญ (Q1~Q44), ๊ฐ ๋ฌธํ•ญ 2์ž๋ฆฌ ์ˆซ์ž ์‘๋‹ต (00~99)
  • ํ•™๋ฒˆ 9์ž๋ฆฌ ๊ธฐ์ž…๋ž€ ํฌํ•จ
  • 3๊ฐœ ์ฝ”๋„ˆ ๋งˆ์ปค (์ž๋™ ํฌ๋กญ/์ •๋ ฌ์— ์‚ฌ์šฉ)
  • ๋นจ๊ฐ„์ƒ‰ ์ธ์‡„ ๊ถŒ์žฅ (์ปฌ๋Ÿฌ ๋“œ๋กญ์•„์›ƒ์œผ๋กœ ์ธ์‡„ ์ž”์ƒ ์ž๋™ ์ œ๊ฑฐ)

์ธ์‡„ ํ›„ ํ•™์ƒ๋“ค์ด ๋‹ต์•ˆ์„ ๋งˆํ‚นํ•˜๊ณ , ์Šค์บ๋„ˆ๋กœ ์Šค์บ”ํ•œ ์ด๋ฏธ์ง€๋ฅผ ์›น์— ์—…๋กœ๋“œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.


์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Step 1: ๋‹ต์•ˆ ํ‚ค ์„ค์ •

  1. ๋นˆ ํ…œํ”Œ๋ฆฟ ๋‹ค์šด๋กœ๋“œ: 44/38/22๋ฌธํ•ญ ์ค‘ ์„ ํƒํ•˜์—ฌ ๋นˆ CSV ๋‹ค์šด๋กœ๋“œ
  2. ์ •๋‹ต ์ž…๋ ฅ: ๋‹ค์šด๋กœ๋“œํ•œ CSV์— ์ •๋‹ต ๊ธฐ์ž… (์˜ˆ: Q1,16)
  3. ์—…๋กœ๋“œ: ์™„์„ฑ๋œ CSV๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ์„ ํƒ์œผ๋กœ ์—…๋กœ๋“œ
  4. ๋ฐฐ์  ์„ค์ •: ์ •๋‹ต/์˜ค๋‹ต/๋ฏธ๊ธฐ์ž… ๊ฐ๊ฐ์˜ ์ ์ˆ˜ ์ง€์ •

๋‹ต์•ˆ ํ‚ค CSV ํ˜•์‹ (ํ—ค๋” ์—†์Œ):

Q1,16
Q2,17
Q3,8
...
Q44,36

Step 2: ์Šค์บ” ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ

  1. ์Šค์บ๋„ˆ์—์„œ ์ถœ๋ ฅ๋œ OMR ๋‹ต์•ˆ์ง€ JPG/PNG ์ด๋ฏธ์ง€๋ฅผ ๋“œ๋ž˜๊ทธํ•˜๊ฑฐ๋‚˜ ํŒŒ์ผ ์„ ํƒ
  2. ์—ฌ๋Ÿฌ ์žฅ ๋™์‹œ ์—…๋กœ๋“œ ๊ฐ€๋Šฅ
  3. ์˜ต์…˜ ์„ค์ •:
    • ์šฉ์ง€ ์ž๋™ ํฌ๋กญ: ์Šค์บ๋„ˆ ์ถœ๋ ฅ๋ฌผ์—์„œ OMR ์šฉ์ง€๋งŒ ์ž˜๋ผ๋ƒ„ (๊ธฐ๋ณธ ON)
    • ๋””๋ฒ„๊ทธ ๋ชจ๋“œ: ์ธ์‹ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Œ (๊ธฐ๋ณธ ON)

Step 3: ๊ฒฐ๊ณผ ํ™•์ธ

  • ํ†ต๊ณ„: ์ฒ˜๋ฆฌ ์™„๋ฃŒ, ๋‹ค์ค‘ ๋งˆํ‚น, ์˜ค๋ฅ˜, ํ‰๊ท /์ตœ๊ณ /์ตœ์ € ์ ์ˆ˜
  • ํ…Œ์ด๋ธ”: ํ•™๋ฒˆ(Num) + ๊ฐ ๋ฌธ์ œ ์‘๋‹ต + ์ •๋‹ต(์ดˆ๋ก)/์˜ค๋‹ต(๋นจ๊ฐ•) ํ•˜์ด๋ผ์ดํŠธ
  • ๋””๋ฒ„๊ทธ: ํ–‰ ํด๋ฆญ ์‹œ OMR ๋ฒ„๋ธ” ์ธ์‹ ์ด๋ฏธ์ง€ ํŒ์—…
  • CSV ๋‹ค์šด๋กœ๋“œ ๋ฒ„ํŠผ์œผ๋กœ ์ „์ฒด ๊ฒฐ๊ณผ ๋‹ค์šด๋กœ๋“œ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

speech_lab_OMR_check/
โ”œโ”€โ”€ web_app.py              # Flask ์›น ์•ฑ (๋ฉ”์ธ)
โ”œโ”€โ”€ template/
โ”‚   โ”œโ”€โ”€ template.json       # OMR ๋ ˆ์ด์•„์›ƒ ํ…œํ”Œ๋ฆฟ (๋ฒ„๋ธ” ์ขŒํ‘œ ์ •์˜)
โ”‚   โ””โ”€โ”€ 44_questions.pdf    # ์ธ์‡„์šฉ OMR ๋‹ต์•ˆ์ง€ (44๋ฌธํ•ญ)
โ”œโ”€โ”€ src/                    # OMRChecker ์ฝ”์–ด ๋ชจ๋“ˆ
โ”‚   โ”œโ”€โ”€ core.py             # ๋ฒ„๋ธ” ๊ฐ์ง€ ๋ฐ OMR ์‘๋‹ต ์ฝ๊ธฐ
โ”‚   โ”œโ”€โ”€ template.py         # ํ…œํ”Œ๋ฆฟ ํŒŒ์‹ฑ
โ”‚   โ”œโ”€โ”€ evaluation.py       # ์ฑ„์  ๋กœ์ง
โ”‚   โ”œโ”€โ”€ constants.py        # ์ƒ์ˆ˜ ์ •์˜
โ”‚   โ”œโ”€โ”€ logger.py           # ๋กœ๊น…
โ”‚   โ”œโ”€โ”€ defaults/           # ๊ธฐ๋ณธ ์„ค์ •๊ฐ’
โ”‚   โ”œโ”€โ”€ processors/         # ์ด๋ฏธ์ง€ ์ „์ฒ˜๋ฆฌ๊ธฐ (Levels, GaussianBlur ๋“ฑ)
โ”‚   โ”œโ”€โ”€ schemas/            # JSON ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ
โ”‚   โ””โ”€โ”€ utils/              # ์œ ํ‹ธ๋ฆฌํ‹ฐ (์ด๋ฏธ์ง€, ํŒŒ์‹ฑ, ํŒŒ์ผ)
โ”œโ”€โ”€ requirements.txt        # Python ํŒจํ‚ค์ง€ ์˜์กด์„ฑ
โ”œโ”€โ”€ LICENSE                 # MIT License
โ””โ”€โ”€ README.md               # ์ด ํŒŒ์ผ

ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ ๐ŸŽจ

์›น UI์—์„œ ์ง์ ‘ ํ…œํ”Œ๋ฆฟ์„ ํŽธ์ง‘ํ•˜๊ณ  ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

๋ ˆ์ด์•„์›ƒ

  • ๐Ÿ–ผ๏ธ ๋ฒ„๋ธ” ์œ„์น˜ ์‹œ๊ฐํ™” (์ƒ๋‹จ): ์ตœ๋Œ€ํ•œ ํฌ๊ฒŒ ํ‘œ์‹œ๋˜์–ด ์ •๋ฐ€ํ•œ ํ™•์ธ ๊ฐ€๋Šฅ
  • ๐Ÿ“ JSON ํŽธ์ง‘๊ธฐ (ํ•˜๋‹จ): ํ…œํ”Œ๋ฆฟ JSON ์ง์ ‘ ์ˆ˜์ •

์‚ฌ์šฉ ๋ฐฉ๋ฒ•

  1. ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ "โš™๏ธ ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ" ๋งํฌ ํด๋ฆญ
  2. ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ (์ค‘์š”!):
    • ์‹ค์ œ ์ฑ„์ ๊ณผ 100% ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค ์ ์šฉ
    • ๋ ˆ๋“œ ๋“œ๋กญ์•„์›ƒ โ†’ ํšŒ์ „ ๋ฐฉํ–ฅ ์ง€๋Šฅ ์„ ํƒ โ†’ ๋งˆ์ปค ๊ฒ€์ถœ โ†’ Affine ๋ณ€ํ™˜ (3507ร—2480) โ†’ Levels โ†’ GaussianBlur
    • ์ฒ˜๋ฆฌ ํ›„ ๋ฒ„๋ธ” ์œ„์น˜ ์˜ค๋ฒ„๋ ˆ์ด
  3. ๋นˆ ํ…œํ”Œ๋ฆฟ: ํ‘œ์ค€ ํฌ๊ธฐ(3507ร—2480) ํฐ ๋ฐฐ๊ฒฝ์— ๋ฒ„๋ธ”๋งŒ ํ‘œ์‹œ
  4. JSON ํŽธ์ง‘:
    • ๋ฒ„๋ธ” ํฌ๊ธฐ ์กฐ์ •: bubbleDimensions (์˜ˆ: [28, 45])
    • ํŽ˜์ด์ง€ ํฌ๊ธฐ ํ™•์ธ: pageDimensions (๊ธฐ๋ณธ: [3507, 2480])
    • Field block ์œ„์น˜ ์กฐ์ •: fieldBlocks ๊ฐ์ฒด

๊ธฐ๋Šฅ

  • ๐Ÿ’พ ์ €์žฅ: ํ…œํ”Œ๋ฆฟ ์ €์žฅ (์ž๋™ ๋ฐฑ์—…)
  • ๐Ÿ‘๏ธ ์‹œ๊ฐํ™”: ํ˜„์žฌ ๋ฒ„๋ธ” ์œ„์น˜ ๋ฏธ๋ฆฌ๋ณด๊ธฐ
  • โœจ ํฌ๋งท ์ •๋ฆฌ: JSON ์ž๋™ ์ •๋ ฌ
  • ๐Ÿ“ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ: ๋””๋ฒ„๊ทธ ๋ชจ๋“œ์™€ ๋™์ผํ•œ ์ „์ฒ˜๋ฆฌ โญ

โญ ํ•ต์‹ฌ: ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ์—์„œ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€ = ์‹ค์ œ ์ฑ„์  ์‹œ ๋ณด์ด๋Š” ์ด๋ฏธ์ง€!


๊ณ ๊ธ‰ ์„ค์ •

์Šค์บ๋„ˆ ํ˜ธํ™˜์„ฑ

์‹œ์Šคํ…œ์€ ๋‹ค์–‘ํ•œ ์Šค์บ๋„ˆ๋ฅผ ์ง€์›ํ•˜๋ฉฐ, ์ž๋™์œผ๋กœ ํฌ๊ธฐ๋ฅผ ๋ณด์ •ํ•ฉ๋‹ˆ๋‹ค:

์ •์ƒ ์ฒ˜๋ฆฌ (๋งˆ์ปค ๊ธฐ๋ฐ˜):

  1. 3๊ฐœ ์ฝ”๋„ˆ ๋งˆ์ปค ๊ฒ€์ถœ
  2. Affine ๋ณ€ํ™˜์œผ๋กœ 3507ร—2480 ํ‘œ์ค€ ํฌ๊ธฐ๋กœ ์ •๋ ฌ
  3. ํšŒ์ „ ๋ฐ ์™œ๊ณก ์ž๋™ ๋ณด์ •

Fallback ์ฒ˜๋ฆฌ (๋งˆ์ปค ์—†์Œ):

  • ๋งˆ์ปค ๊ฒ€์ถœ ์‹คํŒจ ์‹œ aspect ratio๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ๋ฆฌ์‚ฌ์ด์ฆˆ
  • ์ค‘์•™ ์ •๋ ฌ ํ›„ ํฐ์ƒ‰ ํŒจ๋”ฉ ์ถ”๊ฐ€
  • ์ธ์‹๋ฅ ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋งˆ์ปค๊ฐ€ ์žˆ๋Š” ์šฉ์ง€ ์‚ฌ์šฉ ๊ถŒ์žฅ

ํ…Œ์ŠคํŠธ๋œ ์Šค์บ๋„ˆ:

  • Origin Scanner: 3507ร—2480 (์™„๋ฒฝ ํ˜ธํ™˜)
  • Another Scanner: 3481ร—2458 (๋งˆ์ปค ๊ธฐ๋ฐ˜ ๋ณด์ •์œผ๋กœ ์™„๋ฒฝ ์ฒ˜๋ฆฌ)

๋ฒ„๋ธ” ์ธ์‹๋ฅ  ์กฐ์ •

์ธ์‹๋ฅ ์ด ๋‚ฎ์„ ๊ฒฝ์šฐ template/template.json ํŒŒ์ผ์˜ bubbleDimensions ๊ฐ’์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

{
    "bubbleDimensions": [28, 45]
}
  • ์ฒซ ๋ฒˆ์งธ ๊ฐ’ (๊ฐ€๋กœ): ๋ฒ„๋ธ”์˜ ๊ฐ€๋กœ ํฌ๊ธฐ (๊ธฐ๋ณธ: 28)
  • ๋‘ ๋ฒˆ์งธ ๊ฐ’ (์„ธ๋กœ): ๋ฒ„๋ธ”์˜ ์„ธ๋กœ ํฌ๊ธฐ (๊ธฐ๋ณธ: 45)
  • ๊ฐ’์„ ํฌ๊ฒŒ ํ• ์ˆ˜๋ก ์ธ์‹ ๋ฒ”์œ„๊ฐ€ ๋„“์–ด์ ธ ํ๋ฆฟํ•œ ๋งˆํ‚น๋„ ์ธ์‹๋˜์ง€๋งŒ, ๋„ˆ๋ฌด ํฌ๋ฉด ์˜ค์ธ์‹์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ถŒ์žฅ ๋ฒ”์œ„: ๊ฐ€๋กœ 2530, ์„ธ๋กœ 4248
  • ์ฃผ์˜: ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ ์ดˆ๊ณผํ•˜์ง€ ์•Š๋„๋ก ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค (์ตœ๋Œ€ ๊ฐ€๋กœ: 30, ์ตœ๋Œ€ ์„ธ๋กœ: 48)

๋งˆ์ปค ๊ฒ€์ถœ ๋ฌธ์ œ ํ•ด๊ฒฐ

์Šค์บ๋„ˆ์— ๋”ฐ๋ผ ๋งˆ์ปค ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ปค ๊ฒ€์ถœ์ด ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ:

  1. ๊ณ ํ•ด์ƒ๋„ ์Šค์บ”: 300 DPI ์ด์ƒ ๊ถŒ์žฅ
  2. ์šฉ์ง€ ์ •๋ ฌ: ์Šค์บ” ์‹œ ์šฉ์ง€๊ฐ€ ๊ธฐ์šธ์–ด์ง€์ง€ ์•Š๋„๋ก ์ฃผ์˜
  3. ๋Œ€๋น„ ์กฐ์ •: ์Šค์บ๋„ˆ ์„ค์ •์—์„œ ๋Œ€๋น„๋ฅผ ๋†’๊ฒŒ ์„ค์ •
  4. ๋งˆ์ปค ์ƒํƒœ: ๋งˆ์ปค๊ฐ€ ์†์ƒ๋˜๊ฑฐ๋‚˜ ๊ฐ€๋ ค์ง€์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ

ํ˜„์žฌ ์‹œ์Šคํ…œ์€ 30~120px ๋ฒ”์œ„์˜ ๋งˆ์ปค๋ฅผ ์ž๋™์œผ๋กœ ๊ฒ€์ถœํ•ฉ๋‹ˆ๋‹ค.


OMR ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ

์Šค์บ” ์ด๋ฏธ์ง€ (JPG/PNG - ์ปฌ๋Ÿฌ)
    โ”‚
    โ–ผ
[๋ ˆ๋“œ ๋“œ๋กญ์•„์›ƒ] max(B,G,R) + ๋นจ๊ฐ„ ํ”ฝ์…€โ†’ํฐ์ƒ‰(255) โ†’ ํ‘๋ฐฑ ๋ณ€ํ™˜
    โ”‚
    โ–ผ
[์„ธ๋กœ/๊ฐ€๋กœ ํŒ๋‹จ] 
    โ”œโ”€ height > width (์„ธ๋กœ ์ด๋ฏธ์ง€)
    โ”‚   โ”œโ”€ ์‹œ๊ณ„๋ฐฉํ–ฅ 90๋„ ํšŒ์ „ ์‹œ๋„ + ๋งˆ์ปค ๊ฒ€์ถœ
    โ”‚   โ”œโ”€ ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ 270๋„ ํšŒ์ „ ์‹œ๋„ + ๋งˆ์ปค ๊ฒ€์ถœ
    โ”‚   โ””โ”€ ๋งˆ์ปค๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ์žˆ๋Š” ๋ฐฉํ–ฅ ์„ ํƒ โญ
    โ””โ”€ width >= height (๊ฐ€๋กœ ์ด๋ฏธ์ง€) โ†’ ํšŒ์ „ ์—†์Œ
    โ”‚
    โ–ผ
[๋งˆ์ปค ๊ฒ€์ถœ] 3๊ฐœ ์ฝ”๋„ˆ ๋งˆ์ปค ๊ฒ€์ถœ (์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜)
    โ”‚
    โ–ผ
[๋งˆ์ปค ๋ฐฉํ–ฅ ํ™•์ธ] 
    โ”œโ”€ ์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜์— ๋งˆ์ปค ์žˆ๋Š”์ง€ ํ™•์ธ
    โ”œโ”€ ๋งŒ์•ฝ ์™ผ์ชฝ ์•„๋ž˜์— ๋งˆ์ปค ์žˆ์œผ๋ฉด โ†’ 180๋„ ํšŒ์ „ โš ๏ธ
    โ””โ”€ ๋งˆ์ปค ์œ„์น˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅผ ๋•Œ๊นŒ์ง€ ์ถ”๊ฐ€ ํšŒ์ „
    โ”‚
    โ–ผ
[Affine ๋ณ€ํ™˜] ๋งˆ์ปค ๋ฐ”๊นฅ์ชฝ ๊ธฐ์ค€ ์ •๋ ฌ + ํฌ๋กญ โ†’ 3507ร—2480 ํ‘œ์ค€ํ™”
    โ”‚
    โ–ผ
[์ „์ฒ˜๋ฆฌ] Levels (๋Œ€๋น„ ๊ฐ•ํ™”) โ†’ GaussianBlur (๋…ธ์ด์ฆˆ ์ œ๊ฑฐ)
    โ”‚
    โ–ผ
[๋ฒ„๋ธ” ๊ฐ์ง€] ๊ฐ ๋ฒ„๋ธ” ์˜์—ญ ๋ฐ๊ธฐ ๊ณ„์‚ฐ โ†’ ์ž„๊ณ„๊ฐ’ ๋น„๊ต โ†’ ๋งˆํ‚น ํŒ์ •
    โ”‚
    โ–ผ
[์‘๋‹ต ๊ฒฐํ•ฉ] roll_1~9 โ†’ ํ•™๋ฒˆ, Q1_1+Q1_2 โ†’ Q1 ๋“ฑ
    โ”‚
    โ–ผ
[์ฑ„์ ] ๋‹ต์•ˆ ํ‚ค ๋Œ€์กฐ โ†’ ์ •๋‹ต/์˜ค๋‹ต/๋ฏธ๊ธฐ์ž… ํŒ์ • โ†’ ์ ์ˆ˜ ์‚ฐ์ถœ
    โ”‚
    โ–ผ
๊ฒฐ๊ณผ CSV + ์›น ํ…Œ์ด๋ธ” + ๋””๋ฒ„๊ทธ ์ด๋ฏธ์ง€

โญ ํ•ต์‹ฌ ๊ฐœ์„  (2026-02-12):

  • ์„ธ๋กœ ์ด๋ฏธ์ง€ ์‹œ ์‹œ๊ณ„๋ฐฉํ–ฅ/๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ ์ง€๋Šฅ์  ์„ ํƒ (๋งˆ์ปค ์œ„์น˜ ๊ธฐ๋ฐ˜)
  • ์™ผ์ชฝ ์•„๋ž˜ ๋งˆ์ปค ๊ฐ์ง€ ์‹œ ์ฆ‰์‹œ 180๋„ ํšŒ์ „ (๋‹จ์ˆœํ™”๋œ ๋กœ์ง)
  • ํ…œํ”Œ๋ฆฟ ํŽธ์ง‘๊ธฐ: ์‹ค์ œ ์ธ์‹ ํ”„๋กœ์„ธ์Šค์™€ ๋™์ผํ•œ ์ „์ฒ˜๋ฆฌ (marker_align_and_crop ํฌํ•จ)
  • ๊ณ ํ•ด์ƒ๋„ PNG ์‹œ๊ฐํ™” (์••์ถ• ๋ ˆ๋ฒจ 1, ์ด๋ฏธ์ง€ ํ•ด์ƒ๋„ ๊ฐœ์„ )

๋””๋ฒ„๊ทธ ๋ชจ๋“œ ์„ธ๋ถ€ ๋‹จ๊ณ„

๋””๋ฒ„๊ทธ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ณ„ ์ด๋ฏธ์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์›๋ณธ ์ด๋ฏธ์ง€: ์—…๋กœ๋“œ๋œ ์›๋ณธ ์ปฌ๋Ÿฌ ์Šค์บ” ์ด๋ฏธ์ง€
  2. ๋ ˆ๋“œ ๋“œ๋กญ์•„์›ƒ: max(B,G,R) + ๋นจ๊ฐ„ ํ”ฝ์…€โ†’ํฐ์ƒ‰ โ†’ ํ‘๋ฐฑ ๋ณ€ํ™˜
  3. ํšŒ์ „ ๋ณด์ •: ์„ธ๋กœ ์ด๋ฏธ์ง€ โ†’ 90๋„ ๊ฐ•์ œ ํšŒ์ „ (๊ฐ€๋กœ๋กœ ๋งŒ๋“ค๊ธฐ) โญ
  4. ๋งˆ์ปค ๊ฒ€์ถœ: 3๊ฐœ ์ฝ”๋„ˆ ๋งˆ์ปค ๊ฒ€์ถœ ๋ฐ ํ‘œ์‹œ (์™ผ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์œ„, ์˜ค๋ฅธ์ชฝ ์•„๋ž˜)
  5. Affine ๋ณ€ํ™˜: ๋งˆ์ปค ๋ฐ”๊นฅ์ชฝ ๊ธฐ์ค€ ์ •๋ ฌ ๋ฐ ํฌ๋กญ โ†’ 3507ร—2480 ํ‘œ์ค€ํ™”
  6. ์ „์ฒ˜๋ฆฌ ์™„๋ฃŒ: Levels (๋Œ€๋น„ ๊ฐ•ํ™”) + GaussianBlur (๋…ธ์ด์ฆˆ ์ œ๊ฑฐ)
  7. ํ…œํ”Œ๋ฆฟ ๋ฒ„๋ธ” ์œ„์น˜: ์ธ์‹ํ•  ๋ฒ„๋ธ” ์œ„์น˜๋ฅผ ๋…น์ƒ‰ ์‚ฌ๊ฐํ˜•์œผ๋กœ ํ‘œ์‹œ
  8. ์ตœ์ข… ์ธ์‹ ๊ฒฐ๊ณผ: ๋ฒ„๋ธ” ์ธ์‹ ๋ฐ ๋งˆํ‚น ํ‘œ์‹œ, ์ •๋‹ต/์˜ค๋‹ต ํ•˜์ด๋ผ์ดํŠธ

Fallback ๋‹จ๊ณ„ (๋งˆ์ปค ๊ฒ€์ถœ ์‹คํŒจ ์‹œ):

  • Fallback ๋ฆฌ์‚ฌ์ด์ฆˆ: Aspect ratio ์œ ์ง€ํ•˜๋ฉฐ 3507ร—2480 ๊ฐ•์ œ ๋ณ€ํ™˜
  • ์ตœ์ข… ํฌ๊ธฐ ๋ณด์ •: ํฌ๊ธฐ ๋ถˆ์ผ์น˜ ์‹œ ์ถ”๊ฐ€ ๋ณด์ •

โญ ํ•ต์‹ฌ: ์„ธ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋จผ์ € ๊ฐ€๋กœ๋กœ ํšŒ์ „ โ†’ ๋งˆ์ปค ๊ฒ€์ถœ โ†’ Affine ๋ณ€ํ™˜์ด ์ •์ƒ ์ž‘๋™


๋ผ์ด์„ ์Šค

MIT License - ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ํ”„๋กœ์ ํŠธ๋Š” OMRChecker (MIT License, Copyright (c) 2024-present Udayraj Deshmukh)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์›น ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๊ฐœ์„ ์€ june-oh๊ฐ€ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.

About

Web-based OMR recognition and automatic grading system. Features auto-cropping, color dropout, and CSV export.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages