您的位置:首页 > 理论基础 > 数据结构算法

openCV之基础数据结构

2017-05-18 22:03 381 查看
        被一个同学拉去面试一个团队,抱着试试看的心态去,竟然以后打算往人工智能或者游戏开发上面靠,计算机图形学是必须要学的了。于是面试他们的图像处理组,最后阴差阳错的进了。竟然进了就好好对待吧。openCV撸起来。

        这两天看了一些博客,还有借了《openCV计算机视觉编程攻略》来看。打算继续用博客的方式记录下我学习的进程吧。

        先说下我对图像处理的简单了解:一张图片是由许许多多的像素点集合出来的产品。一个像素点一般有三个通道,分别代表着我们自然界的三原色,没错,计算机千姿百态的颜色也是由三原色(BGR)组合而成的。在图形处理中,这三种颜色都有自己的数值(0-255),随着数值的升高,这些颜色也随之变深。不同数值的BGR可以组成不同的颜色,一共有256*256*256钟颜色。图像处理,就是通过算法,对图像上某块区域的像素或者某一个像素点进行操作,达到我们想要的目标图像。

         下面我们讲解下在openCV中常用的一些数据结构:

一.Mat类

         Mat是c++封装好的一个类。主要用于存放一张图片的信息。包括所有像素点,行数,列数,图片类型(灰度,彩色)等等。

Mat image;//定义了一个Mat类的图像二.Mat类型的imread(),imwrite(),imshow(),namedWindow()
imread( const String& filename, int flags = IMREAD_COLOR ):

1.const String& filename :一般是“1.jpg”,“1.png”等格式的图片

2.int flag=IMREAD_COLOR:

       flags >0返回一个3通道的彩色图像。

       flags =0返回灰度图像。

       flags <0返回包含Alpha通道的加载的图像。

imwrite( const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>());

1.const String& filename:要保存的文件名加后缀如:“猫.jpg”。

2.InputArray类型的img,也就是你想保存的图片,一般填一个Mat类型的图像数据就行了。

3.const vector<int>&类型的params,表示为特定格式保存的参数编码,它有默认值vector<int>(),所以一般情况下不需要填写。而如果要填写的话,有下面这些需要了解的地方:

     对于JPEG格式的图片,这个参数表示从0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值是95.

     对于PNG格式的图片,这个参数表示压缩级别(CV_IMWRITE_PNG_COMPRESSION)从0到9。较高的值意味着更小的尺寸和更长的压缩时间,而默认值是3。

     对于PPM,PGM,或PBM格式的图片,这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,而默认值是1。

void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE );


1.参数一:窗口的名称

2.参数二:窗口的标识

   WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)

   WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。

   WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。

void imshow(const string& winname, InputArray mat);

1.参数一:图片显示窗口的名称

2.参数二:图片名称

例程:

Mat image = imread("timg.jpg");//读取一张图片
namedWindow("小猫咪");//命名一个“小猫咪”的窗口
imshow("小猫咪",image);//显示出图片image,如果没有窗口“小猫咪”,便创建一个
imwrite("小猫咪.jpg", image);//将image命名为“小猫咪”,并以jpg格式保存

三.ROI区域(Region Of Interest,兴趣区域)
     
 有时我们需要让一个处理函数的只在图像的某个部分起作用。openCV就有这样的机制,帮助我们定义出一个图像中我们感兴趣的区域,便于我们只对该区域内的图像进行操作。

方法一:第一种是使用cv:Rect.顾名思义,cv::Rect表示一个矩形区域。指定矩形的左上角坐标(构造函数的前两个参数)和矩形的长宽(构造函数的后两个参数)就可以定义一个矩形区域。

//方法一
//在image的(150,150)处画出一个宽为40,高为50的矩形
Mat imageROI = image(Rect(150, 150, 40, 50));
方法二:指定感兴趣行或列的范围(Range)。Range是指从起始索引到终止索引(不包括终止索引)的一连段连续序列。cv::Range可以用来定义Range。如果使用cv::Range来定义ROI,那么前例中定义ROI的代码可以重写为:

//方法二
//Range()函数,在图中画出一个范围,比如高150到150+50
Mat imageROI = image(Range(150, 150+50), Range(150, 150+40));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  opencv