系列内容:OpenCV概述与环境配置,OpenCV基础知识和绘制图形,图像的算数与位运算,图像视频的加载和显示,图像基本变换,滤波器,形态学,图像轮廓,图像直方图,车辆统计项目,特征检测和匹配,图像查找和拼接,虚拟计算器项目,信用卡识别项目,图像的分割与修复,人脸检测与车牌识别,目标追踪,答题卡识别判卷与文档ocr扫描识别,光流估计

(一)创建和显示窗口

1.基本操作

  • namedWindow()创建命名窗口
  • imshow()显示
  • destoryAllwindows()摧毁窗口
  • resizeWindow()改变窗口大小
  • waitKey()等待用户输入

2.示例代码

# 导入cv2包
import cv2
# 创建窗口

# CV2.WINDOW_AUTOSIZE不允许改变窗口大小
cv2.namedWindow('window', cv2.WINDOW_NORMAL)
# 更改窗口大小
cv2.resizeWindow('window', 800, 600)
# 展示名字为window的窗口
cv2.imshow('window', 0)  # 这里原代码展示时传入的第二个参数0可能存在问题,一般应传入图像数据,但按原样保留
# 等待按键
# 0表示接收任意按键,如果给其他的整数,则表示等待按键的时间
# 利用waitKey销毁窗口
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
    print('准备销毁窗口')
    cv2.destroyAllWindows()
# ord()是计算ascii码的函数
ord('q')

(二)读取图片

1.使用matplotlib的pyplot读图片

###读取 图片
import matplotlib.pyplot as plt

# 默认是彩色图片
login = cv2.imread('./login-bg.jpg')  # 这里存在潜在问题,前面未导入cv2库,若单独运行此代码块会报错,但按要求原样保留

# numpy的ndarray
login

结果显示为矩阵,如图4.1所示:

4.1-使用matplotlib的pyplot读图片

2.使用matplotlib的pyplot显示图片

# 发现matplotlib显示的图片和真实的图片颜色不一样,因为opencv读进来的图片数据不是默认的RGB,
# 而是BGR,直接cv2.imshow()展示
plt.imshow(login)

使用matplotlib的pyplot显示图片,如图4.2所示:

4.2-使用matplotlib的pyplot显示图片

3.读图函数的封装与调用

(1)函数封装与调用:

