机器视觉——OpenCV案例分析基础(一)(交互式绘图与交互式动态调节图片显示)

12 篇文章 3 订阅
12 篇文章 8 订阅

一、理论分析

我们这里主要应用opencv-python这个包,对各种图像进行处理。是一个计算机视觉和机器学习的开发库,里面也集成了大量的API。在图像处理方面应用也十分广泛。我们着重根据这个库,对各种图像进行处理。

二、代码分析

首先的首先,我们需要安装一个opencv这个包,这个操作也十分的简单。步骤如下:

  1. 按住键盘的WIN+R键,打开运行框
  2. 输入cmd,点击确定,打开一个小黑框
  3. 输入pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/(后面-i + 链接时用的清华源,下载速度更快)
  4. 如果问你yes/no 输入y即可。过一小会安装完毕。、
  5. 题外话:其实不光是opencv-python,python的很多包都可以这样安装,比如pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/等等。

安装以后我们打开pycharm,这个环境配置也相对简单,讲起来也比较啰嗦。这里不再赘述。如果有问题的小伙伴,可自行百度。大家注意每一步要细心,不要学AL,刚入门,就从安装这里放弃了,哈哈。

输入代码 impor cv2,运行。发现,没有报错。那么恭喜你,安装成功了。哈哈。接下来,小程序员附上一个一组图片,用于案例展示,附上链接,大家自行食用。链接:https://pan.baidu.com/s/1TVIOEPh4wkEIbVHANLX5_A
提取码:cjfe。

2.1 展示图片基础

有了安装包和图片,下面当然就是愉快的展示图片啦。冲冲冲!这里首先建议在pycharm里新建一个项目,项目中可以存放我们需要的代码,同时在代码的同一目录下放入我们的图片文件,这样写读写路径十分的方便。

from cv2 import cv2 as cv #这样写,写代码会有代码提示
import numpy as np 
img = cv.imread(r"CV-Pictures/015.jpg") 
#读取图片路径,读者也可以写绝对路径,顾名思义,就是找到这幅图片的路径,粘贴进去。以防外一的话可以在路径前加入r。
#img = cv.imread(r"CV-Pictures/015.jpg",0)
#读取单通道,读取一张灰度图 
cv.namedWindow("img",cv.WINDOW_NORMAL)
#使得窗口可以自由放大缩小
cv.imshow("img",img) 
#展示图片
cv.waitKey(0) 
#等待一个输入键盘的信号。一直展示图片。如果输入一个数字n的话,可以让它停留n毫秒。
cv.destroyAllWindows() 
#您可以调用destroyWindow()或destroyAllWindows()来关闭窗口并取消分配任何相关的内存使用。对于一个简单的程序,实际上不必调用这些函数,因为退出时操作系统会自动关闭应用程序的所有资源和窗口

运行结果如图,这也算是最简单的图像展示了。
在这里插入图片描述
我们可以把imread读入图片后返回的对象img返回,你会看到。是个三维矩阵。输入图像的类型type<class ‘numpy.ndarray’>,shape是(1035, 690, 3)
那么看到上面的imshow函数,你不仅不会想到plt的show函数。但这里其实是有不同的。

import matplotlib.pyplot as plt
img = plt.imread("CV-Pictures/015.jpg")
plt.imshow(img)
plt.show()

代码运行结果
在这里插入图片描述
我们尝试用两种库的同一个方法读取图片,代码如下

from cv2 import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img0 = plt.imread(r'CV-Pictures\003.jpg')
img1 = cv.imread(r'CV-Pictures\003.jpg')
pic = np.hstack([img0,img1])
plt.imshow(pic)
plt.xticks([]) #去掉x轴
plt.yticks([]) #去掉y轴
plt.show()

代码运行结果
在这里插入图片描述
这里我们看到图片的形状相容,但是颜色不同,其原因是因为plt读取文件按照的存储时RGB格式,即绿红蓝三通道。而opencv读取文件存储时BGR格式。这样显示出的图片导致了不同。

2.2 绘制图片基础

from cv2 import cv2 as cv
import numpy as np
img = np.zeros((500,500,3),dtype=np.uint8)
cv.line(img,(50,50),(300,350),(255,255,0),3)
# cv.circle(img,(250,250),90,(0,0,255),3) #空心圆
cv.circle(img,(250,250),90,(0,0,255),-1) #填充 圆
cv.rectangle(img,(10,400),(100,480),(255,0,0),3) #矩形
# cv.ellipse(img,(300,400),(150,80),0,0,360,(0,255,255),3)#椭圆
# cv.ellipse(img,(300,400),(150,80),50,0,360,(0,255,255),3) #顺时针旋转50
# cv.ellipse(img,(300,400),(150,80),-30,0,360,(0,255,255),3)#逆时针旋转30
# cv.ellipse(img,(300,400),(150,80),-30,60,300,(0,255,255),-1)#展示部分椭圆
cv.putText(img,'Deep Learning',[10,380],cv.FONT_ITALIC,1.5,(0,0,255)) #FONT_ITALIC代表字体
cv.imshow('pic',img)
cv.waitKey(0)
cv.destroyAllWindows()

