Python – OpenCV – imread – Отображение изображения

В настоящее время я работаю над чтением изображения и отображением его в окне. Я успешно сделал это, но при отображении изображения окно позволяет мне видеть только часть полного изображения. Я попытался сохранить изображение после его загрузки, и оно сохранило все изображение. Поэтому я совершенно уверен, что он читает все изображение.

imgFile = cv.imread('1.jpg')

cv.imshow('dst_rt', imgFile)
cv.waitKey(0)
cv.destroyAllWindows()

Изображение: image

Скриншот: screenshot


person Sinjin Forde    schedule 10.10.2013    source источник
comment
Вы используете старую версию (модуль Python для новой с именем cv2). Попробуйте обновить его.   -  person Igonato    schedule 10.10.2013
comment
Извините, я забыл упомянуть, что использую cv2 как cv.   -  person Sinjin Forde    schedule 14.10.2013
comment
Этот код выглядит нормально. Можете ли вы показать нам скриншот?   -  person Igonato    schedule 14.10.2013
comment
i.stack.imgur.com/ug90J.jpg i.stack.imgur.com/qsJuF.jpg   -  person Sinjin Forde    schedule 17.10.2013
comment
Это не позволило бы мне добавить изображения к моему вопросу, но вот ссылки на исходное изображение и скриншот результата.   -  person Sinjin Forde    schedule 17.10.2013


Ответы (3)


Похоже, изображение слишком большое и окно просто не помещается на экране. Создайте окно с флагом cv2.WINDOW_NORMAL, это сделает его масштабируемым. Затем вы можете изменить его размер, чтобы он соответствовал вашему экрану, например:

from __future__ import division
import cv2


img = cv2.imread('1.jpg')

screen_res = 1280, 720
scale_width = screen_res[0] / img.shape[1]
scale_height = screen_res[1] / img.shape[0]
scale = min(scale_width, scale_height)
window_width = int(img.shape[1] * scale)
window_height = int(img.shape[0] * scale)

cv2.namedWindow('dst_rt', cv2.WINDOW_NORMAL)
cv2.resizeWindow('dst_rt', window_width, window_height)

cv2.imshow('dst_rt', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Согласно документации OpenCV флаг CV_WINDOW_KEEPRATIO должен делать то же самое, но нет, и это значение даже не представлено в модуле Python.

person Igonato    schedule 17.10.2013
comment
Используйте screen_res с плавающей запятой, чтобы получить правильно масштабированное начальное изображение: screen_res = 1280., 720. - person Marc; 06.02.2016
comment
@Марк from __future__ import division посмотри - person Igonato; 06.02.2016
comment
Мне нужно было добавить cv2.resize(img, (window_width, window_height)) перед cv2.imshow('dst_rt', img) - person Rohit; 28.04.2016

Это может вам помочь

namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// Create a window for display.
imshow( "Display window", image );                   // Show our image inside it.
person Tom J Muthirenthi    schedule 10.10.2013
comment
Разве это не WINDOW_AUTOSIZE вместо CV_WINDOW_AUTOSIZE? - person demongolem; 03.03.2020

В openCV всякий раз, когда вы пытаетесь отобразить изображение большого размера или изображение, превышающее разрешение вашего экрана, вы получаете обрезанный дисплей. Это поведение по умолчанию.
Чтобы просмотреть изображение в выбранном вами окне, openCV рекомендует использовать именованное окно. См. документацию по namedWindow

Функция namedWindow создает окно, которое можно использовать в качестве заполнителя для изображений и трекбаров. Создаваемые окна называются по именам.

cv.namedWindow(name, flags=CV_WINDOW_AUTOSIZE) где каждое окно связано с контейнером изображений по имени arg, убедитесь, что используется одно и то же имя

eg:

import cv2
frame = cv2.imread('1.jpg')
cv2.namedWindow("Display 1")
cv2.resizeWindow("Display 1", 300, 300)
cv2.imshow("Display 1", frame)
person Mahesh    schedule 22.03.2018
comment
Имеет ли смысл иметь CV_WINDOW_AUTOSIZE, если вы затем явно вызываете resizeWindow()? - person WestCoastProjects; 27.05.2019
comment
@javadba, вы правы, CV_WINDOW_AUTOSIZE не рекомендуется, когда мы явно вызываем resizeWindow(), спасибо, что заметили это! - person Mahesh; 28.05.2019