一、什么是计算机视觉
计算机视觉这种技术可以将静止的图像或视频数据转换为一种决策或新的表示。所有这样的转换都是为了完成某种特定的目的而进行的。输入数据可能包含一些场景信息,例如“相机是搭载在衣领车上的”或者“雷达发现了一米之外有一个目标”。表示形式是将色彩图像转换为黑白图像,或者从一个图像序列中消除相机运动所产生的影响。
非计算机专业人士可能会觉得计算机视觉是一种很简单的任务,但是这是一种由于人类是视觉动物而产生的误导,人类的大脑将视觉信号划分为许多通道,可以让你接收不同的信息,大脑的注意力系统基于任务的方式通过图像的重要部分检验其他区域的估计,在视觉系统中会产生巨量的信息反馈,人类会根据自己多年的生活经验产生交叉联想从而获得对物体的感知,就好比你因为知道书本的样子是长方体而且由很多纸张构成,当你看到类似的图景时,大脑就会给你反馈一个这是是书本的信息,因为书本的样子你从从小就已经接触了,所以在大脑中已经建立了一个完备的模式识别机制。
而在计算机视觉系统中,计算机会从相机或者硬盘接收栅格状排列的数字,也就是说,计算机视觉系统不存在一个预先建立的模式识别机制。没有自动控制的焦距和光圈,更没有多年的经验积累,就像一个刚出生的孩童(当然并没有一个孩童这么智能)我们只需知道一个概念,计算机看到的只是数字,并无法体会到人们所看到的形形色色的图片世界,而且计算机在对一个现实中的三维物体进行拍照取样时,在不同的视点所获取的数据也是不一样的,而且就算视点位置不变,两次拍照取样所获取的数据也会有差别,原因在于噪声(此噪声非彼噪声)和畸变的污染。
二、什么是openCV
openCV是一个开源计算机视觉库,可以从http://opencv.org获取,openCV库使用C和C++语言编写,可以在windows,linux,Mac OS等系统运行(没写的系统不代表不支持,目前已经几乎支持所有的主流操作系统),是一个跨平台的计算机视觉库。甚至对ARM都进行了支持,但是由于本身起源于英特尔,所以英特尔的处理器对openCV进行了大量优化(IPPICV IPP子库),因此是最适合运行openCV的硬件平台。
三、怎么用openCV
openCV是一个开源自由的计算机视觉库,其可进行商业或者非商业的目的,自己编写的程序可以不进行开源,openCV本身的模块也是分自由使用和限制使用的,比如:Nonfree模块就是限制使用的,该模块内包含一些牵扯到专利的算法。openCV可以到官网http://opencv.org下载也可以到GitHub下载(https://github.com/opencv/opencv),但是一般官网更新的比较快,而且从github上下载的是未经过编译的源代码,所以下载后需要用Cmake进行编译。直接从官网下载的是exe可执行文件,可以直接进行安装。安装好后需要进行环境变量的配置:
右击我的电脑->属性->高级系统设置->环境变量
在系统变量里找到PATH然后加入:
F:openCVopencvuildx64vc15in
F:openCVopencvuildin
(这是我自己openCV的安装路径,改成自己的即可,另外x64文件夹有vc14和vc15直接选择最新的vc15就可以)
这样openCV就配置好了,然后就是编译器的选择,我选用的是VS2019,下面介绍VS2019如何配置安装openCV库:
首先到:F:openCVopencvuildx64vc15in 目录下(根据自己的openCV安装目录)找到以下三个文件:
注:以上文件名可能会有不同,比如我用的是openCV4.1.1版本所以文件后面都有411的字样,但是如果是4.0.0版本就是400字样。
将以上三个文件复制到:C:WindowsSystem32文件夹下(该文件夹可能需要管理员权限,直接允许就可以)
然后到VS创建项目,右击项目文件->属性->VC++目录,然后在相应的表项下添加如下:
1、包含目录中加入
F:openCVopencvuildinclude
F:openCVopencvuildincludeopencv2
2、库目录中加入
F:openCVopencvuildx64vc15lib
以上根据自己的安装目录更改
同样在 属性->连接器->输入 的附加依赖项表项下加入:
opencv_world411d.lib(这个文件和上面的三个文件一样需要根据自己的openCV版本改一下名字,如4.0.0版本应该是opencv_world400d.lib)
以上便配置好了,可以进行编码了,这里附上一段测试代码:
1 #include <iostream> 2 #include <opencv2/highgui.hpp> 3 #include <opencv2/core.hpp> 4 #include <opencv2/imgcodecs.hpp> 5 using namespace cv; 6 using namespace std; 7 int main() 8 { 9 Mat image; 10 image = imread("F:\图片\桌面背景\123.jpg"); // Read the file 11 if (image.empty()) // Check for invalid input 12 { 13 cout << "Could not open or find the image" << std::endl; 14 return -1; 15 } 16 17 namedWindow("Display window", WINDOW_AUTOSIZE); // Create a window for display. 18 imshow("Display window", image); // Show our image inside it. 19 waitKey(0); // Wait for a keystroke in the window 20 cout << "Hello World! "; 21 }
注:代码中的图片路径记得改成自己随意的一张照片以及路径,还有就是注意这里的路径使用的是双斜线 \