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

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

06.08.2021, 13:57. Показов 2538. Ответов 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
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
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
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
07.08.2021, 17:46
Ky3ma, почему по зеленым? чернила же синие...
Цитата Сообщение от Ky3ma Посмотреть сообщение
Хорошая ли практика искать по цвету чернил?
Понятия не имею. Это вы должны представлять, что может меняться на картинках, а что нет. У меня всего одна ваша картинка - сэмпл, а у вас целый массив изображений - генеральная совокупность. Тестируйте. Если на рамке нет текста, то какой смысл ее детектить?
Одно точно плохо детектить: белую рамку на белом фоне без текста.
1
0 / 0 / 0
Регистрация: 06.08.2021
Сообщений: 4
07.08.2021, 17:50  [ТС]
Чернила то да, но в HSV варианте они же зелёные становятся. Если я цвета не путаю)

И... есть ли какой-нибудь лайфхак по поиску верхней и нижней границы в HSV?
0
5515 / 2868 / 571
Регистрация: 07.11.2019
Сообщений: 4,758
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
Ответ Создать тему
Новые блоги и статьи
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru