首先尝试使用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()#关闭窗口
运行可以得到如下图窗口 按下鼠标左键并移动即可画图
注意:若移动过快则会画出许多点,所以请勿勾画过快
假如我们有多张图片需要快速切换该如何实现呢?
只要我们了解了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()
当图片比较多的时候,推荐大家使用循环读取图片并保存到im中
由此一来,便实现了滚轮快速切换图像的需求