Opencv速成笔记--GUI功能

一. 图像入门

1.1前言:

:如何读取图像和如何显示图像
:如何将其保存起来
:学习的函数 : cv.imread() , cv.imshow() , cv.imwrite()

1.2.1

如何读取图像和如何显示图像
cv.imread() 函数有2个参数,其一为地址,其二为flag:

  1. flag=-1时:加载图像,包括 alpha 通道

  2. flag = 0 时:以灰度模式加载图像

  3. flag = 1时 :加载彩色图像,任何图像的透明度都会被忽略,并且它是默认参数。

例如:

 import numpy as np
 import cv2 as cv
 ad = r'C:\Users\17001\Desktop\desktop\001.jpg' #图片地址
 img  = cv.imread(ad , 0)

另外,如果路径中包含中文 或者 路径的斜杠与反斜杠:
会出现下图的报错:

[ WARN:0@0.126] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\loadsave.cpp (239) cv::findDecoder imread_('C:\Users\17001\Desktop\桌面\001.jpg'): can't open/read file: check file path/integrity

cv.imshow() 函数 展示图像,2个参数如下:

  1. 所展示窗口的名字
  2. 要展示的图像
    代码如下:
cv.imshow('dai_tu',  img)
cv.waitKey(0) #cv.waitKey() 是一个键盘绑定函数,它的参数是以毫秒为单位的时间。该函数为任意键盘事件等待指定毫秒。如果你在这段时间内按下任意键,程序将继续。如果传的是 0,它会一直等待键盘按下。它也可以设置检测特定的击键,例如,按下键 a 等,我们将在下面讨论。
cv.destroyWindow()# 销毁窗口 ,其中参数是要销毁的窗口名;cv.destroyAllWindows()销毁所有窗口

效果:Opencv速成笔记--GUI功能_第1张图片

1.2.2

cv.imwrite() 保存图像,2个参数如下

  1. 文件名字 ,这里即ad

  2. 要保存的图像

代码如下:

cv.imwrite(ad,img) 

二. 视频入门

2.1 前言:

:如何加载视频显示视频保存视频
:学习用相机捕捉并显示
:相关函数:cv.VideoCapture(),cv.VideoWriter()

2.2.1从相机捕捉视频

  1. 在捕获一个视频之前,要先创建一个VideoCapture对象,它的参数可以为 一个视频文件的地址或者 摄像设备的索引。
  2. 逐帧捕获
  3. 释放Capture对象

代码如下:

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0,cv.CAP_DSHOW)
while(True):
    # 一帧一帧捕捉  frame:帧
    ret, frame = cap.read() #cap.read()会返回一个bool值,加载成功返回1,所以通过这个返回值判断视频是否结束。
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 对帧的操作
    cv.imshow('frame',gray) # 显示返回的每帧
    if cv.waitKey(0):
        break
# 释放 VideoCapture 对象
cap.release()
cv.destroyAllWindows()

另外,还可通过修改VideoCapture的参数为-1,来选择第二个摄像机。

2.2.2 播放视频文件

和从相机捕获一样,只需要用视频文件名更改相机索引。同时显示 frame,为 cv.waitKey() 使用合适的时间。如果它太小,视频将非常快,如果太大,视频将很慢 (嗯,这就是如何显示慢动作)。正常情况下,30 毫秒就可以了。
这里只演示要修改的代码:

ad = r'XXXXXX.xxx'
cap = cv.VideoCapture(ad)

2.2.3视频的保存

  • 创建一个 VideoWriter 对象
  • 指定输出文件(保存文件)的名字 和 FourCC 码(下面说)
  • 应该传递每秒帧数和帧大小
  • isColor
    先放代码:
import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0) #声明VideoCapture对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定 Fourcc
out = cv.VideoWriter('output.avi',fourcc, 20.0, (640,480))
while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv.flip(frame,0)
        # 写入已经翻转好的帧
        out.write(frame)
        cv.imshow('frame',frame)
        if cv.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

说明

  • FourCC 是用于指定视频解码器的 4 字节代码。这里 fourcc.org 是可用编码的列表。

  • FourCC 的设定一般有DIVX, XVID, MJPG, X264, WMV1,
    WMV2,这里选择XVID较为合适,其它的可以自己去了解。

  • FourCC的的参数:

三.绘图功能

