BytesIO, открыть изображение в cv2.imread( предварительно не сохраняя его
im = BytesIO()
plt.savefig(im, format="png", dpi=DPI)
im.seek(0)
Не сохраняю, затем открываю
img = Image.open(im)
Работает, другой вопрос как выполнить тоже самое но открыть его в
cv2.imread(im)
В данном случаи ошибка
img_rgb = cv2.imread(im)
SystemError: <built-in function imread> returned NULL without setting an error
Решение
cv2.imdecode(np.frombuffer(im.getvalue(), np.uint8), cv2.IMREAD_UNCHANGED)
Но не цвет бордюров границ вхождения изменились
# Читать основное изображение
#img_rgb = cv2.imread(f'{patch}1111.png')
img_rgb = cv2.imdecode(np.frombuffer(im.getvalue(), np.uint8), cv2.IMREAD_UNCHANGED)
# Прочитайте шаблон
template = cv2.imread(f'{patch}6-spectrogram/22222.png',0)
# Сохраняем ширину и высоту шаблона в ш и ч
w, h = template.shape[::-1]
# Преобразовать его в оттенки серого/ Выполнять операции сопоставления.
res = cv2.matchTemplate(cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY),template,cv2.TM_CCOEFF_NORMED)
# Сохранять координаты совпадающей области в массиве
loc = np.where( res >= 0.8)
# Нарисуйте прямоугольник вокруг соответствующей области.
for pt in zip(*loc[::-1]):
cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,255,255), 2)
#Сохраняем изображение
cv2.imwrite(f'{patch}finish.png', img_rgb)
Ответы (1 шт):
Автор решения: gil9red
→ Ссылка
Попробуйте через numpy, используя frombuffer получить массив, а после его преобразовать через cv2.imdecode:
nparr = np.frombuffer(im.getvalue(), np.uint8)
img_rgb = cv2.imdecode(nparr, cv2.IMREAD_UNCHANGED)

