首先尝试使用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()#关闭窗口

运行可以得到如下图窗口 按下鼠标左键并移动即可画图

注意:若移动过快则会画出许多点,所以请勿勾画过快

python爬虫知乎鼠标滚轮下滑 python模拟鼠标滚轮_Desktop

假如我们有多张图片需要快速切换该如何实现呢?

只要我们了解了opencv2窗口、IO函数以及图片内容的机制,思路就很清晰了。

python爬虫知乎鼠标滚轮下滑 python模拟鼠标滚轮_opencv_02


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()

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

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