关于opencv库的介绍
1.openCV中我们一般使用Mat类,来存储我们所输入的图片,mat作为一个C++语言独有的类(具备C语言中的结构体,并且同时拥有对自身结构体操作的函数),使用方法十分多。
2.首先明确存储的图像不管是彩色的还是灰度图像,都是二维的矩阵,具体的存储格式如下
如果是灰度图(它并不是深度图):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HxBTinjM-1582597096289)(C:\Users\admin\Desktop\70)]
它是这个样子的(显然是一个二维矩阵,行列清晰的记录了每个像素点的信息)
而彩色图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gdok2zSm-1582597096291)(C:\Users\admin\Desktop\20160829204514708)]
虽然看起来有点晕,但实际上它还是一个二维矩阵,我们可以把三原色组成的三列看作一列,从而变成[(BGR),(BGR),…],这样看起来是不是就好看很多了。
看到了吗,虽然彩色图像由BGR(RGB,RGBA各种排列形式)三个通道,但是是存储在同一个平面内的,只不过OpenCV在这里把三列才当作一列,在代码操作中img.cols代表图像所转存的二维矩阵的列数。
一般我们用Opencv读取的灰度图像的数据类型为uchar(unsigned char的简写)类型的,而彩色图像的一个像素的数据类型为类型的,灰度图一个像素占用1个字节,而彩色图像一个像素3个字节。
二,这里同时介绍一些关于编程小技巧,众所周知,相对C语言,C++作为他的扩充,拥有了许多强大的处理数据,或者各种实用的库,但他们由于大多都是其他开发者自行创造,并不被C++自己包括,大多需要我们自行下载,所以许多时候我们为了应用某个库的函数通常需要这样(库名称)::(库函数),这个有时候是真的烦(自己打的烦),但其实OpenCV是可以成为命名区间的,从而节省我们的时间(然而这回导致程序可读性变差)
三。cv::Mat img;
img.at(i, j) = i+j;可以使用上述语句对图像进行操作。
大致格式::at<类型>(i,j)进行操作
resize(img, img, Size(375, 500)) 调整图片格式操作
img.cols 图像矩阵的列数,img.rows 图像矩阵的行数
if(img.isContinuous()) 判断图像存储是否在内存中连续
//Rect四个形参分别是:x坐标,y坐标,长,高;注意(x,y)指的是矩形的左上角点
void main()
{
Mat img = imread("1.jpg");
Mat roi = img(Rect(500, 200, 100, 300));
... ...
}
这个是用来定义一个图像的一个区域(说明这是我们感兴趣的一个地方成为roi区域,CV::rect)本身是一个矩形类。 参考博客:https://www.cnblogs.com/skyfsm/p/6892746.html
在图像处理领域,有一个非常重要的名词ROI。
什么是ROI?它的英文全称是Region Of Interest,对应的中文解释就是感兴趣区域。感兴趣区域,就是我们从图像中选择一个图像区域,这个区域就是图像分析所关注的焦点。我们圈定这个区域,那么我们要处理的图像就从大图像变为一个小图像区域了,这样以便进行进一步处理,可以大大减小处理时间。定义ROI区域有两种方法:
- Mat roi = img(Rect(500, 200, 100, 300));//Rect四个形参分别是:x坐标,y坐标,长,高;注意(x,y)指的是矩形的左上角点
- Mat roi = img(Range(250, 250 + 100), Range(200, 200 + 100));//Range两个形参分别是:起始行或列,起始行或列+偏移量
结语
接下来估计接触PCL,CERES,G2O等库的使用,而关于文件处理库,还有Eigen库,估计要以后了,最近开学上课,实在没想到会忙成这样,很多计划估计都要往后推迟了,毕竟自己本身学业为重,这是毋庸置疑的。
·
以后了,最近开学上课,实在没想到会忙成这样,很多计划估计都要往后推迟了,毕竟自己本身学业为重,这是毋庸置疑的。
·