Skip to content

Add first version - work with simple examples#1

Open
Kexon5 wants to merge 1 commit into
mainfrom
dev
Open

Add first version - work with simple examples#1
Kexon5 wants to merge 1 commit into
mainfrom
dev

Conversation

@Kexon5

@Kexon5 Kexon5 commented Mar 20, 2021

Copy link
Copy Markdown
Owner

На данный момент не всегда корректно или вообще не получается определить контуры листа, вследствие чего из-за использования иерархии контуров есть проблемы в определении контура эллипса

@atani20 atani20 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Необычная постановка задачи и нетипичный подход к решению. Работа хорошая, сделана с умом.

Хотелось бы больше описания того, что происходит ReadMe или же больше комментариев в коде, чтобы быстрее вникать в происходящее. Так же неплохо бы добавить в ReadMe требования к фотографии. Например, присутствие листа бумаги и луча на изображении.
Еще можно сравнить то, что получилось и то, что должно было получиться и посчитать по этому метрики для оценки качества работы алгоритма.

Comment thread big_lab.py
Comment on lines +123 to +124
cap = cv2.VideoCapture(0)
if cap.isOpened():

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как я понимаю, предполагается, что система работает в real time и считывает видео с определенной камеры, которая наблюдает за лучом. Но сейчас открывается вебка на ноутбуке, которая начинает анализировать мое изображение) Лучше будет как-то обойти этот момент и в лабе не вызывать чтение с камеры.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

присоединюсь к комментарию Тани - следует добавить хотя бы простой аргумент для запуска программы в желаемом режиме, а то ревьюверам приходится самим код править) но все равно прикольно было увидеть у кого-то поддержку такого режима работы. що сказатi, це фанастишно

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, простите. Я что-то не подумал, как будет работать на ноутбуках.
Поправлю)

Comment thread big_lab.py
Comment on lines +124 to +143
if cap.isOpened():
cap.set(3, WIDTH)
cap.set(4, HEIGHT)
while True:
suc, img = cap.read()
getContours(img, cam_mode=True)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
answer = [["ImageName", "DirectionToCamera", "FrameExist", "FigureExist", "FigureInPlaneSheet", "FigureInFrame",
"FigureShape"]]
for i in range(1, 31):
img_name = str(i) + ".jpg"
img = cv2.imread("Data_jpg\\" + img_name)
answer += getContours(img)

with open("results\\answers.csv", mode="w", encoding='utf-8') as w_file:
file_writer = csv.writer(w_file, delimiter=";", lineterminator="\r")
for ans in answer:
file_writer.writerow(ans)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Будет здорово, если ты напишешь этот кусочек кода вот так:

if __name__ == '__main__':
    # тут весь код

так же можно вынести код из if и else в две разные функции. В одной обработка видео в real-time, в другой обработка изображений из папки

Comment thread big_lab.py
Comment on lines +135 to +138
for i in range(1, 31):
img_name = str(i) + ".jpg"
img = cv2.imread("Data_jpg\\" + img_name)
answer += getContours(img)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Если изображений станет меньше 31, то код упадет. Если больше, то обработаются не все.
Можно сделать универсально:

import os
folder = "Data_jpg"
img_names = os.listdir(folder)
for name in img_names:
    img = cv2.imread(os.path.join(folder, name))
    answer += getContours(img)

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Да, понимаю.
Скорее я оставил эту конструкцию из соображения "потом докручу, как надо".

Comment thread big_lab.py

