Yêu cầu thg 7 17, 2020 9:57 SA 180 0 1
  • 180 0 1
0

[OpenCV] object detection

Chia sẻ
  • 180 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 ạ!

thg 7 17, 2020 10:15 SA

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 😃)

thg 7 18, 2020 8:07 SA

@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 ạ

thg 7 18, 2020 10:13 SA

@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,

thg 7 21, 2020 10:11 SA

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 ạ.

thg 7 21, 2020 10:24 SA

@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 😦(

thg 7 22, 2020 2:35 CH

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

1 CÂU TRẢ LỜI


Đã trả lời thg 7 18, 2020 10:14 SA
+1

@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,

Chia sẻ
Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí