OpenCV 中的 Gui 特性

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_877667836/article/details/82929955

图片读写

  • 读入图像
    使用函数 cv2.imread() 读入图像。
    这幅图像应该在此程序的工作路径,或者给函数提供完整路径,第二个参数是要告诉函数应该如何读取这幅图片。
    cv2.IMREAD_COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
    cv2.IMREAD_GRAYSCALE:以灰度模式读入图像
    cv2.IMREAD_UNCHANGED:读入一幅图像,并且包括图像的 alpha 通道
  • 显示图像
    使用函数 cv2.imshow() 显示图像。
    窗口会自动调整为图像大小。第一个参数是窗口的名字,其次才是我们的图像。
    你可以创建多个窗口,但是必须给他们不同的名字。
    cv2.waitKey() 是一个键盘绑定函数。需要指出的是它的时间尺度是毫
    秒级。函数等待特定的几毫秒,看是否有键盘输入。特定的几毫秒之内,如果
    按下任意键,这个函数会返回按键的 ASCII 码值,程序将会继续运行。如果没
    有键盘输入,返回值为 -1,如果我们设置这个函数的参数为 0,那它将会无限
    期的等待键盘输入。
    cv2.destroyAllWindows() 可以轻易删除任何我们建立的窗口。如果
    你想删除特定的窗口可以使用 cv2.destroyWindow(),在括号内输入你想删
    除的窗口名。
  • 保存图像
    使用函数 cv2.imwrite() 来保存一个图像。首先需要一个文件名,之后才
    是你要保存的图像。
# opencv3 模块导入
import cv2

# 以灰度模式读入图像
img = cv2.imread(r'F:/Pictures/tiger.jpg',cv2.IMREAD_GRAYSCALE)
print('type of img:', type(img))
print('shape of image: ', img.shape)

# 显示图片
cv2.imshow('tiger', img)

# 保存图片('s'键保存退出)
k = cv2.waitKey(0)
if k == ord('s'):     
    cv2.imwrite(r'F:/Pictures/tiger_gray.png', img)
cv2.destroyAllWindows()
type of img: <class 'numpy.ndarray'>
shape of image:  (476, 593)
  • 使用matplotlib显示opencv打开的图片
    opencv对多个图片输出在同一个窗口并没有直接的支持手段,但有时候我们会有这个需求,
    这时可以用matplotlib搭配使用。而且matplotlib可以在notebook上直接显示无需弹窗。
    彩色图像使用 OpenCV 加载时是 BGR 模式。但是 Matplotlib 是 RGB模式。
    所以彩色图像如果已经被 OpenCV 读取,那它将不会被 Matplotlib 正确显示。
    使用matplotlib显示opencv打开的图片之前,需要用
    img =img[:, :, ::-1]
    或img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)转化一下。
import matplotlib.pyplot as plt
import cv2

imgs = ['tiger.jpg', 'tiger_gray.png']
plt.figure(dpi=100)
for i, m in enumerate(imgs):
    img = cv2.imread(r'F:/Pictures/'+ m)[:,:,::-1]
    plt.subplot(1, 2, i+1)
    plt.imshow(img)
    plt.xticks([])
    plt.yticks([])
plt.show()

在这里插入图片描述

视频读写

  • cv2.VideoCapture() 打开一个视频文件或设备
  • cap.read() 读取一帧
  • cv2.VideoWriter_fourcc(*‘XVID’) 设置编码格式
  • cv2.VideoWriter() 确定一个输出文件的名字。接下来指定 FourCC 编码。播放频率和帧的大小也都需要确定。最后一个是 isColor 标签。如果是 True,每一帧就是彩色图,否则就是灰度图
  • cap.isOpened() 检查是否成功初始化。如果返回值是True,那就没有问题。否则就要使用函数 cap.open()
  • cap.get(propId) 获得视频的一些参数信息,propId 可以是 0 到 18 之间的任何整数。
    cap.set(propId,value) 来修改其中的一些值
    cap.get(3) 和 cap.get(4) 来查看每一帧的宽和高。默认情况下得到的值是 640X480。但是我可以使用ret=cap.set(3,320)和 ret=cap.set(4,240) 来把宽和高改成 320X240
