Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 06.08.2021
Сообщений: 4

OpenCV, выделить рамку с датой

06.08.2021, 13:57. Показов 2597. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, уважаемые форумчане!

Имеется проблема. Есть коробка, на ней рамка для даты. Задача - задетектить её (рамку).

Исходный вариант с максимально похожими цветами возле рамки (фон почти сливается). Стоит немного обвести контур, всё ок.

Исходную картинку перевожу в ч/б 1 бит. И после этого получается так.


На этой картинке не получается задетектить рамку. На других картинках рамка детектиться по этому алгоритму.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# import the necessary packages
import numpy as np
import cv2
 
 
# load the image
image = cv2.imread("6_res_wb.jpg")
 
# find all the 'color' shapes in the image
lower = np.array([240, 240, 240])  # (color - B G R)
upper = np.array([255, 255, 255])  # (color - B G R)
shapeMask = cv2.inRange(image, lower, upper)
 
# find the contours in the mask
contours, hierarchy = cv2.findContours(shapeMask.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
 
# loop over the contours
for contour in contours:
    approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)
 
    x = approx.ravel()[0]
    y = approx.ravel()[1] - 5
 
    if len(approx) == 3:
        x, y, w, h = cv2.boundingRect(contour)
        # cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 255), 2)
 
        # cv2.putText(image, "Triangle", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
    elif len(approx) == 4:
        x, y, w, h = cv2.boundingRect(approx)
        aspectRatio = float(w) / h
        # print(aspectRatio)
        if 0.95 <= aspectRatio < 1.05:  # square
            x, y, w, h = cv2.boundingRect(contour)
            # cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
 
            # cv2.putText(image, "square", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
 
        else:  # rectangle
            x, y, w, h = cv2.boundingRect(contour)
            # cv2.rectangle(image, (x, y), (x + w, y + h), (0, 0, 255), 2)
 
            # cv2.putText(image, "rectangle", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
 
    elif len(approx) == 5:  # pentagon
        x, y, w, h = cv2.boundingRect(contour)
        # cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 255), 2)
 
        # cv2.putText(image, "pentagon", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
 
    elif len(approx) == 10:  # star
        x, y, w, h = cv2.boundingRect(contour)
        # cv2.rectangle(image, (x, y), (x + w, y + h), (200, 200, 200), 2)
 
        # cv2.putText(image, "star", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
 
    else:  # circle
        _cnt = cv2.contourArea(contour)
        if 9400 < _cnt < 11000:
            print(len(approx))
            print(_cnt)
            x, y, w, h = cv2.boundingRect(contour)
            cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
 
            # cv2.putText(image, "circle", (x, y), cv2.FONT_HERSHEY_COMPLEX, 0.5, (0, 0, 0))
 
cv2.imshow('shapes', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Пожалуйста, объясните как пользоваться OpenCV.
Миниатюры
OpenCV, выделить рамку с датой   OpenCV, выделить рамку с датой  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.08.2021, 13:57
Ответы с готовыми решениями:

Выделение объектов в рамку Opencv
Здравствуйте! В моей программе сохраняется фон, затем в режиме реального времени фиксируются пиксели, отличные от ранее сохраненного фона....

Выделить рамку
Добрый день Есть задача . Есть 4 дива.&lt;div&gt;&lt;/div&gt; Когда я навожу курсор на один . Делаю hover тогда рамка того что навела , она...

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

6
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
06.08.2021, 17:24
Ky3ma, Если надо обвести рамку, то обводите, например так :
Python
1
2
3
4
5
6
7
8
9
10
11
import cv2
 
image=cv2.imread('2021-08-06_134748 .png')
image_hsv=cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = (106, 65, 123)  # (color -hsv)
upper = (126, 160, 188)  # (color - hsv)
shapeMask = cv2.inRange(image_hsv, lower, upper)
rect=cv2.boundingRect(shapeMask)
image=cv2.rectangle(image, rect, (255,0,255), 2)
cv2.imshow('image', image)
cv2.imwrite('res.png', image)
А если серьезно, то почему бы действительно сразу не выделять надпись, а не фон?
Миниатюры
OpenCV, выделить рамку с датой  
2
0 / 0 / 0
Регистрация: 06.08.2021
Сообщений: 4
07.08.2021, 17:35  [ТС]
Результат, конечно, действительно хорош. Не совсем понимаю как этот HSV метод работает, но по примеру, вроде, понятно, что мы ищем некоторый разброс по зелёным цветам.

И это хорошо работает в идеальных условиях) Даты, например, может и не быть. Или цвет чернил поменяется. Не знаю, будет ли такое или не будет.

