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)
→ Ссылка