Opencv 学习笔记
一、 opencv介绍
opencv 是一个开放源代码的计算机视觉库,其中有很多实现图像处理和计算机视觉方面的通用算法。
opencv 的中许多的c++类和函数的命名都存储在cv的命名空间内,所以,要在函数体外加上using namespace cv 来调用其中的函数。
二、 opencv中基本类的介绍
1>Mat类
Mat类是矩阵Matrix的英文单词的缩写。意思是定义一个矩阵。其中,Mat类定义声明时,会存储矩阵的大小,存储方式,存储矩阵数值的指针域。所以,把变量值复制时,传递的是指针地址。矩阵中的数据类型为CV_8UC1,CV_64FC4,CV_16SC1,等数据类型(下面会具体介绍)。Mat类中有很多直接操作矩阵的方法。如定义对称矩阵,定义数组元素全为一的矩阵,同时由于运算符的重载可以直接完成矩阵加减乘除。
Mat a=Mat::eye(5,5,CV_8UC1);//完成对称矩阵的创建
Mat b=Mat::ones(,5,CV_8UC1);//完成元素全一矩阵的创建
接下来,我们要完成图片创建和显示。
2>imread,imshow类
Imshow是一个读取图像类。它有两个参数。第一个参数是读取图片的位置,如果图片在创建项目的目录下,那直接写图片名即可,如果要写其他路径下的图片,要加上绝对路径,第二个参数为要显图像的通道,如果此参数为0,则显示通道唯一的灰度图,如果大于零显示通道为3的真彩图。
Mat picture = imread("123.jpg", 0);//此为创建灰度图。
imshow("123",picture); //imshow为显示图片的类,第一个参数为显示图片的窗口,第二个参数为要显示的图片。
waitKey(0);//为等待按键的操作,如果为零,则表示一直等待下去。如果无此命令或者数值比较小,则窗口闪一下结束程序。
将图像变成灰度图还有另一种方法。
cvtColor(picture, picture, CV_BGR2GRAY)//前两个参数为变量,最后一个参数为要转换的类型,将BGR图转换成gray(灰度图),2是to的意思。
3>图像的储存
我们人眼看图片,知道那是一张图片,可是如何让计算机储存我们人眼能看的图片呢。计算机储存图片的时候,是将图片图片储存在矩阵中的。计算机把图片分成很多点,每个点有一个数值。如果是灰度图,每一个矩阵元素是0-255之间的数,0表示黑,1表示白。如果是RGB图,则每一个矩阵数值为三个数。储存的数据类型根据定义,如CV_8UC1,则表示8位无符号整形,C表示通道为一。
三、 图像操作
首先,我们来进行一个简单的图像操作,再图像中。我们知道每个图像的轮廓附近的像素值会发生突变,那么如何来显示这个突变呢,首先我们想到的是导数,当导数可以反映突变程度。根据导数定义f(x+1)-f(x)/1来表示图像的突变程度。
Mat picture = imread("123.jpg", 0);
Mat dimg = Mat(picture.rows, picture.cols-2, CV_8UC1);//只进行列方向的操作。所以第一列和最后一列没办法进行操作,所以列恕减二
for (int i = 0; i < picture.rows; i++)
{
for (int j = 1; j < picture.cols - 1; j++)
{
dimg.at<uchar>(i, j-1) = picture.at<uchar>(i, j - 1) - picture.at<uchar>(i, j + 1);//dimg是存储的矩阵,所以存储在第零列开始。操作矩阵则要在第一列开始。
}
}
imshow("123", dimg);
//下面是用一个矩阵进行操作,矩阵的元素分别为1,0,-1。
//卷积的操作
model.at<uchar>(0, 0) = 1;
model.at<uchar>(0, 1) = 0;
model.at<uchar>(0, 2) = -1;
for (int i = 0; i < picture.rows; i++)//这个二重循环是对矩阵的遍历
{
for (int j = 1; j < picture.cols-1; j++)
{
double sum = 0;
for (int m = 0; m < model.rows; m++)//这个二重循环是为了让卷积模板的遍历
{
for (int n = 0; n < model.cols; n++)
sum +=(double)(picture.at<uchar>(i+m ,j+n-1)*model.at<uchar>(m,n))//此操作是对当前矩阵元素和前一个和后一个元素的求和,相当于前一个元素减后一个元素。将他们的和给sum;
}
dimg.at<uchar>(i, j - 1) = (uchar)sum;将sum的和给当前元素。
}
}
imshow("123", dimg);
waitKey(0);