OpenCV C++ 项目开发 知识点积累

OpenCV :

imshow(“dis window”, matImg) : 中直接命名窗口进行显示即可.不必提前创建窗口和使用完毕后释放窗口资源.

Size( width, height)  : Size(宽,高)  : 参数先(宽, 高) ,而不是Mat等数据类型的(高, 宽) .该函数创建二维的大小向量.

resize(srcImage, desImage, dSize, resScale, resScale, INTER_LINEAR) : 直接实现图像的缩放功能.

Mat *desMatImg : Mat图像指针,类同IplImage* .可以作为参数传递地址,具有普通指针的功能.

string *desImg : string 类型指针,具备普通指针的功能,作为参数,被函数改变其值.

RGB 格式 图像的 保存顺序 是 BGR

void cvMoveWindow(const char* name, int x, int y) : 移动窗口位置

cv::Mat ,cv::MatND 是同一类型: typedef cv::Mat cv::MatND. 考虑到很多函数没有检查矩阵维数,在用openCV处理3维,4维等高维矩阵时要小心。

 

cvLoadImage(char*/const char* path, CV_LOAD_IMAGE_ANYCOLOR): 路径参数可以是char* /const char*

string mgNameExtStr = “G:\\WorkSpace\\FileOperation\\resizedImage\\fluor2_CandleWithHolder_037.jpg”;

cvLoadImage(imgNameExtStr.c_str(), CV_LOAD_IMAGE_ANYCOLOR);
 
IplImage* iplPtr :可以先定义(默认指向NULL),后赋值.

 

指针总结 : (1) 库类型对象的地址.包括IplImage , Mat.

                (2) 需要调用某类型对象,将其传递给函数作参数,以在函数中改变其内存值的情况下,都要使用指针类型.

                包括: Mat ,string 等这样的类型.

                (3) 定义时不使用非空地址数据初始化时,初始化为NULL.

                (4) 对于OpenCV中Mat数据自动释放,当转化为IplImage* 时,该IplImage不可使用cvReleaseImage释放. 且该类型使用完毕应该赋为NULL;

代码:

IplImage *resIplPtr = NULL;
	{
		for (int disLoop = 0; disLoop < srcImgNum; disLoop++) {

			srcImg = imread(strImgVec[disLoop]);		// read image;
			resizeMatImg(&resImg, srcImg, 256);			// resize image;
			if (disLoop == 0) {
				cout<<"resize image size : "<<resImg.cols<<" "<<resImg.rows<<endl<<endl;
			}
			namedWindow("src dis",CV_WINDOW_AUTOSIZE);	// display image;
			namedWindow("res dis",CV_WINDOW_AUTOSIZE);
			cvMoveWindow("src dis", 270,300);
			cvMoveWindow("res dis", 10,10);
			imshow("src dis", srcImg);
			imshow("res dis", resImg);
			waitKey(1000);

			cout<<"Image "<<(disLoop + 1)<<" info"<<endl;
			imgNameExtStr.erase(0, imgNameExtStr.size());		// 每次清理缓存字符串;erase the cache string ;
			//strNameExtr(strImgVec[disLoop], &imgNameExtStr, imgNameExt);	// extract the image name string and add the extension ;根据路径提取图像名称,加后缀.;
			strNameExtr(strImgVec[disLoop], &imgNameExtStr, jpgImgNameExt);	// extract the image name string and add the extension ;根据路径提取图像名称,加后缀.;
			imwrite(imgNameExtStr, resImg);	//  save the resized image as jpeg image format;这里的存储格式有问题;120DPI不能被JSEG处理;
			//IplImage *imgLoadTest = cvLoadImage(imgNameExtStr.c_str(), CV_LOAD_IMAGE_ANYCOLOR);
			IplImage resIplImg = resImg;	// 创建IplImage头,共享Mat数据.并未开辟额外的IplImage空间和拷贝数据,所以这个IplImage用完后不可以释放内存.;
			//IplImage *resIplPtr = &resIplImg;	// 因为JSEG中使用的是IplImage数据,所以这里转化为IplImage*类型;
			resIplPtr = &resIplImg;	// 因为JSEG中使用的是IplImage数据,所以这里转化为IplImage*类型;
			cvNamedWindow("ipl img show",CV_WINDOW_AUTOSIZE);
			cvShowImage("ipl img show",resIplPtr);
			//cvShowImage("ipl img show",&resIplImg);
			//cvShowImage("ipl img show",imgLoadTest);
			waitKey(1000);
			cvDestroyWindow("ipl img show");
			imgFthNameVec.push_back(imgNameExtStr);
			cout<<imgFthNameVec[disLoop]<<endl<<endl;
			resIplPtr = NULL;	
		}

 

 

 

 

 

 

 

 

C++ :

1 string.earase(size_type begin, size_type offset) :

擦出string字符串开始到偏移长度的内容; 

imgNameExtStr.erase(0, imgNameExtStr.size()) --- 删除string类型变量所有的内容.

2  cout<<*charPointer 只可以输出char*所指字符串的首字符.

posted @ 2012-04-06 08:23  gaoxw0511  阅读(2000)  评论(0编辑  收藏  举报