Как сделать черный фон в cv2.putText с Python OpenCV - PullRequest
2 голосов
/ 13 марта 2020

У меня есть проект opencv, где на рамке я отображаю некоторый текст, используя cv2.putText(). В настоящее время это выглядит следующим образом:

enter image description here

Как видно в левом верхнем углу, текст присутствует, но он плохо виден. Можно ли сделать фон черным, чтобы текст выглядел хорошо? Нечто похожее на изображение ниже:

enter image description here

Даже если черный фон покрывает правую сторону кадра, это тоже хорошо. Ниже приведен код, который я использую для размещения текста во фрейме:

cv2.putText(frame, "Data: N/A", (5, 30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)
cv2.putText(frame, "Room: C1", (5, 60), cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1)

Существует ли какой-либо предварительно созданный метод / библиотека, доступная в opencv, которая может это сделать. Может кто-нибудь предложить хороший способ?

Ответы [ 2 ]

3 голосов
/ 14 марта 2020

Нет готового метода, но простой метод заключается в использовании cv2.rectangle + cv2.putText. Все, что вам нужно сделать, это нарисовать черный прямоугольник на изображении с последующим размещением текста. Вы можете настроить параметры x,y,w,h в зависимости от того, насколько большой / маленький вы хотите прямоугольник. Вот пример:

Исходное изображение:

enter image description here

Результат:

enter image description here

import cv2
import numpy as np

# Load image, define rectangle bounds
image = cv2.imread('1.jpg')
x,y,w,h = 0,0,175,75

# Draw black background rectangle
cv2.rectangle(image, (x, x), (x + w, y + h), (0,0,0), -1)

# Add text
cv2.putText(image, "THICC flower", (x + int(w/10),y + int(h/2)), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 2)

# Display
cv2.imshow('image', image)
cv2.waitKey()
1 голос
/ 13 марта 2020

Вот один из способов сделать это в Python OpenCV.

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

Ввод:

enter image description here

import cv2
import numpy as np

# load image
img = cv2.imread("zelda1.jpg")

# create same size image of background color
bg_color = (0,0,0)
bg = np.full((img.shape), bg_color, dtype=np.uint8)

# draw text on bg
text_color = (0,0,255)
cv2.putText(bg, "Data: N/A", (5,30), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.75, text_color, 1)

# get bounding box
# use channel corresponding to color so that text is white on black background
x,y,w,h = cv2.boundingRect(bg[:,:,2])
print(x,y,w,h)

# copy bounding box region from bg to img
result = img.copy()
result[y:y+h, x:x+w] = bg[y:y+h, x:x+w]

# write result to disk
cv2.imwrite("zelda1_background_text.jpg", bg)
cv2.imwrite("zelda1_text.jpg", result)

# display results
cv2.imshow("TEXT", bg)
cv2.imshow("RESULT", result)
cv2.waitKey(0)
cv2.destroyAllWindows()


Текст на цвет фона изображение:

enter image description here

Текст на входном изображении:

enter image description here

PS Вы можете отрегулировать значения ограничивающего прямоугольника (x, y, w, h), чтобы добавить отступы, если хотите при кадрировании.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...