OpenCV基础知识点总结

/**********************************************************************************************************
                                  Opencv的基础学习及注解    By  jwhu  2016/1/5
1、对于opencv基础类库的研究
2、比较using namespace cv与using namespace std;
3、int main(int argc, char **argv)具体代表含义的理解
4、比较Mat与IplImage的异同;
5、cvWaitKey的用法;
***********************************************************************************************************/

#include //标准的输入输出流
#include
#include//具体头文件需要具体情况进行调用

/***********************************************************************************
1、对于opencv基础类库的研究
上午查看了OpenCV的库函数,之前对库函数不是很重视,今天打开头文件的底层,突然感觉阅读代码很有必要
一是学习别人的编程风格,体会编程思想
二是温故而知新,温习函数的用法及调用
************************************************************************************/

using namespace cv;

/**********************************************************************************
2、比较using namespace cv与using namespace std;
首先明确一下命名空间,在标准C++语言提供一个全局的命名空间namespace,可以避免导致全局命名冲突问题。
当使用标准的输入输出流的时候,该头文件没有定义全局命名空间,必须使用using namespace std;这样才能正确使用cin、cout。
当使用OpenCV时,就需要使用using namespace cv,才能调用库函数,否则会出现“找不到标识符”
************************************************************************************/

int main(int argc, char **argv)

/**********************************************************************************
3、int main(int argc, char **argv)具体代表含义的理解
在opencv的编程中经常使用上述main函数的使用方式,
其中argc代表:输入的参数个数
其中argv代表:此可执行文件的存储路径、程序变量
例如:你在D盘下建立了一个工程,并命名为cvshow,同时在此工程下建立了一个名为cvshow的cpp源文件,
当执行程序是将在Debug文件夹下生成show.exe可执行文件,当然Debug文件位于工程cvshow下,
所以可执行文件show.exe的存储路径为D:\cvshow\Debug\show.exe,即argv[0]的值
argv[1]、argv[2]、argv[3]依次代表输入变量,变量以空格相隔开
实例:加入输入变量为:c:\1.bmp
那么,argc==1  argv[0]==D:\cvshow\Debug\show.exe   argv[1]==c:\1.bmp
一般为了方便起见,可以采用相对路径,即是将图像和程序放在同一文件夹内,这样argv[1]=1.bmp
*************************************************************************************/

{
	if (argc != 2)
		return -1;
	IplImage *img = cvLoadImage(argv[1], 0);//2.0版本之后引入了C++接口,可以用Mat

/************************************************************************************
4、比较Mat与IplImage的异同;
IplImage:在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构;
          在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写的,提供的接口也是C语言接口;
Mat:Mat是后来OpenCV封装的一个C++类,用来表示一个图像,和IplImage表示基本一致,但是Mat还添加了一些图像函数比如后来引入的imead imwrite等;
区别:1)读取图像方式不同:
	    通常情况对于图像的读取,IplImage 通过 cvLoadImage,   cv:Mat通过 cv::imread(若采用命名空间,直接用imread)
	 2)对于内存图像数据创建稍有不同:
	 IplImage ,通过cvCreateImage, 创建后复制像素到创建的内存,或者cvCreateImageHeader和cvSetImageData创建;
	 cv::Mat,直接可以通过构造函数Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP); 直接创建;
	 示例:cv::Mat * pMat = new cv::Mat( 288, 352,  CV_8UC3, imagebufdata ); 
	 注意:是前两个参数是图像的height和width,不是width和height;(若采用命名空间可以省掉cv::)
	       IplImage IplImagetmp = IplImage(*pMat);
	 通过上面的描述可以看出,创建内存数据图像,直接通过 cv::Mat类比较简单,然后可以通过Mat获取IplImage,
	 通过cvCreateImage等函数创建内存图像,比较麻烦,创建后还要通过cvReleaseImage等函数释放内存,所以建议用cv::Mat创建;
******************************************************************************************/

	cvNamedWindow("图像");//创建一个名为“图像”的窗口
		cvShowImage("图像",img);
	cvWaitKey(1000000);

/******************************************************************************************************
5、cvWaitKey(delay)的用法
 返回值为int型, 当delay小于等于0的时候,如果没有键盘触发,则一直等待,此时的返回值为-1;
                 当delay大于0时,如果没有键盘的的触发,则为等待delay的时间,单位为ms
*******************************************************************************************************/
		
	cvReleaseImage(&img);
	cvDestroyWindow("图像");//这是2.0版本之前用的 IplImage,需要手动管理内存,调用完必须释放和销毁,建议使用Mat
	return 0;
}

你可能感兴趣的:(Opencv,opencv)