def getContours(img, cam_mode=False):
imgC = prepareImage(img)
contours, h = cv2.findContours(imgC, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

@atani20 atani20 Mar 20, 2021

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Как я понимаю, контуры находятся не всегда хорошо. В качестве эксперимента, можно попробовать такой подход.

Сделать шаблонную фотографию только листа бумаги (только зеркала). Найти особые точки на этом и текущем изображении. Сопоставить эти особые точки и найти матрицу гомографии. Можно воспользоваться примером отсюда https://docs.opencv.org/master/d1/de0/tutorial_py_feature_homography.html

Найти точки, описывающие углы прямоугольника, задающего контур на изображении-шаблоне. С помощью матрицы гомографии найти этот прямоугольник-контур на текущей картинке.

Тут надо смотреть, как долго работает такой подход, можем ли мы его использовать в real-time, работает ли подход на реальной системе, а не только на абстракции.

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В ходе реализации я пробовал использовать особые точки, но из этого не вышло ничего путного.
Может быть я где-то ошибся, но раз уж не только мне это кажется разумной идеей, то попробую ещё раз.

Comment thread big_lab.py
Comment on lines +93 to +94
if contours_to_draw[i] is not None:
if ellipse is not None:

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

эти два условия можно объединить в одно if contours_to_draw[i] is not None and ellipse is not None

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Хотелось бы в случае отсутствия эллипса всё-таки отрисовать контуры)
Как минимум для проверки корректности работы

Comment thread big_lab.py
Comment on lines +20 to +21
img_blur = cv2.GaussianBlur(img_gray, (3, 3), 1.6)
img_canny = cv2.Canny(img_blur, 10, 120)

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В алгоритме Canny используется заблюриваение с помощью Гауссиана. Так что нет смысла блюрить его заранее, а затем еще раз в детекторе. Вместе с тем, можно попробовать предобработку другим фильтром, например фильтром Соблея. Не факт, что результаты получатся лучше

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@atani20 В OpenCV'шной версии Canny применяется только фильтр Собеля, поэтому предобработка Гауссовским сглаживанием кажется уместной

https://stackoverflow.com/questions/63543033/does-cv2-canny-perform-a-gaussian-blur

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Спасибо за замечание. Не знала об этом

Comment thread big_lab.py
return False


def getContours(img, cam_mode=False):

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эта функция очень большая и не сразу становится понятно, что делается в каждой из ее частей. Предлагаю вынести код в теле некоторых циклов и ифов в отдельные функции с говорящими именами.

@via8 via8 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

т.к. моменты, на которые я тоже обратил внимание, в основном уже прокомментированы другими, оставлю замечания касательно работы в целом:

  • следует доработать программу на предмет адекватного поведения в случае невалидных данных (как, например, версия Тани со считыванием содержимого директории с датасетом может помочь здесь)
  • хотелось бы увидеть более детальное описание алгоритма в ридми, либо побольше комментариев прямо в коде над неочевидными операциями (а лучше и то и другое конечно). ревьюверу довольно тяжко вникать в происходящее в таком алгоритме, где довольно много констант, хотелось бы видеть описание хотя бы той их части, которая соответствует индексам

*а вообще прикольная работа получилась с этими вашими тамагочи

Comment thread big_lab.py
Comment on lines +123 to +124
cap = cv2.VideoCapture(0)
if cap.isOpened():

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

присоединюсь к комментарию Тани - следует добавить хотя бы простой аргумент для запуска программы в желаемом режиме, а то ревьюверам приходится самим код править) но все равно прикольно было увидеть у кого-то поддержку такого режима работы. що сказатi, це фанастишно

Comment thread big_lab.py
"FigureShape"]]
for i in range(1, 31):
img_name = str(i) + ".jpg"
img = cv2.imread("Data_jpg\\" + img_name)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Данный вариант указания пути будет работать только в Windows, для универсальности используй
path_file = os.sep.join([path_dir, filename])

либо модуль pathlib

@DariaZubkova DariaZubkova left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Интересная постановка задачи! Немного было сложно разобраться, как уже писали ранее, комментарии в коде не повредили бы.
Результаты работы можно было бы еще просто печатать в консоль, чтобы не лезть в файл(results\answers.csv) для проверки. Т.к. рассматриваются последовательно все данные с датасета, то можно последовательно также выводить текстовые и визуальные результаты, чтобы сразу отслеживать, как алгоритм сработал на этих данных.

@Kexon5

Kexon5 commented Mar 27, 2021

Copy link
Copy Markdown
Owner Author

Замечания все по делу и всё поправлю в следующей версии.

Также отвечу Дарье по поводу вывода результатов:
В конечном итоге планируется сравнивать ожидаемые результаты с полученными и выводить информацию либо о прохождении теста, либо на непрошедших сравнение результатов с ожидаемыми.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants