• python opencv2滚轮快速切换图片


    首先尝试使用opencv2显示一张图像 并实现圈画功能

    import numpy as np
    import cv2 as cv
    from matplotlib import pylab as plt
    
    def drawing(event, x, y, flags, param):
        global img #声明img为全局变量以在drawing函数内部使用img
        if event == 0 and flags == 1: #发现鼠标移动且左键按下
            print(x,y,"\n") #x y为此时鼠标坐标
            cv.circle(img, (x, y), 1, (71,0, 255), -1) #img图像为底 在(x,y)处画一个大小为1的点,其颜色为(71,0,255)(RGB)
            cv.imshow('img1', img) #显示新的img图像与窗口
           
            
    
    img = cv.imread(r'C:\Users\Miao\Desktop\T1jpg\IMG-0003-00001.jpg')#读取jpg文件
    cv.namedWindow("img1")#命名窗口为img1
    cv.moveWindow('img1',100,100)#将名为img1的窗口移动到屏幕100,100的位置
    cv.setMouseCallback('img1', drawing)#将名为img1的窗口与IO操作函数drawing关联
    cv.imshow('img1', img)#显示名为img1的窗口,窗口内图片为刚读取的JPG图像:img
    cv.waitKey(0)#等待操作
    cv.destroyAllWindows()#关闭窗口
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    运行可以得到如下图窗口 按下鼠标左键并移动即可画图
    注意:若移动过快则会画出许多点,所以请勿勾画过快
    在这里插入图片描述

    假如我们有多张图片需要快速切换该如何实现呢?
    只要我们了解了opencv2窗口、IO函数以及图片内容的机制,思路就很清晰了。
    在这里插入图片描述
    nameWindow会为窗口命名,名字就是参数imgs
    moveWindow为移动名字为imgs的窗口的位置
    setMouseCallback可以给名字为imgs的窗口添加IO函数drawing
    imshow给名字为imgs的窗口显示im[now]图片

    采用变量imgs、im[now]可以实现快速改变窗口名与图片,代码如下

    以五张图片为例

    import numpy as np
    import cv2 as cv
    from matplotlib import pylab as plt
    
    now=0 #从第一张图片开始 意为当前为第几张图片
    im=[] #用来存储所有图片
    imgs='image'+str(now) #当前窗口名 根据now进行修改以实现窗口切换
    
    
    def drawing(event, x, y, flags, param):
    
        global imgs
        global now
        global im
        
        if event == 0 and flags == 1: #检测到鼠标移动且左键按下
            print(x,y,"\n")
            cv.circle(im[now], (x, y), 1, (71,0, 255), -1)
            cv.imshow(imgs, im[now])
        elif event==10: #检测到滚轮滑动
            cv.destroyAllWindows() #先关闭当前窗口
            if(flags<0): #如果是下滑
                now+=1 #图片切换到下一张
                if(now>(num-1)):now=0 #若超过最大图片数则置为第一张循环开始
                imgs='image'+str(now) #窗口名也随之进行修改
                cv.namedWindow(imgs) #建立新的窗口
                cv.moveWindow(imgs,100,100) #移动新的窗口
                cv.setMouseCallback(imgs, drawing) #为新的窗口关联IO函数
                cv.imshow(imgs, im[now]) #显示新的窗口 
            else: #如果是上滑
                now-=1 #切换到上一张
                if(now<0):now=num-1 #若当前为第一张 则切换为最后一张进行循环
                imgs='image'+str(now) #以下同上
                cv.namedWindow(imgs)
                cv.moveWindow(imgs,100,100)
                cv.setMouseCallback(imgs, drawing)  
                cv.imshow(imgs, im[now])
           
            
    num = 5 #共五张图片
    #依次读取五张图片
    img = cv.imread(r'C:\Users\Miao\Desktop\T1jpg\IMG-0003-00001.jpg')
    img2 = cv.imread(r'C:\Users\Miao\Desktop\T1jpg\IMG-0003-00002.jpg')
    img3 = cv.imread(r'C:\Users\Miao\Desktop\T1jpg\IMG-0003-00003.jpg')
    img4 = cv.imread(r'C:\Users\Miao\Desktop\T1jpg\IMG-0003-00004.jpg')
    img5 = cv.imread(r'C:\Users\Miao\Desktop\T1jpg\IMG-0003-00005.jpg')
    #将图片数据保存在im列表中
    im.append(img)
    im.append(img2)
    im.append(img3)
    im.append(img4)
    im.append(img5)
    
    #↓↓↓↓↓↓↓↓↓先建立第一张图片的窗口↓↓↓↓↓↓↓↓↓
    cv.namedWindow(imgs) 
    cv.moveWindow(imgs,100,100)
    cv.setMouseCallback(imgs, drawing)
    cv.imshow(imgs, im[now])
        
    cv.waitKey(0)
    cv.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    当图片比较多的时候,推荐大家使用循环读取图片并保存到im中

    由此一来,便实现了滚轮快速切换图像的需求

  • 相关阅读:
    利器 | TestNG 与 Junit 对比,测试框架如何选择?
    C++笔记
    du命令:显示文件或者目录的大小
    PADS自己画的封装,导入PCB没有元件标签?
    python-(4-5)数据类型的应用(字符集、编码和运算符)
    Vuex的简介以及入门案例
    Java毕设项目飞机订票管理系统计算机(附源码+系统+数据库+LW)
    高频经典算法题汇总
    全网最详细SpringBoot、SpringCloud整合阿里云OSS对象存储服务
    JavaWeb 综合案例(包含注册与登录页面,包含对数据库的增删改查页面)新增加session与cookie与验证码
  • 原文地址:https://blog.csdn.net/ChloeMax_/article/details/127817200