简单的介绍几个概念的区别:
*图像处理:计算机对图像进行分析、处理以达到所需结果。侧重于处理图像(增强、还原、降噪、分割等)。
*计算机视觉:让机器学会“看”的视觉技术。这里的看包含了:目标识别、跟踪、测量等。侧重于使用计算机,让机器拥有人的视觉。
*opencv:是一个包含了图像处理和计算机视觉技术的开源函数库。
至于opencv的概述和发展起源就不再细说,大致了解就行。应用的话有人机交互、物体识别、图像分区、人脸识别、动作识别、运动跟踪、机器人。opencv的基本构架(也可以理解为opencv有哪些功能),三维标定、核心模块(基本数据结构、动态数据结构、数组操作相关函数、辅助功能与系统函数和宏、与opengl的互相操作)、图像处理模块、特征检测模块、flann(快速近似最邻近搜索、聚类)、GPU加速模块、高层用户界面模块、机器学习模块、目标检测模块、图像拼接模块、视频模块。
下载可以到官网进行下载,环境配置的话第一步是设置环境变量,就是告诉计算机你的opencv安装在哪里,第二步头文件包含,第三步是加入库目录,第四步是静态库的连接。
下面是一个综合的示例,程序并不是很长,实现的效果是从摄像头读取视频,检测并显示边缘。
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
VideoCapture vidsrc;//VideoCapture 是一个封装好的类,该类像Mat一样,Mat是用来存放图像的类,VideoCapture是用来存放视频的类。
vidsrc.open(0);//open是VideoCapture这个类里面的方法,参数0表示从摄像头读取视频,如果参数是指定视频的路径,则读取指定的视频。
Mat edgs;//定义一个变量来存储检测出来的边缘
//使用死循环将视频的每一帧输入到frame中
while (1) {
Mat frame;//定义一个变量来存储视频的每一帧
vidsrc >> frame;//将每一帧输入到变量frame中
cvtColor(frame,edgs,COLOR_BGR2GRAY);//将颜色转变为灰色
blur(edgs, edgs, Size(7, 7));//均值模糊处理(目的是降低图像的噪声)
Canny(edgs, edgs, 20,50, 3);//使用Canny进行边缘检测
imshow("cnnny edgs", edgs);//输出显示检测结果
//每一帧图像延时10ms(因为等待10毫秒后就跳出if语句,进行下一次while循环,要不就没有时间显示检测结果)
if (waitKey(10) >= 0) {
break;
}
}
return 0;
}
程序的结构主要是遵循canny边缘检测的原理来设定,首先获取原图像,然后转换为单通道灰度图像,然后进行模糊处理,最后调用canny进行边缘检测,然后输出检测结果。额外的知识点是从摄像头读取视频(是用定义好的类,然后调用类里面的方法就可以读取了。如果要显示视频的话也是使用死循环显示每一帧的图像,组合成一段视频。),将视频输入到每一帧中(使用死循环)。
在这个综合示例中个人觉得最需要注意的是在使用canny时如何搭建程序流程,这点从canny的原理入手很好解释,首先获取源图像就不用说了,将图形转换为单通道的灰度图像是因为canny的输入需要时单通道的灰度图像。之所以在模糊之前进行灰度转化这也是考虑到程序的运行效率,对单通道图像进行模糊比对三通道图像进行模糊的计算量要小一些。模糊是为了消除图像中的噪声点,因为canny是基于梯度变化检测边界的函数,所以噪声点会对检测结果有很大的影响。总结以上:使用canny时,1转灰度,2模糊,3才canny。