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的依赖,装了之后可以清缓存重新启动一下。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ksbpmDH-1598791863048)(media/15987504599434/15987875006578.jpg)]

    • 读取图片并显示,代码如下。这里的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)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GoXQBT9N-1598791863050)(media/15987504599434/15987880110933.jpg)]

    # 原样读取
    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)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DU4M2Bwg-1598791863051)(media/15987504599434/15987885378961.jpg)]

    • 写入图片
    # 写入路径 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)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BGWTyrJy-1598791863052)(media/15987504599434/15987897999286.jpg)]

    • 绘制一个直线出来,这里有很多东西不在赘述了,首先这里的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)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3xOQyPt1-1598791863053)(media/15987504599434/15987903925638.jpg)]

    • 我们可以通过结合上述两种方式来实现图片的剪切
    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)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsQeuhfB-1598791871666)(media/15987504599434/15987909879610.jpg)]

    • 获取图像的信息
    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++ 图像算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

零蚀zero eclipse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值