# --- Приклад_4 розпізнавання образів через векторізацію піксельного зображення з бібліотекою  OpenCV
import cv2
# ---- завантаження зображення, формування картинки відтінків сірого, зменьшення різкості
image = cv2.imread(" L10_example.jpg ")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (3, 3), 0)
cv2.imwrite("L10_1_gray.jpg", gray)
#------------ розпізнавання контурів  --------------------------------------------------
edged = cv2.Canny(gray, 10, 250)
cv2.imwrite("L10_2_edged.jpg", edged)
# ------------ створення файлу проміжного результату ------- ---------------------------
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)
cv2.imwrite("L10_3_closed.jpg", closed)
# ------------- пошук контурів на зображені з підрахунком кількості книжок -----------
cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]
total = 0
# ------------- ГОЛОВНА ідея РОЗПІЗНАВАННЯ ОБРАЗІВ -----------------------------------
# -------------цикл по контурам ------------------------------------------------------
for c in cnts:
    # ---------апроксимація (згладжування) контуру ------------------------------------
    peri = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.02 * peri, True)
    # ---------- !!!!! головна задача ідентифікації  !!!! -----------------------------
    # ---------- якщо у контура 4 вершини то це книга ---------------------------------
    if len(approx) == 4:
        cv2.drawContours(image, [approx], -1, (0, 255, 0), 4)
        total += 1

# ------------------ результуюче зображення ------------------------------------------
print("Знайдено {0} книги на цій картинці".format(total))
cv2.imwrite("L10_4_output.jpg", image)