import cv2

# 打开视频文件 media.mp4
cap = cv2.VideoCapture('media.mp4')

while(True):
    # ret读取成功标志, frame一帧图片数据
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) == ord('q'):
        break

# 释放视频设备或文件
cap.release()
cv2.destroyAllWindows()
import cv2

# 打开摄像头
cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        out.write(frame)
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) == ord('q'):
            break
    else:
        break

# Release everything if job is finished
out.release()
cap.release()
cv2.destroyAllWindows()

绘图

绘图函数:

  • cv2.line()
  • cv2.circle()
  • cv2.rectangle()
  • cv2.ellipse()
  • cv2.putText()

上面所有的这些绘图函数需要设置下面这些参数:

  • img:你想要绘制图形的那幅图像。
  • color:形状的颜色。以 RGB 为例,需要传入一个元组,例如:(255,0,0)代表蓝色。对于灰度图只需要传入灰度值。
  • thickness:线条的粗细。如果给一个闭合图形设置为 -1,那么这个图形就会被填充。默认值是 1.
  • linetype:线条的类型, 8 连接,抗锯齿等。默认情况是 8 连接。 cv2.LINE_AA为抗锯齿,这样看起来会非常平滑。
import cv2
import matplotlib.pyplot as plt
import numpy as np

img = np.zeros((500, 500, 3), np.uint8)
cv2.line(img, (0, 0), (300,300), (255,0,0), 5)
cv2.circle(img, (100,150), 60, (0,255,0), -1)
cv2.rectangle(img, (150,0), (300,150), (0,0,255), 3)

plt.figure(dpi=150)
plt.xticks([])
plt.yticks([])
plt.imshow(img)
plt.show()

在这里插入图片描述

鼠标事件

  • cv2.setMouseCallback() 鼠标事件回调函数
#查看所有的鼠标事件
import cv2
for i in dir(cv2):
    if 'EVENT'in i:
        print(i)
EVENT_FLAG_ALTKEY
EVENT_FLAG_CTRLKEY
EVENT_FLAG_LBUTTON
EVENT_FLAG_MBUTTON
EVENT_FLAG_RBUTTON
EVENT_FLAG_SHIFTKEY
EVENT_LBUTTONDBLCLK
EVENT_LBUTTONDOWN
EVENT_LBUTTONUP
EVENT_MBUTTONDBLCLK
EVENT_MBUTTONDOWN
EVENT_MBUTTONUP
EVENT_MOUSEHWHEEL
EVENT_MOUSEMOVE
EVENT_MOUSEWHEEL
EVENT_RBUTTONDBLCLK
EVENT_RBUTTONDOWN
EVENT_RBUTTONUP
# demo-1 鼠标左键双击画圆
import cv2
import numpy as np

#mouse callback function
def draw_circle(event,x,y,flags,param):
    if event==cv2.EVENT_LBUTTONDBLCLK:
        cv2.circle(img,(x,y),100,(255,0,0),-1)

# 创建图像与窗口并将窗口与回调函数绑定
img=np.zeros((512,512,3),np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_circle)

while(1):
    cv2.imshow('image',img)
    if cv2.waitKey(20)== ord('q'):
        break
cv2.destroyAllWindows()
# demo-2 鼠标按下抬起画矩形
import cv2

sx, sy = 0, 0
# 鼠标事件回调
def draw_rectangle(event, x, y, flags, param):
    global sx, sy
    if event == cv2.EVENT_LBUTTONDOWN:
        sx, sy = x, y  
    elif event == cv2.EVENT_LBUTTONUP:
        cv2.rectangle(img, (sx,sy), (x,y), (255,0,255), 3)

# 创建图像与窗口并将窗口与回调函数绑定
img  = cv2.imread('F:/Pictures/tiger.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image',draw_rectangle)

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

猜你喜欢

转载自blog.csdn.net/qq_877667836/article/details/82929955
今日推荐