3.1前言:

  1. 用 OpenCV 画不同的几何图形
  2. 相关函数cv.line(), cv.circle() , cv.rectangle(), cv.ellipse(),
    cv.putText()等
  3. 相关参数:img: 想画的图片;color:颜色;thinkness:线或者圆的厚度(默认为1)
  4. lineType : 线条类型(根据自己的爱好使用)

3.2code:

import numpy as np
import cv2 as cv

img = np.zeros((512, 512, 3), np.uint8) #黑色背景, img亦是画板,同一img下,所画的东西在同一个画板上
img2 = np.zeros((512, 512, 3), np.uint8)
out =[]
out.append(cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)) #线
out.append(cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3))#长方形
out.append(cv.circle(img2,(447, 64), 63, (0, 0, 255), -1))#圆
out.append(cv.ellipse(img2, (256, 256), (100, 50), 0, 0, 360, 255, -1))#椭圆

pts = np.array([[10, 5],[20, 30],[70, 20],[50, 10]],np.int32)#多边形
pts = pts.reshape((-1, 1, 2))
outt = cv.polylines(img2, [pts], True, (0, 255, 255))
out.append(outt)


cv.imshow('1',out[4])
cv.waitKey(0)
cv.destroyAllWindows()

//3.3图像添加文字 cv.putText()

例如:

四.鼠标作为画笔

4.1前言:

  1. Opencv 处理鼠标相关事件
  2. 相关函数:cv.setMouseCallback()

4.2 simple eg:

这里,我们创建一个简单的程序,在图像的任何位置双击在上面画一个圆。
首先我们创建一个鼠标回调函数,该函数在鼠标事件发生时执行。鼠标事件可以是与鼠标有关的任何内容,比如鼠标左键按下,左键弹起,左键双击等等。所有鼠标事件都给我们提供坐标 (x,y)。通过这个事件和位置,我们能做任何我们喜欢的事情。要列出所有可用事件,在 Python 终端执行以下代码:

import numpy as np
import cv2 as cv

img = np.zeros((512, 512, 3), np.uint8)
def drawsth(event, x, y, flag , paramm):
    if event ==cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img ,(x,y ), 100, (255, 0 , 0), -1)

cv.namedWindow('image')
cv.setMouseCallback('image', drawsth)
while 1:
    cv.imshow('imagin', img)
    if cv.waitKey(20) & 0xFF ==27:
        break

cv.destroyAllWindows()

创建鼠标回调函数是有特定的格式,在任何地方都一样。它仅仅是函数的功能不同。因此我们的鼠标回调函数是做一件事,就是我们双击的地方画圆。所以看下面的代码。代码注释能让你明白。
另外,下面的语句可以查看鼠标的相关事件:

events = [i for i in dir(cv) if 'EVENT' in i]
print( events )

4.3 complex eg:

这次,可以通过拖动鼠标绘制矩形或者圆 (取决于选的模式),就像在 Paint 程序中一样。因此我们的鼠标回调函数有两个,一个画矩形一个画圆形。这个具体的例子将有助于我们创建和理解交互式程序,像对象跟踪,图像分割等等。
代码如下:

import numpy as np
import cv2 as cv

img = np.zeros((511, 511, 3), np.uint8)
drawing = False
mode = True
tx =-1
ty =-1
def drawsth(event , x, y, flag, param):
    global tx, ty ,drawing,mode
    if event ==cv.EVENT_LBUTTONDOWN:
        drawing = True
        tx = x
        ty = y
    elif event ==cv.EVENT_MOUSEMOVE:
        if drawing ==True:
            if mode:
                cv.rectangle(img,(tx,ty), (x, y ),(0, 255, 0),-1)
            else:
                cv.circle(img, (x,y),  5 ,(0,255, 255),-1)

    elif event ==cv.EVENT_LBUTTONUP:
        drawing = False
        if mode:
            cv.rectangle(img,(tx,ty), (x, y ),(0, 255, 0),-1)
        else:
            cv.circle(img, (x, y), 5, (0, 255, 255), -1)

cv.namedWindow('image')
cv.setMouseCallback('image',drawsth)
while 1:
    cv.imshow('image', img)
    t = cv.waitKey(1) & 0xFF
    if t == ord('m'):
        mode = not mode
    elif t == ord('q'):
        break

cv.destroyAllWindows()

mood:独善其身Opencv速成笔记--GUI功能_第2张图片

你可能感兴趣的:(视觉研究,opencv,计算机视觉,python)