零蚀
前言
-
内容
-
我将要学的内容是基于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的依赖,装了之后可以清缓存重新启动一下。
-
读取图片并显示,代码如下。这里的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)
- 将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)
- 写入图片
# 写入路径 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)
- 绘制一个直线出来,这里有很多东西不在赘述了,首先这里的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)
- 我们可以通过结合上述两种方式来实现图片的剪切
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)
- 获取图像的信息
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++ 图像算法