opencv学习笔记(一)读入一幅图片

来源:互联网 发布:汉字书写顺序软件 编辑:程序博客网 时间:2024/05/16 05:33

        首先说明一下,我只是一个小白,但是也学习过opencv一段时间,现在准备把自己学习的经验(姑且算是吧,大牛们肯定是看不上的)写成博客,算是对自己学习经历的一个纪念吧。

        首先将要读入的图片直接放在工程文件夹下。

程序如下:


#include <opencv2/opencv.hpp>

 

using namespace cv;

using namespace std;

 

int main(int argc,char **argv[])

{

const char* pstrImageName ="a.jpg";

const char* pstrWindowsTitle="TEST";


 IplImage*pImage=cvLoadImage(pstrImageName,CV_LOAD_IMAGE_UNCHANGED);

cvNamedWindow(pstrWindowsTitle,CV_WINDOW_AUTOSIZE);

cvShowImage(pstrWindowsTitle,pImage);

cvWaitKey();

cvReleaseImage(&pImage);

cvDestroyWindow(pstrWindowsTitle);

}

下面是关于这个程序的详细解释。

1.0头文件

       具体的可以参考博客

http://www.csdn123.com/html/topnews201408/95/8695.htm

       然后根据本菜鸟的经验,任何程序的库文件其实可以直接写成

#include <opencv2/opencv.hpp>

肯定可以用,因为相当于把所有的库文件都写进来了。

1.1 int main(int argc, char **argv[])

关于这个写法,有两种说法

int main(int argc,char *argv[])或者写成char**argv[]但是好像是一样的,都能运行

我看都有很多例子是写成char **argv[],但是我借的一本C语言书上写成char *argv[]。

argc是命令行总的参数个数  

   argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数是命令行后面跟的用户输入的参数,比如:  

   int   main(int   argc,   char*   argv[])  

   {  

   int   i;  

   for   (i   =   0;   i<argc;   i++)  

   cout<<argv[i]<<endl;  

   cin>>i;  

   return   0;  

   }  

   执行时敲入  

   F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE   aaaa   bbb   ccc   ddd  

   输出如下:  

   F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE  ——argc[0]

   aaaa                                  ——argc[1]

   bbb                                   ——argc[2]

   ccc                                   ——argc[3]

   ddd                                   ——argc[4]

1.2 cvLoadImage()

该函数是一个高层调用接口,它通过文件名确定被加载文件的格式,并且该函数将自动分配图像数据结构所需的内存。该函数执行完后将返回一个指针,此指针指向一块为描述该图像文件的数据结构(IplImage)而分配的内存块。

所以才会有IplImage *pImage=cvLoadImage();——定义一个结构体指针指相应的内存块。

函数原型:

IplImage* cvLoadImage(

const char* filename,

int flags=CV_LOAD_IMAGE_COLOR );

其中,flags :指定读入图像的颜色和深度:

指定的颜色可以将输入的图片转为

3通道

(CV_LOAD_IMAGE_COLOR),

单通道

(CV_LOAD_IMAGE_GRAYSCALE),

或者保持不变(CV_LOAD_IMAGE_ANYCOLOR)

 

深度指定输入的图像是否转为每个颜色通道每象素8位,或者同输入的图像一样保持不变。

选中CV_LOAD_IMAGE_ANYDEPTH,则输入图像格式可以为8位无符号,16位无符号,32位有符号或者32位浮点型。

如果输入有冲突的标志,将采用较小的数字值。比如CV_LOAD_IMAGE_COLOR | CV_LOAD_IMAGE_ANYCOLOR——将载入3通道图。

CV_LOAD_IMAGE_ANYCOLOR

CV_LOAD_IMAGE_UNCHANGED

是等值的。但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使用的优点,所以CV_LOAD_IMAGE_UNCHANGED不再使用了。

如果想要载入最真实的图像,选择CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR

cvLoadImage( filename, -1 ); 默认读取图像的原通道数

cvLoadImage( filename, 0 ); 强制转化读取图像为灰度图

cvLoadImage( filename, 1 ); 读取彩色图

1.3 IplImage

上面提到了IplImage,它是一个结构体,而且是opencv里面最常用的结构体。

1.4 cvNamedWindow()

cvNamedWindow(参数1——自己命名,参数2)

该函数也是一个高层调用接口,作用是在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。函数的第一个参数指定了该窗口的窗口标题,第二个参数定义了窗口的属性:

默认值是0,这样的话图像只能在窗口中根据窗口的大小进行拉伸或缩放;

而设置成CV_WINDOW_AUTOSIZE,窗口会根据图像的实际大小自动进行拉伸或缩放,以容纳图片。

1.5 cvShowImage()

cvShowImage(参数1——窗口名称,参数2——相应的IplImage*类型指针)

 

函数通过设置其第一个参数确定在哪个已存在的窗口中显示图像。该函数在被调用时,该窗口将重新绘制,并且图像也会显示在窗口中。如果窗口在创建时CV_WINDOW_AUTOSIZE被指定作为函数cvNamedWindow()的第二个参数,该窗口将根据图像的大小自动调整。

 

方便起见,我们使用文件名来表示窗口名称。这样处理很好.,因为OpenCV默认将窗口名称显示在窗口的顶部,这使得我们可以知道正在看的是哪一幅图像。

1.6 cvWaitKey()

函数的功能是使程序暂停,等待用户触发一个按键操作。

        如果参数设置为正数——相当于延时,时长为该整数值个毫秒单位,然后继续执行程序。

        如果设置为0或负数,程序将一直等待用户触发按键操作。

即该程序停在显示函数处,不运行其他代码;否则,图像无法正常显示。

1.7 cvReleaseImage()

cvReleaseImage( & xx);

    一旦用完加载到内存的图像文件,我们就可以释放为该图像文件所分配的内存。我们通过该函数传递一个 IplImage*的指针参数调用该函数,用以执行内存释放操作。

因为刚开始定义了一个IplImage *pImage,所以最后释放的时候是cvReleaseImage(&pImage);

1.8 cvDestroyWindow()

cvDestroyWindow( 窗口名称 );

    该函数用于销毁显示图像的窗口,同时释放与该窗口想关的内存资源。

0 0