NO.1 机器视觉 前言

零蚀


前言

  • 内容

    • 我将要学的内容是基于opencv框架实现的,幸运的是Android部分现在也在更新Opencv,虽然生活工作中最近都比较忙,但是心情很愉悦。

    • 我们这前段的基础部分围绕着opencv基础展开的,前期总体可以分为两部分,一个是对图片的处理,主要是对色值,亮度,滤波等图像色彩的简单处理,第二个是对图像的识别,这部分都是依靠算法来实现的,比如物体识别,边缘识别,图片修复等操作。大体上可以算photoShop的高级模式。

    • 代码模式:前期会使用python来进行编程学习,后面会使用C++来重新实现这些逻辑。

  • 机器视觉简介

    • 机器视觉,是指通过机器人代替人眼进行一些测量判断,它是通过摄像装置,将捕获到的目标转化为图像信号,传送给图像处理系统,然后将图像信息转化为数字信号,然后根据相应的结果来设置设备动作。

opencv接入

  • 接入之前

    • 我们测试opencv需要一个opencv的虚拟环境,这里我们可以使用ubuntu进行下载pip,因为需要用到conda创建虚拟环境。如果没有conda,我们可以通过以下步骤来安装conda。
     # 安装pip
    sudo apt-get update
    sudo apt install python-pip
     # 安装 python3
    sudo apt-get install python3.6
    sudo apt-get install python3-pip
     # 安装conda (conda文件在百度网盘)
    sh Anaconda3-5.3.0-Linux-x86_64.sh 
    sudo rm -rf /usr/local/anaconda3
    rm -rf ~/.condarc ~/.conda ~/.continuum
    export PATH=/usr/local/anconda3/bin:$PATH
    source ~/.bashrc
    conda // 检测是否安装成功
    
    • 创建一个虚拟的环境,这里的conda目前很多东西已经不支持python2.7了,所以后续ros也会做出相关的升级,毕竟在melodic后几个版本都是支持python3的。
    # 创建python3虚拟环境的
    conda create -n opencvtestone python=3
    # 检查是否创建了环境
    $  conda env list
    base                  *  /home/parallels/anaconda3
    opencvtestone            /home/parallels/anaconda3/envs/opencvtestone
    #     $ conda activate opencvtestone 开启环境
    #     $ conda deactivate 结束环境
    # 使用自己创建的环境
    $ conda activate opencvtestone
    (opencvtestone) parallels@zero-ubuntu:~$ # 可以看到环境已经发生变化
    
    • 安装opencv
    # 查看opencv所有的版本
    $ pip install opencv-python==111111111fadsfdsa(任意数)
    ERROR: Could not find a version that satisfies the requirement opencv-python==111111111fadsfdsa 
    (from versions: 3.4.8.29, 3.4.9.31, 3.4.9.33, 3.4.10.35, 3.4.10.37, 3.4.11.39, 3.4.11.41, 4.1.2.30, 4.2.0.32, 4.2.0.34, 4.3.0.36, 4.3.0.38, 4.4.0.40, 4.4.0.42)
    # 工业场景一般会使用稳定版本,3.4版本
    $ pip install opencv-python==3.4.9.33(这个网速比较快)
    # 测试
    >>> import cv2
    >>> cv2.__version__
    '3.4.9'
    

图像的基本操作(Python)

  • 图片的读写

    • 如果你的pycharm中没有opencv的依赖,装了之后可以清缓存重新启动一下。

    NO.1 机器视觉 前言_第1张图片

    • 读取图片并显示,代码如下。这里的mat是一个读取到的矩阵,里面的元素就是RGB元素,这个和android中的mat一样都是储存相片信息的一个容器。和Android版一样都是通过imread来读取本地的数据。

    • 这里的imshow是展示一个小窗口,然后waitKey是等待用户按键,返回值是按键的ASCII码,参数delay是等待时间,0表示一直等待。

    import cv2 as cv
    
    mat = cv.imread("../source/android.png")
    cv.imshow("window", mat) 
    cv.waitKey(0)
    

    NO.1 机器视觉 前言_第2张图片

    • 将RGB图像转为灰度图像,具体的参数种类可以参考Android Opencv篇中的描述 NO.1 Android Opencv 初见 这里不再赘述。
    # 原样读取
    mat = cv.imread("../source/android.png",cv.IMREAD_UNCHANGED)
    # 彩色读取
    mat = cv.imread("../source/android.png",cv.IMREAD_COLOR)
    # 灰度读取
    mat = cv.imread("../source/android.png",cv.IMREAD_GRAYSCALE)
    

    NO.1 机器视觉 前言_第3张图片

    • 写入图片
    # 写入路径 mat矩阵
    cv.imwrite("../source/an.png",mat)
    
  • 像素操作

    • 首先我们可以对之前的图片进行像素绘制,比如每个像素的值取反(这个图像的像素值为200*200)。为什么是row在后呢,因为列数表示每一行又多少元素,行数表示每一列有多少元素。而这里的矩阵的数据单元是BGR模式。所以就出现了以下代码。
    import cv2 as cv
    zeroMat = cv.imread("../source/android.png", cv.IMREAD_COLOR)
    
    for row in range(200):
        for cols in range(200):
            b = 255-zeroMat[cols, row][0]
            g = 255-zeroMat[cols, row][1]
            r = 255-zeroMat[cols, row][2]
            zeroMat[cols, row] = [b, g, r]
    
    cv.imshow("draw", zeroMat)
    cv.waitKey(0)
    

    NO.1 机器视觉 前言_第4张图片

    • 绘制一个直线出来,这里有很多东西不在赘述了,首先这里的zeros是创建了一个图像矩阵,而其中的tuple类型的参数,是指的像素宽,高和通道数。然后我们将其中的每一列的100行变成白色。
    import cv2 as cv
    import numpy as np
    zeroMat = np.zeros((200, 200, 3), np.uint8)
    
    for row in range(200):
        zeroMat[100, row] = [255, 255, 255]
    
    cv.imshow("draw", zeroMat)
    cv.waitKey(0)
    

    NO.1 机器视觉 前言_第5张图片

    • 我们可以通过结合上述两种方式来实现图片的剪切
    import cv2 as cv
    import numpy as np
    src = cv.imread("../source/android.png", cv.IMREAD_COLOR)
    dst = np.zeros((100, 100, 3), np.uint8)
    height = dst.shape[0]
    width = dst.shape[1]
    
    dst = src[0:height, 0:width]
    cv.imshow("draw", dst)
    cv.waitKey(0)
    

    NO.1 机器视觉 前言_第6张图片

    • 获取图像的信息
    print(src.shape)  # (200, 200, 3)
    print(src.dtype)  # uint8 颜色数值0-255 所以是uint8
    

前言
机器人视觉篇
NO.2 机器视觉 几何变化 & 特效处理
NO.3 机器视觉 直方图 & 帧提取
NO.4 机器视觉 人脸识别&色彩过滤
NO.5 机器人视觉 二值化 & 卷积
NO.6 机器人视觉 霍夫检测 & 边缘查找
NO.7 C++中使用Opencv
NO.8 C++ 直方图 & 卷积
NO.9 C++ 匹配 & 变化
NO.10 C++ 图像算法

你可能感兴趣的:(视觉篇,opencv,机器视觉)