代码运行结果:
在这里插入图片描述

2.3 交互式绘图基础

2.3.1 双击在窗口画圆

from cv2 import cv2 as cv
import numpy as np
def draw_circle(event,x,y,flags,param): #画圆的函数
    if event == cv.EVENT_LBUTTONDBLCLK: #输入事件等于双击鼠标左键
        cv.circle(img,(x,y),60,(0,0,255),-1) #以点击点为中心,画圆

img = np.zeros((500,500,3),dtype=np.uint8) #构建绘画的黑板
cv.namedWindow('image') #对窗口命名
cv.setMouseCallback('image',draw_circle) #导入鼠标案件函数
while(1):
    cv.imshow("image",img)
    if(cv.waitKey(1)&0xFF == ord('q')): #输入q键结束交互
        break
# cv.waitKey(0)
# cv.imshow("image",img)
cv.destroyAllWindows()

运行结果如图
在这里插入图片描述

2.3.2 在窗口绘图写字

from cv2 import cv2
import numpy as np
drawing=False
mode=True
ix,iy=-1,-1
def call_back_draw(event,x,y,flags,param):
    global drawing,mode,ix,iy
    if event==cv2.EVENT_LBUTTONDOWN:#鼠标左键按下,开始画图
        drawing=True
        ix,iy=x,y #读取按键坐标的绘图
    elif event==cv2.EVENT_MOUSEMOVE and flags==cv2.EVENT_FLAG_LBUTTON:
        if drawing==True:
            if mode==True: 
                cv2.rectangle(img,(ix,iy),(x,y),(0,255,0),-1) #画出正方形
            else:
                cv2.circle(img,(x,y),3,(0,0,255),-1) #写字,有一系列小点组成
    elif event==cv2.EVENT_LBUTTONUP:
        drawing=False

img=np.ones((600,600,3),np.uint8)*50
cv2.namedWindow('image')
cv2.setMouseCallback('image',call_back_draw)

while True:
    cv2.imshow('image',img)
    if cv2.waitKey(1)==ord('m'): #更换模式
        mode=not mode
    elif cv2.waitKey(1)==ord('q'): #退出绘画
        break
cv2.destroyAllWindows()

代码结果如图所示:
在这里插入图片描述

2.3.3 调节滑块改变图片亮度

from cv2 import cv2 as cv
import numpy as np
import sys
#cv.createTrackbar()
#cv.getTrackbarPos()

def call_back_brightness(param):
    global value,img,img1 #定义全局变量
    value = cv.getTrackbarPos('brightness','Brighter') #从滑块处获取值
    img1 = np.uint8(np.clip((value/100*img),10,255)) #将值限制在10到255之间

img = cv.imread(r"C:\Users\my magicbook\Desktop\CV-Pictures\006.jpg")
img1 = img.copy()
if img is None: #如果找不到图片
    print("Failed to read the lena.jpg")
    sys.exit() 
cv.namedWindow("Brighter",cv.WINDOW_NORMAL)
value = 80 #初始值
cv.createTrackbar("brightness","Brighter",value,255,call_back_brightness) #创建移动滑块,最大值为255

while True:
    cv.imshow("Brighter",img1)
    if cv.waitKey(2) == 27: #按Esc退出
        break
cv.destroyAllWindows()

运行结果如图所示:
在这里插入图片描述

2.3.4 调节滑块生成BGR颜色

import cv2
import numpy as np
img=np.zeros((150,400,3),np.uint8)  #画板大小
def doChange(param):
    b = cv2.getTrackbarPos('B','tracebar') #获取b滑块所示颜色
    g = cv2.getTrackbarPos('G', 'tracebar') #获取g滑块所示颜色
    r = cv2.getTrackbarPos('R', 'tracebar') #获取r滑块所示颜色
    img[:]=[b,g,r] #集成到img画板中
cv2.namedWindow('tracebar') #重命名窗口
cv2.createTrackbar('B','tracebar',0,255,doChange) #创建B滑块,初始化为0,最大值为255,通过改变doChange,改变滑块位置
cv2.createTrackbar('G','tracebar',0,255,doChange) #创建G滑块,初始化为0,最大值为255,通过改变doChange,改变滑块位置
cv2.createTrackbar('R','tracebar',0,255,doChange) #创建R滑块,初始化为0,最大值为255,通过改变doChange,改变滑块位置

while True:
    cv2.imshow('tracebar',img)
    if cv2.waitKey(1)==ord('q'):
        break
cv2.destroyAllWindows()

在这里插入图片描述

三、代码文件

小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。
链接:https://pan.baidu.com/s/1Ce14ZQYEYWJxhpNEP1ERhg?pwd=7mvf
提取码:7mvf

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值