opencv中图像的格式和imshow如何看很大很多小的图和自动适应namedWindow()__教程3

本文介绍了OpenCV中图像的格式,包括图像的尺寸、数据类型和BGR存储格式,并通过实例展示了如何读取和验证图像的BGR顺序。同时,详细阐述了`cv2.namedWindow()`函数的不同参数用法,如窗口大小的调整和窗口管理模式。

1、OpenCV中图像的格式

(1)opencv读取图像后可以获得图像的长,宽,高,格式为HWC格式

最简单的测试例子如下

#引入opencv模块
import cv2 as cv


#获取图片的相应信息
def imageformat(img):
    print('image type:   ' + str(type(img)))    #输出图像对象的类型
    print('image shape:  ' + str(img.shape))    #输出图像对象尺寸
    print('image size:   ' + str(img.size))     #输出图像对象大小    
    print('image dtype:  ' + str(img.dtype))    #输出图像对象数据类型   


#读取图片
img = cv.imread('E:\lena150W200H.jpg')
#判断是否读取成功
if img is None:
    print("Could not read the image,may be path error")
#显示图像
cv.imshow("Display window", img)
imageformat(img)
H,W,C = img.shape  #该方法可以获取图像的尺寸
print(H,W,C)
#让显示等待键盘输入维持在那里,否则程序跑完就闪退啦!
cv.waitKey(0)
#销毁窗口
cv.destroyAllWindows()

输出如下

(2)OPENCV中图片的存储格式是BGR格式,即每个像素对应的数据格式为(blue,green,red) 

为了验证该格式,我用做了3副4*4的小图

如果你们懒得做图,要下载的话,我把小图资源放到下面位置

https://download.youkuaiyun.com/download/chencaw/13112102

程序如下

#引入opencv模块
import cv2 as cv
#引入numpy模块
import numpy as np


#读取并输出图像像素值
def showimagepixel(path):
    print(path)
    #读取图片
    img = cv.imread(path)
    #判断是否读取成功
    if img is None:
        print("Could not read the image,may be path error")
        return
    #显示图像
    cv.imshow(path, img)
    #获取图像像素
    pixel_data=np.array(img)
    print(pixel_data)



showimagepixel('E:/chenopencvblogimg/red.bmp')
showimagepixel('E:/chenopencvblogimg/green.bmp')
showimagepixel('E:/chenopencvblogimg/blue.bmp')

#让显示等待键盘输入维持在那里,否则程序跑完就闪退啦!
cv.waitKey(0)
#销毁窗口
cv.destroyAllWindows()

输出如下,可以很明显的看到opencv的BGR格式

2、cv.namedWindow()的用法

基本的使用方法

cv2.namedWindow(‘窗口标题’,默认参数)

  

(1)窗口大小可以改变:

cv2.namedWindow("image",cv2.WINDOW_NORMAL)

或者cv2.namedWindow('image',cv2.WINDOW_GUI_NORMAL) 

(2)窗口大小自动调整为合适大小,然后你就不可以改变窗口了(看上面的英语):

cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)

(3)窗口大小自适应比例:

cv2.namedWindow("image",cv2.WINDOW_FREERATIO)

(4)窗口大小保持比例:

cv2.namedWindow("image",cv2.WINDOW_KEEPRATIO)

(5)如果你没有执行cv2.namedWindow()操作

 cv2.imshow(‘窗口标题’,image),如果前面没有cv2.namedWindow,就自动先执行一个cv2.namedWindow()

#引入opencv模块
import cv2 as cv

 
#读取图片
img = cv.imread('E:\lena150W200H.jpg')
#判断是否读取成功
if img is None:
    print("Could not read the image,may be path error")
#先创建窗口,这时候可以调整大小了    
cv.namedWindow("Display window",cv.WINDOW_NORMAL)
#显示图像
cv.imshow("Display window", img)
#让显示等待键盘输入维持在那里,否则程序跑完就闪退啦!
cv.waitKey(0)
#销毁窗口
cv.destroyAllWindows()

 

