Asked Jul 17th, 9:57 AM 118 0 1
  • 118 0 1
0

[OpenCV] object detection

Share
  • 118 0 1

Chào các anh/chị, Em vừa bắt đầu tìm hiểu về AI và có làm theo hướng dẫn của bài viết này (https://viblo.asia/p/cham-phieu-dien-trac-nghiem-bang-opencv-va-deep-learning-ByEZk9b25Q0#_su-dung-tflearn-cho-bai-toan-classification-5). Nhưng đến phần:
Thì gặp 1 vấn đề đó là "Chỉ detect được các chữ có trong bảng còn những ô không điền đáp án thì không detect được". Hay nói cách khác đó là em cần edit code như thế nào để detect được ô chưa điền đáp án, từ đó đưa ra phương án chấm điểm cho phiếu đây ạ? Mong anh/chị giúp đỡ giải đáp giúp ạ!

Jul 17th, 10:15 AM

Hỏi về bài viết cụ thể này bạn nên comment trực tiếp vào bài ấy chứ bạn tác giả sẽ trả lời cho bạn 😃)

0
| Reply
Share
Jul 18th, 8:07 AM

@QuangPH tại bài từ 2017-2018 rồi nên em thấy có 1 bạn gặp vấn đề tương tự nhưng vẫn chưa đc trả lời ạ

0
| Reply
Share
Jul 18th, 10:13 AM

@hautch À anh vừa đọc bài kia và anh thấy bên dưới bạn ấy có sử dụng một vòng lặp for để verify lại các contours tìm được phải đảm bảo lớn hơn 30,... ấy.

for i, countour_img in enumerate(countours_img):
    for cnt in countour_img:
....

countours_img là 1 list 19 ô tương ứng với 19 ô đáp án, vòng lặp for chạy qua kiểm tra các ô này nhưng bạn ấy lại chỉ viết if để kiểm tra, nếu pass thì giá trị answer có kết quả thôi. Giờ em viết thêm đoạn kiểm tra khi hết vòng lặp for cnt in countour_img: xem biến answer có giá trị không, nếu không có giá trị thì tức là không có countours nào thỏa mãn điều kiện là đáp án. Em pass qua ô đấy và ghi kết quả là None thôi em,

+2
| Reply
Share
Jul 21st, 10:11 AM

Hi Anh @QuangPH, Em có làm theo cách anh gợi ý như thế này nhưng kết quả vẫn không thay đổi bao nhiêu ạ.

for i, contour_img in enumerate(contours_img):
    for cnt in contour_img:
        if cv2.contourArea(cnt) > 30:
            x, y, w, h = cv2.boundingRect(cnt)
            if x > cropped_origin_img[i].shape[1]*0.1 and x < cropped_origin_img[i].shape[1]*0.9:
                answer = cropped_origin_img[i][y:y+h, x:x+w]
                answer = cv2.threshold(answer, 140, 255, cv2.THRESH_BINARY_INV)[1]
            if answer is None:
                answers.append('X')
            else:
               answers.append(answer)
    answers.append(answer)

Cám ơn Anh đã phản hồi ạ.

0
| Reply
Share
Jul 21st, 10:24 AM

@hautch Chào em, anh cũng chưa code lại bài này nên cũng không hẳn là rõ trường hợp em muốn xử lý, tuy nhiên phần code mới của em có vẻ không đúng.

for i, contour_img in enumerate(contours_img):
    answer = None
    for cnt in contour_img:
        if cv2.contourArea(cnt) > 30:
            x, y, w, h = cv2.boundingRect(cnt)
            if x > cropped_origin_img[i].shape[1]*0.1 and x < cropped_origin_img[i].shape[1]*0.9:
                answer = cropped_origin_img[i][y:y+h, x:x+w]
                answer = cv2.threshold(answer, 140, 255, cv2.THRESH_BINARY_INV)[1]
    if answer is None:
        answers.append('X')
    else:
        answers.append(answer)

Do anh code giấy, chưa chạy thử nên em chạy thử xem xem có được không 😦(

+1
| Reply
Share
Jul 22nd, 2:35 PM

Many thanks to @QuangPH ❤️ Em làm được rồi ạ

+1
| Reply
Share

1 ANSWERS


Answered Jul 18th, 10:14 AM
+3

@hautch À anh vừa đọc bài kia và anh thấy bên dưới bạn ấy có sử dụng một vòng lặp for để verify lại các contours tìm được phải đảm bảo lớn hơn 30,... ấy.

for i, countour_img in enumerate(countours_img):
    for cnt in countour_img:
....

countours_img là 1 list 19 ô tương ứng với 19 ô đáp án, vòng lặp for chạy qua kiểm tra các ô này nhưng bạn ấy lại chỉ viết if để kiểm tra, nếu pass thì giá trị answer có kết quả thôi. Giờ em viết thêm đoạn kiểm tra khi hết vòng lặp for cnt in countour_img: xem biến answer có giá trị không, nếu không có giá trị thì tức là không có countours nào thỏa mãn điều kiện là đáp án. Em pass qua ô đấy và ghi kết quả là None thôi em,

Share