# 把展示图片的代码封装成函数,方便重用
def cv_show(name, img):
    cv2.imshow(name, img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()

函数调用:cv_show('image',image)

(2)工具封装与调用:

# 把展示图片的代码封装成函数,方便重用
def cv_show(name, img):
    import cv2
    cv2.imshow(name, img)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()

# 从外部py文件导入工具类,即可直接使用
from npm import cv_show
# 必须执行外部文件
%run npm.py
cv_show('login', login)

(三)保存图片

使用imwrite(path,img);保存图片

示例:

import cv2
# 创建窗口
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.resizeWindow('img', 640, 480)
# 读取图片
img = cv2.imread('./login-bg.jpg')

while True:
    cv2.imshow('img', img)
    key = cv2.waitKey(0)

    if key == ord('q'):
        break
    elif key == ord('s'):
        cv2.imwrite('./123.png', img)
    else:
        print(key)

cv2.destroyAllWindows()

(四)视频采集

1.基础知识

视频由帧组成,一帧为一张图片,一般是三十帧;

cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,比如0,1;

如果是视频文件,可以直接指定路径即可.

2.打开摄像头

# 打开摄像头
import cv2

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('video', 640, 480)  

cap = cv2.VideoCapture(0)

# 循环读取摄像头的每一帧
while True:
    # 读一帧数据,返回标记和这一帧数据,True表示读到了数据,False表示没有读到数据
    ret, frame = cap.read()

    # 可以根据ret做个判断
    if not ret:
        # 没读到数据,直接退出
        break
    # 显示读到的数据
    cv2.imshow('vidio', frame)  # 展示窗口名拼写与前面创建窗口名不一致,但按原样保留

    key = cv2.waitKey(10)
    if key == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

3.播放视频

# 打开摄像头
import cv2

cv2.namedWindow('video', cv2.WINDOW_NORMAL)
cv2.resizeWindow('vidio', 640, 480)
# 打开视频,输入视频的地址
cap = cv2.VideoCapture('./1.mp4')
# 循环读取摄像头的每一帧
while True:
    # 读一帧数据,返回标记和这一帧数据,True表示读到了数据,False表示没有读到数据
    ret, frame = cap.read()
    # 可以根据ret做个判断
    if not ret:
        # 没读到数据,直接退出
        break
    # 显示读到的数据
    cv2.imshow('vidio', frame)
    # 假如一个视频是30帧,那么每张图片之间的间隔是多少毫秒?
    key = cv2.waitKey(1000 // 30)
    if key == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

(五)录制视频

1.mp4视频

# 录制视频
import cv2
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,等同于'm','p','4','v'
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
# avi格式
# (640,480)表示摄像头拍视频,这个大小搞错了也不行,
# 注意分辨率
# 创建videowriter
vw = cv2.VideoWriter('output.mp4', fourcc, 30, (640, 480))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        printf('can not recive frame, Exiting...')  
        break
    # 写1每一帧数据
    vw.write(frame)
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) == ord('q'):
        break

# 释放
cap.release()
vw.release()
cv2.destroyAllWindows()

2.avi视频(大小是mp4的1/3)

# 录制视频
import cv2
cap = cv2.VideoCapture(0)
# *mp4v就是解包操作,等同于'm','p','4','v'
# fourcc=cv2.VideoWriter_fourcc(*'mp4v')
# avi格式
fourcc = cv2.VideoWriter_fourcc(*'XVID')
# (640,480)表示摄像头拍视频,这个大小搞错了也不行,
# 注意分辨率
# 创建videowriter
# vw=cv2.VideoWriter('output.mp4',fourcc,30,(640,480))
vw = cv2.VideoWriter('output.avi', fourcc, 30, (640, 480))
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        printf('can not recive frame,Exiting...')  
        break
# 写1每一帧数据
    vw.write(frame)
    cv2.imshow('frame', frame)

    if cv2.waitKey(1) == ord('q'):
        break

# 释放
cap.release()
vw.release()
cv2.destroyAllWindows()

(六)控制鼠标

1.基本操作

OpenCV允许我们对窗口上的鼠标动作做出响应;

setMouseCallback(winname,callback,userdata),winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数;

callback(event x,y,flags,userdata)回调函数必须包含这五个参数,event是事件(鼠标移动,左键,右键),x,y是点鼠标的坐标点,flags主要用于组合键,userdata来自于setMouseCallback的userdata

2.鼠标事件

 以下为事件定义

  1. EVENT_MOUSEMOVE 0 鼠标移动
  2. EVENT_LBUTTONDOWN 1 按下鼠标左键
  3. EVENT_RBUTTONDOWN 2 按下鼠标右键
  4. EVENT_MBUTTONDOWN 3 按下鼠标中键
  5. EVENT_LBUTTONUP 4 左键释放
  6. EVENT_RBUTTONUP 5 右键释放
  7. EVENT_MBUTTONUP 6 中键释放
  8. EVENT_LBUTTONDBLCLK 7 左键双击
  9. EVENT_RBUTTONDBLCLK 8 右键双击
  10. EVENT_MBUTTONDBLCLK 9 中键双击
  11. EVENT_MOUSEWHEEL 10 鼠标滚轮上下滚动
  12. EVENT_MOUSEHWHEEL 11 鼠标左右滚动

 以下为标志定义

flags:

  1. EVENT_FLAG_LBUTTON 1 按下左键
  2. EVENT_FLAG_RBUTTON 2 按下右键
  3. EVENT_FLAG_MBUTTON 4 按下中键
  4. EVENT_FLAG_CTRLKEY 8 按下ctrl键
  5. EVENT_FLAG_SHIFTKEY 16 按下shift键
  6. EVENT_FLAG_ALTKEY 32 按下alt键

3.示例

# 鼠标事件
import cv2
import numpy as np


def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)


cv2.namedWindow('mouse', cv2.WINDOW_NORMAL)
# 宽高
cv2.resizeWindow('mouse', 640, 360)
# 摄制鼠标回调函数
cv2.setMouseCallback('mouse', mouse_callback, '123')
# 显示窗口和背景
# 生成全黑的图片
img = np.zeros((360, 640, 3), np.uint8)
while True:
    cv2.imshow('mouse', img)
    key = cv2.waitKey(1)
    if key & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

(七)TrackBar控件

滑动条图片,如图4.3所示:

4.3- 滑动条图片

1.基本函数

createTrackbar(trackbarname,winname,value,count,onchange)创建TrackBar控件,value为trackbar的默认值,count为bar的最大值,最小值为0;

getTrackbarPos(trackbarname,winname)获取Trackbar的当前值

2.示例

##tracker
import cv2
import numpy as np

# 创建窗口
cv2.namedWindow('trackbar', cv2.WINDOW_NORMAL)
cv2.resizeWindow('trackbar', 640, 480)
# 定义回调函数
def callback(value):
    print(value)
# 创建trackbar
cv2.createTrackbar('R', 'trackbar', 0, 255, callback)
cv2.createTrackbar('G', 'trackbar', 0, 255, callback)
cv2.createTrackbar('B', 'trackbar', 0, 255, callback)

# 创建一个背景图片
img = np.zeros((480, 640, 3), np.uint8)

while True:
    # 获取当前trackbar的值
    r = cv2.getTrackbarPos('R', 'trackbar')
    g = cv2.getTrackbarPos('G', 'trackbar')
    b = cv2.getTrackbarPos('B', 'trackbar')

    # 改变背景颜色
    img[:] = [b, g, r]
    cv2.imshow('trackbar', img)

    key = cv2.waitKey(1)
    if key & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

滑动条示例,如图4.4所示:

4.4-滑动条示例
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