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*所指字符串的首字符.