• OpenCV(一)之图片&视频的加载和显示


    OpenCV(open source version)

    注意OpenCV的颜色通道是BGR和正常RGB相反
    开发环境为Jupyter

    1.机器视觉的应用

    物体识别:人脸、车辆
    识别图像中的文字(OCR)
    图像拼接、修复背景更替

    2.OpenCV介绍

    • 跨平台
    • Gray Bradsky于1999年开发,2000年开发
    • C++、Python、Java、JS
    • 最早使用C写的,C++重构的,C++可以直接使用(fastest),但实现了Java、Python等接口
    • 底层C/C++,Python开发简单

    学习目标:

    • OpenCV运行机制
    • 可以使用OpenCV处理一些图像常见问题
    • 学会物体识别,文字识别等问题的处理思路 - 人工智能简单应用

    3.OpenCV安装

    # 豆瓣源安装虚拟环境的包
    pip install virtualenv -i https://pypi.doubanio.com/simple/
    # 安装虚拟环境  语法:virtualenv 虚拟环境名
    virtualenv venv
    # 进入venv的Scripts目录的cmd,激活虚拟环境
    activate
    # 老版本算法无版权争议 
    # 多个包一起安装:pip install 包名 包名 -i 镜像源  
    # contrib 是opencv的拓展包
    pip install opencv-python==3.4.0.14 opencv-contrib-python==3.4.0.14 jupyter matplotlib -i https://pypi.doubanio.com/simple/
    

    查看pip版本

    python -m pip --version   # 查看python版本
    python -m pip install --upgrade pip #pip版本太老了,使用此命令更新
    

    安装opencv

    pip install opencv-python numpy matplotlib -i https://pypi.douban.com/simple
    

    4.OpenCV使用

    4.1基本函数
    • namedWindow() 创键命名窗口
    • imshow()显示窗口
    • destroyAllwindows() 摧毁窗口
    • resizeWindows() 改变窗口大小
    • waitKey() 等待用户输入
    4.2创建窗口
    # opencv的包名叫cv2
    import cv2
    # 创键窗口 shift+tab 查看函数
    cv2.namedWindow('window1',cv2.WINDOW_NORMAL)
    # 更改指定窗口的大小
    cv2.resizeWindow('window1',800,600)
    # 展示名字为window1的窗口,0是图片对象
    cv2.imshow('window1',0)
    # 等待按键
    # waitKey会返回按键的ascii码值
    # 0  表示接受任意按键,如果给其他的整数,表示按键的时间(ms),时间过了,返回-1
    #  可以利用waitKey来销毁窗口,不用每次重启python
    key = cv2.waitKey(0)
    # 销毁窗口
    if key & 0xFF == ord('q'):
        # & 0xFF写不写都行
        cv2.destroyAllWindows() 
        # python中计算ascii的函数
    ord('q')
    
    4.3 加载显示图片
    • imread(path,flag):使用imread可以读取土拍你,默认读取的是彩色图片
    # m进入makedown模式,alt+enter/ctrl+enter,执行makerdown语法
    import cv2
    import matplotlib.pyplot as plt
    # 从指定文件读取图片,路径不能包含中文,返回图片对象(matrix)
    cat = cv2.imread('G:\\a.jpg')
    # 显示图片对象,会发现读取图片颜色不同,因为opencv都进来的图片的数据通道是BGR(蓝绿红),不是RGB
    # 所以opencv读取的图片要使用opencv自己的方法显示图片
    cv2.imshow('a',cat)
    #  可以利用waitKey来销毁窗口,不用每次重启python
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        # & 0xFF写不写都行
        cv2.destroyAllWindows()
    
    4.3.1封装一个显示图片的函数 -- 方便重用
    %run utils.py #jupyter中执行外部文件
    
    # utils.py
    # name : 窗口名
    # img : 图片对象
    import cv2
    def cv_show(name,img):
    	cv2.imshow(name,img)
    	key = cv2.waitKey(0)
    	if key & 0xFF == ord('q'):
    		cv2.destroyAllWindows()
    
    4.4 保存图片
    • imwrite(path,img):使用imwrite保存图片到path路径下
    import cv2
    # 命名窗口为img
    cv2.namedWindow('img',cv2.WINDOW_NORMAL)
    # 设置窗口img大小
    cv2.resizeWindow('img',800,600)
    
    # 读一个图片
    img = cv2.imread("G:\\a.jpg")
    
    while True:
        # 显示img窗口
        cv2.imshow('img',img)
        # 等待输入按键
        key = cv2.waitKey(0)
        
        if key == ord('q'):
            break
        elif key == ord('s'):
            # 保存图片img到G:\\b.png
            cv2.imwrite('G:\\b.png',img)
        else:
            print(key)
    cv2.destroyAllWindows()    
    
    4.5 视频采集

    视频是有一定帧率的图片组成的 ==> 视频 == 一秒显示的图片组合(帧数)

    30帧表示一秒显示50张图片

    • cv2.VideoCapture可以捕获摄像头,用数字来表示不同的设备,eg:0,1...
    • 如果是视频文件,可以直接指定路径即可.
    # 打开视频文件,返回视频对象
    vs = cv2.VideoCapture(path)
    # 打开摄像头  0:表示第一个摄像头,返回摄像头对象
    cap = cv2.videoCapture(0)
    cap.isOpened():判断是否打开摄像头
    
    
    4.5.1 实时摄像头
    import cv2
    cv2.namedWindow('video',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video',640,480)
    
    # 返回摄像头对象
    cap = cv2.VideoCapture(0)
    # 摄像头打开失败不报错
    
    # 循环读取摄像头每一帧
    while cap.isOpened():
        # 读一帧数据,然会返回标记和一帧数据,Ture成功,False没到到数据
        ret,frame =  cap.read()
        if not ret:
            # 没读到数据
            break
        # 读到了数据,显示到窗口上
        cv2.imshow('video',frame)
        # 等到10ms输入键盘字符
        key = cv2.waitKey(10)
        if key & 0XFF == ord('q'):
            break
    # 释放资源
    cap.release()
    # 销毁窗口
    cv2.destroyAllWindows()
    
    
    4.5.2 打开视频
    import cv2
    cv2.namedWindow('video',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('video',640,560)
    cap = cv2.VideoCapture('G:\\c.mp4')
    
    while cap.isOpened():
        ret,frame = cap.read()
        if not ret:
            break
        cv2.imshow('video',frame)
        # 如果一个视频是30帧,那麽每张图片之间要间隔多少ms
        # 所以播放视频时候,还要考虑原视频的帧率
        # 每张图片间隔1000//3ms
        key = cv2.waitKey(1000//3)
        # 只能使用整数
        if key & 0XFF == ord('q'):
            break
    cap.release()
    cv2.destroyAllWindows()
    
    
    4.5.3 视频录制(把摄像头录制的视频保存下来)
    • VideoWriter:参数一为输出文件,参数二为多媒体文件格式(VideoWriter_fourcc(多媒体文件格式)),参数三为帧率,参数四为分辨率
    • VideoWriter('out.mp4',cv2.VideoWriter_fourcc(*'mp4v'),20,(640,480))
    • mp4v格式:压缩比高,视频文件小,XVID格式:视频文件大,早期用的
    • write 编码并写入缓存
    • release 缓存内容写入磁盘,并释放资源
    • 输出文件的格式和
    import cv2
    cv2.namedWindow('frame',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('frame',600,560)
    # 捕获相机
    cap = cv2.VideoCapture(0)
    # *'mp4v' 解包操作 == 'm','p','v','4'
    # 创键文件格式对象
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    # fourcc = cv2.VideoWriter_fourcc(*'XVID')
    # 创键VideoWriter
    vw = cv2.VideoWriter('G:\\output.mp4',fourcc,30,(640,480))
    while cap.isOpened():
        ret,frame = cap.read()
        if not ret:
            break
        # 读到了数据,把这一帧的图片写入到缓存中,释放的时候写入指定文件
        vw.write(frame)
        cv2.imshow('frame',frame)
        if cv2.waitKey(1) == ord('q'):
            break
            
    # 释放资源
    cap.release()
    vw.release()
    cv2.destroyAllWindows()
    
    
    4.6 控制鼠标

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

    • setMouseCallback(winname,callback,userdate):winname是窗口的名字,callback是回调函数,userdata是给回调函数的参数
    • callback(event,x,y,flags,userdata):回调函数必须包含这5个参数,event是事件(鼠标移动、左键、右键,),x,y是点鼠标的坐标点,flags主要用于组合键,userdata就是上面的setMouseCallback的userdata


    import cv2
    import numpy as np
    
    # 回调函数名可以随便取,但是参数必须是5个
    # event表示鼠标事件
    # (x,y)是发生事件的坐标
    # flags是按键组合
    # userdata是用户传入的数据
    def mouse_callback(event,x,y,flags,userdata):
        print(event,x,y,flags,userdata)
        # 按下鼠标右键退出
        if event == 2:
            cv2.destroyAllWindows()
    
    # 创建窗口
    cv2.namedWindow('mouse',cv2.WINDOW_NORMAL)
    # 宽度和高度
    # 行是高度,列是宽度
    # 所以和zeros数组中传入的行和列要相反  -- attention
    cv2.resizeWindow('mouse',640,360)
    
    # 设置鼠标的回调函数
    # '123'会传送到userdata中
    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()
    
    
    4.6 TrackBar控件

    应用:用于三原色控制

    • createTrackBar(trackbarname,winname,value,count,onChange):创键TrackBar控件
    • trackbarname为控件名,winname为cv2创建的窗口名,value为tarckbar的默认值,count为bar的最大值,最小为0,onChange为TrackBar的值改变的时候触发的回调函数
    • getTrackbarPos(tackbarname,winname):获取TrackBar当前值

    调色板

    import cv2
    import numpy as np
    
    # 创建窗口
    cv2.namedWindow('trackbar',cv2.WINDOW_NORMAL)
    cv2.resizeWindow('trackbar',640,480)
    
    # 定义回调函数
    def callback(value):
        pass
    
    
    # 创键3个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()        
    
    
  • 相关阅读:
    深度学习与非线性
    浅谈Class Activation Mapping(CAM)
    如何形象又有趣的讲解对抗神经网络(GAN)是什么?
    X86生态圈为什么在物联网玩不转?什么是Intel® FSP ?它能解决什么问题?
    关于哈希的最通俗的解说
    2020新年快乐,抛弃所有不顺,大步向前
    读心术的方法--多体素模式分析(MVPA)
    Cross-Multimedia dataset
    Word2Vec详解
    解决Error:Could not determine the class-path for interface com.android.builder.model.AndroidProject.
  • 原文地址:https://www.cnblogs.com/nanfengnan/p/16412553.html
Copyright © 2020-2023  润新知