virtualenv env (if you use env)
env\Scripts\activate (if you use env)
pip install -r requirements.txt
fastapi dev main\server.py (start server)
| Method | Endpoint | Description | Body | 
|---|---|---|---|
| GET | / | Check Healty Service | - | 
| GET | /mock_response | Get Example Response | - | 
| POST | /predict | Execute OMR | file:{image-path} | 
Processing Scaning using sort_contours method ("left-to-right")

Scaning Answer Box for each section
And then finding answer (count the number of non-zero pixels in the box area) and append choice to array list
for (j, c) in enumerate(cnts):
            # construct a mask that reveals only the current
            # "box" for the question
            mask = np.zeros(thresh.shape, dtype="uint8")
            cv2.drawContours(mask, [c], -1, 255, -1)
            
            # apply the mask to the thresholded image, then
            # count the number of non-zero pixels in the
            # box area
            mask = cv2.bitwise_and(thresh, thresh, mask=mask)
            total = cv2.countNonZero(mask)
            
            # if the current total has a larger number of total
            # non-zero pixels, then we are examining the currently
            # bubbled-in answer
            if answer is None and total > 800:
                answer = (q+1 + (0 if section == 1 else (section * 20) - 20),get_answer_notation(j+1))
                
            elif answer is not None and total > 800 : 
                answer = (q+1 + (0 if section == 1 else (section * 20) - 20),None) 
            
            if j+1 == 4 and answer is None:
                answer = (q+1 + (0 if section == 1 else (section * 20) - 20),None) 
        sectionList.append(answer)
def get_answer_notation(value):
     return {
        1: 'ก',
        2: 'ข',
        3: 'ค',
        4: 'ง',
    }.get(value, None)  
Response
{
    "id": "1161104620611",
    "answer": [
        {
            "no": 1,
            "answer": "ก"
        },
        {
            "no": 2,
            "answer": "ข"
        },
        {
            "no": 3,
            "answer": null
        },
        {
            "no": 4,
            "answer": null
        },
        {
            "no": 5,
            "answer": "ก"
        },
        {
            "no": 6,
            "answer": "ก"
        },
        {
            "no": 7,
            "answer": null
        },
        {
            "no": 8,
            "answer": null
        },
        {
            "no": 9,
            "answer": null
        },
        {
            "no": 10,
            "answer": null
        },
        {
            "no": 11,
            "answer": null
        },
        {
            "no": 12,
            "answer": null
        },
        {
            "no": 13,
            "answer": null
        },
        {
            "no": 14,
            "answer": null
        },
        {
            "no": 15,
            "answer": null
        },
        {
            "no": 16,
            "answer": null
        },
        {
            "no": 17,
            "answer": null
        },
        {
            "no": 18,
            "answer": null
        },
        {
            "no": 19,
            "answer": null
        },
        {
            "no": 20,
            "answer": null
        },
        {
            "no": 21,
            "answer": null
        },
        {
            "no": 22,
            "answer": null
        },
        {
            "no": 23,
            "answer": null
        },
        {
            "no": 24,
            "answer": null
        },
        {
            "no": 25,
            "answer": null
        },
        {
            "no": 26,
            "answer": null
        },
        {
            "no": 27,
            "answer": null
        },
        {
            "no": 28,
            "answer": null
        },
        {
            "no": 29,
            "answer": null
        },
        {
            "no": 30,
            "answer": null
        },
        {
            "no": 31,
            "answer": null
        },
        {
            "no": 32,
            "answer": null
        },
        {
            "no": 33,
            "answer": null
        },
        {
            "no": 34,
            "answer": null
        },
        {
            "no": 35,
            "answer": null
        },
        {
            "no": 36,
            "answer": null
        },
        {
            "no": 37,
            "answer": null
        },
        {
            "no": 38,
            "answer": null
        },
        {
            "no": 39,
            "answer": null
        },
        {
            "no": 40,
            "answer": null
        }
    ],
    "headers": {
        "content-disposition": "form-data; name=\"file\"; filename=\"Computer_Programing_t2.png\"",
        "content-type": "image/png"
    },
    "filename": "306d4845-25cb-4e60-9d89-5aee7d40f767.jpg"
}
