OpenCV图像显示imshow()函数——详解
OpenCV图像显示imshow()函数——详解
OpenCV图像显示imshow()函数——详解
imshow()函数在指定窗口中显示图像。
cv.imshow(winname, mat) -> None
参数:
- winname:窗口的名称。
- mat:要显示的图像。
imshow()显示图片时发生图片显示不全的解决方法
imshow函数在指定窗口中显示图像。如果窗口是使用cv::window_AUTOSIZE标志创建的,则图像将以其原始大小显示,但仍受屏幕分辨率的限制。否则,将缩放图像以适应窗口。该函数可以根据图像的深度缩放图像:
一般情况下,OpenCV cv2.imshow会自动调整显示窗口的大小,将图片按其原始大小显示出来。但当图片超过屏幕分辨率时,例如当调用显示的图片的尺寸过大时,会发生图片部分显示问题。
解决办法(1):
在使用cv2.imshow()之前调用cv2.namedWindow("", cv2.WINDOW_NORMAL)
效果图:
相关代码:
import cv2 as cv
import sys
img = cv.imread("images/jpg1_dd.png")
if img is None:
sys.exit("不能读取图片.")
cv.namedWindow("逆境清醒opencv教程系列,原图", cv.WINDOW_NORMAL)
cv.imshow("逆境清醒opencv教程系列,原图", img)
key = cv.waitKey(0)
我们还可以再选择使用缩放图像,来使图像按特定大小显示:
效果图:
相关代码:

#图片显示不全解决办法
import cv2 as cv
import sys
img = cv.imread("images/jpg1_dd.png")
if img is None:
sys.exit("不能读取图片.")
cv.namedWindow("逆境清醒opencv教程系列,原图", cv.WINDOW_NORMAL)
cv.resizeWindow("逆境清醒opencv教程系列,原图", 800, 600)
cv.imshow("逆境清醒opencv教程系列,原图", img)
key = cv.waitKey(0)
另外一种方法,
解决办法(2):
效果图:
相关代码:

import cv2 as cv
import sys
import pyautogui
img = cv.imread("images/jpg1_dd.png")
if img is None:
sys.exit("不能读取图片.")
screen_width, screen_height = pyautogui.size()
scale = screen_height / img.shape[0]-0.2
img = cv.resize(img, None, fx=scale, fy=scale)
cv.imshow("逆境清醒opencv教程系列", img )
key = cv.waitKey(0)
总结:
opencv在使用cv2.imshow()显示图片时,是在指定窗口中显示图片,若在调用cv2.imshow()函数之前,没有调用创建窗口的函数,则默认使用cv2.WINDOW_AUTOSIZE标记创建默认窗口,如果需要显示大于屏幕分辨率的图像,则需要在使用cv2.imshow()之前调用cv2.namedWindow("", cv2.WINDOW_NORMAL)
- 如果窗口是使用OpenGL支持创建的,cv::imshow还支持ogl::Buffer、ogl:∶Texture2D和cuda::GpuMat作为输入。
- 如果此函数之前没有创建窗口,则假定创建了一个cv::window_AUTOSIZE的窗口。
- 如果需要显示大于屏幕分辨率的图像,则需要在imshow之前调用namedWindow(“”,WINDOW_NORMAL)。
imshow()图像显示模式
如果图像是8位
如果图像是8位无符号的,则按原样显示。
示例效果图如下:
相关代码:
import cv2 as cv
import sys
img = cv.imread("images/jpg1_8bit.png")
if img is None:
sys.exit("不能读取图片.")
cv.imshow("逆境清醒opencv教程系列,8bit图", img)
key = cv.waitKey(0)
如果图像是16位
如果图像是16位无符号的,则像素除以256。也就是说,值范围[0,255*256]被映射到[0,255]。
示例效果图如下:
相关代码:
import cv2 as cv
import sys
img = cv.imread("images/jpg1_16bit.png")
if img is None:
sys.exit("不能读取图片.")
cv.imshow("逆境清醒opencv教程系列,16bit图", img)
key = cv.waitKey(0)
如果图像是32位或64位
如果图像是32位或64位浮点,则像素值将乘以255。也就是说,值范围[0,1]被映射到[0,255]。
示例效果图如下:
相关代码:
import cv2 as cv
import sys
img = cv.imread("images/jpg1_32bit.png")
if img is None:
sys.exit("不能读取图片.")
cv.imshow("逆境清醒opencv教程系列,32bit图", img)
key = cv.waitKey(0)
总结:
如果图像是8位符号的,则像素偏移128。也就是说,值范围[-128,127]被映射到[0,255]。
如果图像是16位签名的,则像素被除以256并被偏置128。也就是说,值范围[-3276832767]被映射到[0,255]。
由于所需转换的模糊性,不再处理32位整数图像。使用特定于图像上下文的自定义预处理转换为8位无符号矩阵。
注:
imshow()函数之后应调用cv::waitKey或cv::pollKey,以执行GUI内务管理任务,
这些任务对于实际显示给定图像并使窗口响应鼠标和键盘事件是必要的。否则,它将不会显示图像,窗口可能会锁定。
例如,
waitKey(0)将无限显示窗口,直到任何按键(它适用于图像显示)。
waitKey(25)将显示一帧,并等待大约25毫秒的按键时间(适用于逐帧显示视频)。
要删除窗口,请使用cv::destroyWindow。
[仅限Windows后端]按Ctrl+C将图像复制到剪贴板。按Ctrl+S将显示一个保存图像的对话框。