人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器。计算机视觉是人工智能的一个分支,它研究如何使人工系统从图像或多维数据中“感知”的科学。
- 人类历史就是一部技术发展的历史,经历了这么几个阶段:
- 1万年前人类开始种植粮食,进入农业阶段
- 十七世纪后期的工业革命,大规模的机器生产代替手工作坊,解放了人类的双手和双脚
- 20世纪7/80年代开始的信息和人工智能时代, 解放了人类的大脑
- 人类智能体现在人类对周围环境的感知上,75%都是出于感知
- 我们想要机器代替人类来感知外部世界
- 视觉是自然智能不可思议的结晶
- 猕猴大脑皮层中视觉部分占据大约50%
- 人类大脑皮层中视觉部分所占最大, 大约55%
- 人类视觉是由多块神经区域组成的
- 通过眼睛感受外接物体反射的光线
- 进一步通过视觉传导纤维到达脑后视觉处理中枢
- 视觉处理中枢又分为v1~v5等多个区域
- 人类采用神经网络对视觉信息进行深层次处理
- 计算机视觉:让计算机看懂图像和视频
- 在图像识别中我们会关注以下几个信息,我们也希望计算机可以和我们一样识别
- 目标是什么
- 目标位置
- 目标在做什么
- 目标之间的关系
- 起源:20世纪50年代统计模式识别,二维图像分析
- 诞生:1974年MIT科学家Minsky带其学生David Marr暑期课题进行研究,1981人工智能计算机视觉专辑,Marr视觉计算理论得到迅速发展
- 发展:
- 80年代以后
- 计算能力迅速增长, 视觉计算成本极大降低
- 以Marr理论为基础的视觉理论广泛研究
- 视觉技术得到迅速发展,在视频监控、工业分析等领域得到广泛应用
- 2000年后,特征提取和基于学习的视觉得到迅速发展
- 2006年,Hinton提出深度学习
- 2010年,微软使用深度学习再语音方面取得突破发展
- 2015年后,深度学习在视觉个应用领域取得突破:
- 2015, 在ImageNet上的识别准确率首次超越人类
- 2016, Tesla创造了56亿公里自动驾驶路测数据
- 2017, iPhonX宣布引入Face ID高精度人脸识别技术,随后,华为也在手机实现了该技术
- 2018, OpenAI 2:1战胜人类DOTA2高手队
- ... 人类可能在很多方面完全无法和计算机匹敌
- 80年代以后
- 服务机器人
- 安防监控
- 自动驾驶
- 智能穿戴
- 无人机快递
- ...
1 ) C++版本
环境:
- win10
- Visual Studio 2015或更高版本(社区版免费)
- OpenCV 3.x版本
- 具体配置方式:https://jingyan.baidu.com/article/dca1fa6f13bd55f1a44052b9.html
#include "opencv2/opencv.hpp"
using namespace cv;
int main(void) {
char *fn = "D:\\lena.jpg";
Mat image = imread(fn);
imshow("Hello, world!", image);
waitKey(0); // 不加这句话,窗口会闪退
return 0;
}
2 ) python版本
import cv2
img = cv2.imread(r'D:\lena.jpg') # 这里通过r不用进行转义了
cv2.imshow('Hello, world!', img)
cv2.waitKey()
cv2.destroyAllWindows()
- 照明设备:光源
- 成像设备:相机
- 处理设备:主机
- 算法软件:视觉处理系统
1 )图像改变大小
- C++函数:
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
- Python函数:
dst = cv.resize( src, dsize[, dst[, fx[, fy[, interpolation]]]] )
2 ) 图像平滑
- 高斯平滑: 会把原始图像模糊化, 可以去除原始图片噪声
- Opencv中提供一个函数对原始图像做高斯平滑滤波
- C++:
void GaussianBlur( const Mat& src, Mat& dst, Size ksize,double sigmaX, double sigmaY=0,int borderType=BORDER_DEFAULT );
- 参数1:原始图像
- 参数2:滤波后的图像
- 参数3:采用的高斯滤波器模板的大小,通常取值33或55
- 参数4和5:代表x和y方向高斯函数宽度的信息
- Python:
dst = cv.GaussianBlur(src,ksize,sigmaX[,dst[,sigmaY[,borderType]]])
- C++:
3 ) 图像颜色空间转换和阈值化
void cvtColor(InputArray src, OutputArray dst, int code,int dstCn=0);
void threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
4 ) 全部代码参考
C++版本:
#include "opencv2/opencv.hpp"
using namespace cv;
int main() {
char * fn = "D:\\lena.jpg";
Mat image = imread(fn);
Mat imageGauss, image1, image2, gray, gray1, hsv, hsvChannels[3];
// 对图像做高斯平滑处理并显示
GaussianBlur(image, imageGauss, size(5, 5), 0);
imshow("source image", image);
imshow("Gaussian filtered image", imageGauss);
waitKey();
// 对图像使用resize和pyrDown缩小一半再一半, 显示图像
resize(image, image1, Size(image.cols/2, image.rows/2)); // image1的大小就是原始图像image宽和高的一半
pyrDown(image1, image2); // 另一个opencv的函数可以把image1图像缩小1半, 变为image2的图像(原始图像的1/4)
// 彩色转灰度并作阈值化显示
// cvtColor函数把原始图像转换为另外一种颜色空间的图像
// threshold函数把原始图像通过指定的阈值转换成目标的黑白图像,大于阈值则白,小于则黑
cvtColor(image, gray, COLOR_BGR2GRAY); // 将原始图像image转化为灰度图像, COLOR_BGR2GRAY 表示BGR三通道的图像向灰度图像的转换
threshold(gray, gray1, 120, oxff, THRESH_BINARY); // 通过threshold完成了从gray到二值化图像gray1的转换,大于阈值120的所有的像素值都设置为16进制的ff白色
imshow("gray", gray); // 显示灰度图像
imshow("threshold image", gray1); // 显示二值化图像
waitKey();
return 0;
}
python版本
import cv2 as cv
filename = r'D:\lena.jpg'
img = cv.imread(filename)
imgGauss = cv.GaussianBlur(img, (5,5), 0) # 高斯模糊 使用了5*5大小的卷积模板
image1 = cv.resize(img, (int(img.shape[1]/2), int(img.shape[0]/2)))
image2 = cv.pyrDown(image1) # 颜色转化
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # opencv缺省的彩色图像颜色排列是BGR模式与RGB模式略有区别
_, gray1 = cv.threshold(gray, 120, 0xff, cv.THRESH_BINARY) # 阈值化
cv.imshow("source image", img)
cv.imshow("Gaussian filtered image", imgGauss)
cv.imshow("half size", image1)
cv.imshow("quarter size", image2)
cv.imshow("gray", gray)
cv.imshow("threshold image", gray1)
cv.waitKey()
cv.destroyAllWindows()
- 目的:通过视觉系统,重建三维物体的形状和位置
- 理论的三个层次:
- 初始略图(2维):过零点(zero-crossing)、短线段、端点等基元特征
- 2.5维:对物体形状的一些粗略描述
- 3维:对物体的三维描述
- 计算机视觉的早期图像表示模型是Part-based, 这样就可以通过part这种组合式的方法表示物体。但很多自然场景的物体没有这么强的结构。
- 80年代,特征检测和机器学习也开始组合应用,但对物体结构有严格限制(指定对象类型)。只能在少数场合取得比较好的效果。
- 2000-2012年,局部特征描述得到迅速发展,如:SIFT/HOG
- 特征描述具有通用性,结合SVM等机器学习方法, 但效果有限。
- 2012年后,深度学习方法兴起。特征->自动提取;层数->很深
- eg.MS的ResNet 152层
-《数字图像处理 基础篇》2002 -《数字图像处理(第三版)》2017 -《OpenCV2计算机视觉编程手册》2013 -《计算机视觉-算法与应用》2012 -《机器视觉》2017 -《计算机视觉教程(第2版)》
-
OpenCV (Open Source Computer Vision Library)
- 47000人用户社区,14000000下载量
- 使用最为广泛的计算机视觉库
- 支持C++/Python/Java, 同时有C#等 扩展
- 可在PC、嵌入式平台和移动端使用 l 最新版本为4.0.
-
VS ( Visual Studio)
- windows平台的编程利器
- VS Color Output 扩展插件 显示区分不同的颜色,方便调试
- VS Line Counter 扩展插件 统计项目所有文件代码行数
- Super Charger 扩展插件 :代码流线、超级拷贝粘贴(栈)、超级Find(颜色区分)、智能注释等等