计算机视觉是人工智能技术的一个重要领域,计算机视觉其实是一个很宏大的概念,下图是从网上找到的的计算机视觉所需要的技能树。
什么是计算机视觉?
计算机视觉是一门研究如何使机器“看”的科学,更进一步的说,就是是指用摄影机和电脑代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图形处理,使电脑处理成为更适合人眼观察或传送给仪器检测的图像。作为一个科学学科,计算机视觉研究相关的理论和技术,试图建立能够从图像或者多维数据中获取‘信息’的人工智能系统。所以计算机视觉也可以看作是研究如何使人工系统从图像或多维数据中“感知”的科学。
关于opencv
- 最初是Inter公司开发
- 核心库使用C/C++编写,支持CUDA加速
- 现在已经发展到了OpenCV4.0.1版本
- 基本全平台
opencv的基础操作
1.使用opencv读取一张图片。图片要放在工程文件夹里。
Mat src = imread("E:\\zhu.jpg", 1); //注意分隔符!!!读一张名为“zhu”的图片,存入矩阵中。后一个参数为1表示RGB三通道,为0为灰度图。
cvtColor(src, src, COLOR_BGR2GRAY);//用于转换颜色,有三个参数,第一个为读取的矩阵名称,第二个为输出矩阵名称,第三个表示转换为灰度图。
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);//显示图片
运行结果如图:
2.修改图像:转换色彩空间。
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
//读入图像。
Mat src = imread("E:\\zhu.jpg");//注意分隔符!!!
if (src.empty()) {
printf("could not load image...\n");
return -1;
}
//创建窗口,自动大小。
namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);
imshow("test opencv setup", src);
//修改图像:转换色彩空间。
namedWindow("output windows", CV_WINDOW_AUTOSIZE);
Mat output_image;
cvtColor(src, output_image, CV_BGR2HSV);//源和目标彩色空间定义。
imshow("output windows", output_image);
//写出图像。
imwrite("E:/image/lenahsv.png", output_image);
waitKey(0);//键盘按任意键,关闭。
return 0;
}
运行结果如图:
注:
关于灰度图和彩色图:
灰度图是单通道存储,值为0~255
彩色图是三通道存储,即 R(red) G(green) B(blue)
需要注意的是在图像矩阵中,列数为行数的三倍,并且是以 B G R 的顺序存储的
3.调用摄像头的操作。
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;//引入命名空间
using namespace cv;
int main(int argc,char **argv)
{
VideoCapture video(0);
while (true)
{
Mat frame; //创建一个Mat 对象,是一个矩阵。
video >> frame; //cap类似c++中的cin,cap读取一帧图像保存在frame中,后一个参数为0表示可以调节窗口大小。若为1表示不可以。
//cvtColor(frame, frame, COLOR_RGB2GRAY); //用于转换颜色,有三个参数,第一个为读取的矩阵名称,第二个为输出矩阵名称,第三个表示转换为灰度图。
namedWindow("frame", WINDOW_AUTOSIZE);
imshow("frame", frame); //显示图像
waitKey(30); //等待30毫秒,为0表示无限延迟。
}
return 0;
}
这里就不贴运行结果了。
4.对图像求导,这种处理方法是用中心像素点的右像素点减左像素点。
VideoCapture cap(0);
while(true)
{
Mat frame;
cvtColor(frame,frame,CV_RGB2GRAY);//用于转换颜色,有四个参数,第一个为读取的矩阵名称,第二个为输出矩阵名称,第三个表示转换为灰度图。
cout<<"row"<<frame.rows<<"col"<<frame.cols<<endl;//输出行和列
Mat dimg=Mat(frame.rows,frame.cols-2,CV_8UC1);
for(int i=0;i<frame.rows;i++)
{
for(int j=1;j<frame.cols-1;j++)
{
dimg.at<uchar>(i,j-1)=frame.at<uchar>(i,j-1)-frame.at<uchar>(i,j+1);
}
}
5.利用卷积的方法
卷积就是加权求和。
形象的说: 利用卷积可以实现对图像模糊处理,边缘检测,产生轧花效果的图像。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程。
//5*5卷积模板
Mat model = Mat(5, 5, CV_64FC1);
double sigma = 80; //超参数(运算前根据经验给定的定值)
for (int i = -2; i <= 2; i++)
{
for (int j = -2; j <= 2; j++)
{
model.at<double>(i + 2, j + 2) = exp(-(i*i + j * j) / (2 * sigma*sigma)/(2*PI*sigma*sigma ));
}
}
6.高斯模糊
高斯模糊的实质是利用了正态分布去生成对应的权值矩阵(卷积核)
用matlab对图像进行高斯模糊:
image = imread('C:\lena.jpg');
w=fspecial('gaussian',[5 5],0.7);
im=imfilter(image,w);
imwrite(im,'C:\zhu.jpg','jpg')
7.调用opencv的内部方法实现高斯模糊,以及边缘检测。
GaussianBlur(src, dst, Size(15, 15), 180); //高斯模糊