В принципе, если дата не задетектиться, то её либо нет, либо цвет чернил поменялся... Хорошая ли практика искать по цвету чернил?

Добавлено через 2 минуты
На других коробках, другие цвета чернил, а рамка всегда +/- в одинаковом месте.

Алгоритм поиска рамки, для дальнейшего анализа найденной области, казался идеальным) Пока не столкнулся с данным дизайном коробки с одинаковыми цветами.
0
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
07.08.2021, 17:46
Ky3ma, почему по зеленым? чернила же синие...
Цитата Сообщение от Ky3ma Посмотреть сообщение
Хорошая ли практика искать по цвету чернил?
Понятия не имею. Это вы должны представлять, что может меняться на картинках, а что нет. У меня всего одна ваша картинка - сэмпл, а у вас целый массив изображений - генеральная совокупность. Тестируйте. Если на рамке нет текста, то какой смысл ее детектить?
Одно точно плохо детектить: белую рамку на белом фоне без текста.
1
0 / 0 / 0
Регистрация: 06.08.2021
Сообщений: 4
07.08.2021, 17:50  [ТС]
Чернила то да, но в HSV варианте они же зелёные становятся. Если я цвета не путаю)

И... есть ли какой-нибудь лайфхак по поиску верхней и нижней границы в HSV?
0
5517 / 2870 / 571
Регистрация: 07.11.2019
Сообщений: 4,761
07.08.2021, 18:08
Цитата Сообщение от Ky3ma Посмотреть сообщение
Чернила то да, но в HSV варианте они же зелёные становятся.
Нет, так не корректно говорить. Точка цвета ведь одна и та же, просто система координат поменялась...
Я просто смотрел в просмоторщике картинку, пипеткой смотрел цвета текста в rgb, онлайн конвертором переводил в hsv, затем на калькуляторе считал значение h (для openCV оно максимальное не 360, а 180, т.е делить на 2), s, v переводил из процентов в диапазон 0-255. верхняя граница +5%, нижняя-5%
Смотрел что получается в shapeMask, при необходимости добавлял или убавлял значения.
Можно сделать приложение с ползунками для интерактивного выбора диапазона hsv, но лень.
1
0 / 0 / 0
Регистрация: 06.08.2021
Сообщений: 4
08.08.2021, 02:11  [ТС]
Спасибо за помощь. Буду пробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.08.2021, 02:11
Помогаю со студенческими работами здесь

Сравнить 3 числа и выделить рамку большего использовать js, css, html
Задано три целых числа: A, B и С. Определить самое большое из этих чисел. Нужно сделать зелёную рамку вокруг максимального числа. Если их...

Выделить строку с сегодняшней датой
Есть dataGridView отображающий таблицу Access, и в нем есть поле с датой. Как при запуске программы автоматически выделять всю строку, в...

Как выделить текст в рамку с границами разной формы (word 2007)
Скажите, пожалуйста, как поместить текст (не страницу) в рамку с разными границами (слева - коричневая, справа - зеленая и т.д.)? ...

Макрос должен выделить ячейку с сегодняшней датой
В Function Colas (в самом конце Макрос1) есть эти рядки : aH.Cells(7, 2)(dTc).Interior.Color = vbCyan aH.Cells(7,...

Выделить линии и разрезать картинку по ним. (Opencv)
Здравствуйте, наставьте на путь истинный, подскажите алгоритм. На данной картинке нужно выделить все цифры на отдельные блоки (т.е...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru