Обнаружение галочек и кругов на изображениях с помощью OpenCVPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обнаружение галочек и кругов на изображениях с помощью OpenCV

Сообщение Anonymous »

Я написал код для обработки изображений (да или нет).
Сейчас я сначала сравниваю изображения с шаблонами:
  • шаблон ответа «нет» (проверьте, не обведено ли «нет»)
  • шаблон ответа «да» (чтобы проверить, не обведено ли «да»)
  • шаблон флажка «нет» (снят)
  • шаблон флажка «да» (снят)
  • шаблоны «да/нет» с цифровой проверкой
  • шаблоны да/нет проверяются вручную
Если у меня есть изображение, обведенное (от руки), я использую OpenCV для обнаружения кругов с помощью этого кода: обнаружение кругов
Но на самом деле он не обнаруживает формы вокруг слов «нет» или «да». Я вижу, что обнаруживаются случайные круги. Если я рисую круги в целях отладки,
я получаю это, это увеличивает количество ложных срабатываний
[img]https:/ /i.sstatic.net/5DWnPfHO.png[/img]

Я попробовал изменить минимальный и максимальный радиус в функции houghCircle, чтобы учесть это (иногда букву O в NO принимают за круг)
Изображение
Я также пытался использовать OpenCV для обнаружения формы X или V на изображении для имитации флажка с помощью этого обнаружения галочки

Код: Выделить всё

def detect_text_circle(image_gray, text_bbox=None, show_plots=False):
"""
Detects if the text is surrounded by a circle.
"""
if text_bbox is not None:
x_text, y_text, w_text, h_text = text_bbox
roi = image_gray[y_text - 10 : y_text + h_text + 10, x_text - 10 : x_text + w_text + 10]
else:
roi = image_gray

blurred = cv2.GaussianBlur(roi, (9, 9), 0)
circles = cv2.HoughCircles(
blurred, cv2.HOUGH_GRADIENT, dp=1.2, minDist=20, param1=50, param2=30, minRadius=15, maxRadius=500
)

confidence = 0
detected = False

if circles is not None:
detected = True
confidence = 80  # Assign a confidence value based on detection

LOGGER.debug(f"Circles detected: {len(circles[0])}")

if show_plots:
output = cv2.cvtColor(roi, cv2.COLOR_GRAY2BGR)
for circle in circles[0, :]:
cx, cy, radius = map(int, circle)
LOGGER.debug(f"Circles detected with centre at {(cx, cy,)} and radius {radius}")
cv2.circle(output, (cx, cy), radius, (0, 255, 0), 2)
plt.imshow(output)
plt.title("Detected Circles Around Text")
plt.axis("off")
plt.show()
else:

LOGGER.debug("No circles detected around text.")

return detected, confidence

def detect_tick_marks(checkbox_roi, show_plots=False):
"""
Detects tick marks within a checkbox region by analyzing lines
and checking for V or X shapes.

Parameters:
checkbox_roi (numpy.ndarray): Grayscale image of the checkbox region.
show_plots (bool): If True, displays plots of detected lines.

Returns:
detected (bool): True if a tick mark is detected.
confidence (float): Confidence value between 0 and 100.
"""
# Preprocess ROI for edge detection
roi_blur = cv2.GaussianBlur(checkbox_roi, (3, 3), 0)
edges = cv2.Canny(roi_blur, threshold1=50, threshold2=150, apertureSize=3)

# Apply Hough Line Transform
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi / 180, threshold=20, minLineLength=10, maxLineGap=5)

confidence = 0
detected = False

if lines is not None and len(lines) > 0:

LOGGER.debug(f"Lines detected in checkbox: {len(lines)}")

# Analyze pairs of lines to detect V or X shapes
combinations = list(itertools.combinations(lines, 2))
shape_detected = False
for idx, (line1, line2) in enumerate(combinations):
x1_1, y1_1, x2_1, y2_1 = line1[0]
x1_2, y1_2, x2_2, y2_2 = line2[0]

# Calculate angles of the lines
angle1 = np.degrees(np.arctan2(y2_1 - y1_1, x2_1 - x1_1))
angle2 = np.degrees(np.arctan2(y2_2 - y1_2, x2_2 - x1_2))
angle_between = abs(angle1 - angle2)
if angle_between >  180:
angle_between = 360 - angle_between

# Calculate lengths of the lines
length1 = np.hypot(x2_1 - x1_1, y2_1 - y1_1)
length2 = np.hypot(x2_2 - x1_2, y2_2 - y1_2)

# Check if lines intersect
def lines_intersect(p1, p2, p3, p4):
"""Check if line segments (p1-p2) and (p3-p4) intersect."""
s1_x = p2[0] - p1[0]
s1_y = p2[1] - p1[1]
s2_x = p4[0] - p3[0]
s2_y = p4[1] - p3[1]

denominator = -s2_x * s1_y + s1_x * s2_y
if denominator == 0:
return False  # Lines are parallel

s = (-s1_y * (p1[0] - p3[0]) + s1_x * (p1[1] - p3[1])) / denominator
t = (s2_x * (p1[1] - p3[1]) - s2_y * (p1[0] - p3[0])) / denominator

if (0 

Подробнее здесь: [url]https://stackoverflow.com/questions/79174487/detect-ticks-and-circles-in-images-using-opencv[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обнаружение кругов в openCV
    Гость » » в форуме Python
    0 Ответы
    52 Просмотры
    Последнее сообщение Гость
  • Как установить собственные метки галочек в Plotly.Blazor
    Anonymous » » в форуме C#
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Обнаружение прямоугольных портретов людей на изображениях с помощью OpenCV
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Общее обнаружение субсимеров на изображениях с OpenCV
    Anonymous » » в форуме Python
    0 Ответы
    45 Просмотры
    Последнее сообщение Anonymous
  • Cv2.error: OpenCV(4.8.1) D:\a\opencv-python\opencv-python\opencv\modules\src\.cpp:660: ошибка: (-215: утверждение не вып
    Anonymous » » в форуме Python
    0 Ответы
    129 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»