opencv笔记

                         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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值