<think>我们正在解决的是:使用OpenCVimshow函数时如何让窗口自适应大小。 根据引用内容,我们可以总结出以下关键点: 1. 默认情况下,如果窗口是用cv2.WINDOW_AUTOSIZE创建的(这是默认行为),那么图像将以原始大小显示,但可能受限于屏幕分辨率(引用[3])。 2. 当图像很大时,原始大小可能超出屏幕,导致无法完全显示(引用[1][2])。 3. 我们可以通过创建窗口时设置标志为cv2.WINDOW_NORMAL(引用[1]提到FREERATIO,但实际标志是cv2.WINDOW_NORMAL)来允许调整窗口大小,然后使用cv2.resizeWindow来设置窗口大小,但这样需要手动设置。 4. 然而,用户希望的是“自适应大小”,即根据大小自动调整窗口大小,且不改变宽高比。 但是,OpenCVimshow函数本身并不提供自动缩放窗口到适应大小的功能。我们需要自己计算屏幕的分辨率,然后根据大小屏幕分辨率来调整窗口大小,使其在屏幕内完整显示,同时保持宽高比。 因此,我们可以采取以下步骤: 1. 读取片,获取片的宽度高度。 2. 获取屏幕的分辨率(宽度高度)。 3. 计算一个缩放比例,使得片在屏幕内完整显示(可能需要考虑屏幕的任务栏等,但通常我们可以用屏幕的宽度高度减去一些边距)。 4. 根据缩放比例调整窗口大小(保持宽高比)。 5. 使用cv2.namedWindow创建窗口,设置标志为cv2.WINDOW_NORMAL(这样我们可以调整窗口大小)。 6. 使用cv2.resizeWindow将窗口大小设置为我们计算出来的尺寸。 7. 使用cv2.imshow显示片。 注意:由于屏幕分辨率获取可能依赖于操作系统,OpenCV本身不提供获取屏幕分辨率的方法。我们可以使用其他方法,例如在Windows上可以使用win32api,在Linux上可以使用Xlib,但这样会使得代码依赖于操作系统。为了跨平台,我们可以假设一个默认的屏幕分辨率(比如1920x1080),或者使用Tkinter来获取屏幕分辨率(因为Tkinter是Python自带的,跨平台)。 这里我们选择使用Tkinter来获取屏幕尺寸(注意:如果用户没有安装Tkinter,可能需要安装,但通常Python标准安装包含Tkinter)。 步骤: 1. 导入Tkinter获取屏幕宽高。 2. 读取片,获取片宽高。 3. 计算缩放比例:取min(屏幕可用宽度/片宽度, 屏幕可用高度/片高度)作为缩放比例(为了保持宽高比,同时确保片完整显示在屏幕内)。 4. 按缩放比例计算新窗口的宽度高度。 5. 创建窗口(cv2.namedWindow)并设置窗口大小cv2.resizeWindow)。 但是,注意:我们可能不想让片总是按屏幕最大可用区域来显示,比如片很小时我们可能希望按原大小显示。因此,我们可以设置一个条件:当片尺寸大于屏幕可用尺寸时才进行缩放,否则按原大小显示。 另外,引用[5]中给出了创建窗口的示例,标志为0(即cv2.WINDOW_NORMAL)。 因此,我们编写一个函数来实现自适应窗口: 具体代码实现如下:</think>### OpenCV中使用`imshow`函数实现窗口自适应大小的方法 在OpenCV中实现窗口自适应大小需要结合`namedWindow()``resizeWindow()`函数,下面是详细步骤原理: #### 一、核心方法 ```python import cv2 # 1. 读取片 img = cv2.imread(&#39;large_image.jpg&#39;) # 2. 创建可调整大小的窗口 cv2.namedWindow(&#39;Adaptive Window&#39;, cv2.WINDOW_NORMAL) # 关键参数[^1][^3] # 3. 获取屏幕分辨率 screen_width = 1920 # 实际使用中需动态获取 screen_height = 1080 # 4. 自适应缩放片 img_height, img_width = img.shape[:2] scale = min(screen_width/img_width, screen_height/img_height) * 0.9 # 保留10%边距 # 5. 设置窗口尺寸 cv2.resizeWindow(&#39;Adaptive Window&#39;, int(img_width * scale), int(img_height * scale)) # 6. 显示cv2.imshow(&#39;Adaptive Window&#39;, img) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 二、关键参数解析 1. **`cv2.namedWindow()`的flags参数**: - `cv2.WINDOW_NORMAL`:窗口可手动调整大小(实现自适应的基础)[^1][^3] - `cv2.WINDOW_AUTOSIZE`:默认值,窗口固定为片原始尺寸(大会超出屏幕)[^3] - `cv2.WINDOW_FREERATIO`:允许自由调整宽高比(OpenCV 3.x+) 2. **`cv2.resizeWindow()`**: - 必须在`namedWindow()`之后调用 - 参数格式:`(窗口名称, 宽度, 高度)` - 单位:像素(整数) #### 三、跨平台屏幕分辨率获取 ```python # Windows/Linux/macOS通用方法 import tkinter as tk def get_screen_resolution(): root = tk.Tk() screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() root.destroy() return screen_width, screen_height # 使用示例 screen_w, screen_h = get_screen_resolution() ``` #### 四、保持宽高比的自适应算法 ```python def adaptive_resize(img, max_width=None, max_height=None): h, w = img.shape[:2] if not max_width: max_width = screen_w * 0.8 # 默认使用80%屏幕宽度 if not max_height: max_height = screen_h * 0.8 # 计算缩放比例 ratio = min(max_width/w, max_height/h) return cv2.resize(img, (int(w*ratio), int(h*ratio))) ``` #### 五、多显示的自适应方案 ```python # 创建自适应显示网格 def show_images_grid(images, titles=None, cols=2): rows = (len(images) + cols - 1) // cols # 计算单个窗口最大尺寸 max_w = screen_w // cols - 20 # 保留边距 max_h = screen_h // rows - 20 for i, img in enumerate(images): resized = adaptive_resize(img, max_w, max_h) cv2.namedWindow(f&#39;Win{i}&#39;, cv2.WINDOW_NORMAL) cv2.resizeWindow(f&#39;Win{i}&#39;, resized.shape[1], resized.shape[0]) cv2.imshow(f&#39;Win{i}&#39;, resized) cv2.waitKey(0) ``` #### 六、常见问题解决 1. **窗口位置控制**: ```python # 设置窗口初始位置 cv2.moveWindow(&#39;Win1&#39;, 100, 100) # (x, y)坐标 ``` 2. **高分辨率屏幕适配**: ```python # 检测系统缩放比例 (Windows) import ctypes scale_factor = ctypes.windll.shcore.GetScaleFactorForDevice(0)/100 ``` 3. **浮点图像显示优化**: ```python # 32位浮点图像归一化到[0,255] float_img = (float_img * 255).astype(&#39;uint8&#39;) # 避免全白显示[^3] ``` #### 七、性能优化建议 1. **大预处理**: ```python # 超过屏幕2倍的片先缩小 if img.shape[1] > 2*screen_w or img.shape[0] > 2*screen_h: img = cv2.resize(img, (screen_w//2, screen_h//2)) ``` 2. **视频流自适应**: ```python cap = cv2.VideoCapture(0) cv2.namedWindow(&#39;Video&#39;, cv2.WINDOW_NORMAL) while True: ret, frame = cap.read() # 实时计算自适应尺寸 h, w = frame.shape[:2] scale = min(screen_w/w, screen_h/h) * 0.8 cv2.resizeWindow(&#39;Video&#39;, int(w*scale), int(h*scale)) cv2.imshow(&#39;Video&#39;, frame) if cv2.waitKey(1) == 27: break ``` > **关键原理**:OpenCV的窗口管理系统独立于图像处理管线,通过`WINDOW_NORMAL`标志解除窗口大小限制,再结合屏幕尺寸计算实现自适应[^1][^3][^4]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值