OpenCV core模块提供了基本数据结构,Mat,Point,Rect,Size,Scalar等常用的数据结构类型都是在这个模块中定义。
Scalar()表示具有4个元素的数组,在OpenCV中被大量用于传递像素值,如RGB颜色值。而RGB颜色值为三个参数,其实对于Scale函数来说,如果用不到第四个参数,则不需要写出来,若只写三个参数,OpenCV会认为我们就想表示三个参数。
Scalar类的源头为Scalar_类,而Scalar_类是Vector4x的一个变种,我们常用的Scalar其实就是Scalar_< double >类型,这也就是为什么很多函数的参数输入可以是Mat,也可以是Scalar。
Size注意如下定义就行:
typedef Size_<int> Size2i;
typedef Size2i Size;
和Point的定义有类型的定义。
Rect支持平移和缩放操作,如下:
Rect rect(0,0,100,120);
Point pt(1,2);
Size size(20,20);
//rect = rect + pt; //将矩形平移到点 1,2上去
rect = rect + size; //将矩阵的大小长宽都加上20。
颜色空间转换: cvtColor函数
Vector是Matx的一个派生类,是一个一维的Matx,跟vector很相似。在opencv源码中有如下的定义:
template<typename _Tp,int n> class Vec : public Matx<_Tp,n,1>{}
typedef Vec2> Vec2b;
显示文字的相关函数:
getTextSize,cvInitFont,PutText
作图相关额函数有:
circle,clipLine,ellipse,ellipse2Poly,line,rectangle,polylines。
fillPoly方法:
Point points[1][4];
points[0][0] = Point(0,0);
points[0][1] = Point(100,10);
points[0][2] = Point(30,60);
points[0][3] = Point(10,100);
const Point* ppt[1]={points[0]};
int npt[]={4};
fillPoly(src,ppt,npt,1,Scalar(0,0,255));
我们一般使用如下过程来写入或读取数据到XML或YAML文件中。
(1)实例化一个FileStorage类的对象,用默认带参数的构造函数完成初始化,或者用FileStorage::open()成员函数辅助初始化
(2)使用流操作符<<进行文件写入操作,或者使用>>进行文件读取操作。
(3)使用FileStorage::release()函数析构掉FileStorage类对象,同时关闭文件。
如下:
//写操作
FileStorage fs("abc.xml",FileStorage::WRITE);
//读操作
FileStorage fs("abc.xml",FileStorage::READ);
进行简单的文本和数字读写操作:
fs<<"iterationNr"<<100;//写入
int itNr;
fs["iterationNr"]>>itNr;
itNr = (int)fs["iterationNr"];
OpenCV数据结构的写入和读取:
Mat R,T;
…//ini R and T
fs<<”R”<
FileStorage fs("1.xml",FileStorage::WRITE);
fs<<"strings"<<"[";
fs<<"image1.jpg"<<"image2.jpg";
fs<<"]";
fs.release();//end write
fs.open("1.xml",FileStorage::READ);
FileNode n = fs["strings"];
if (n.type()!=FileNode::SEQ)
{
return -1;//erro occur
}
FileNodeIterator it = n.begin(),end = n.end();
for (;it!=end;it++)
{
string temp = (string)*it;
cout<//end read
如果是vector类型,直接写入就行,不需要人工加上[ ]符。
fs<<"strings";
vector<string> strings;
strings.push_back("image1.jpg");
strings.push_back("image2.jpg");
fs<
FileStorage fs2("2.xml",FileStorage::WRITE);
fs2<<"Mapping";
fs2<<"{"<<"One"<<1;
fs2<<"Two"<<2;
fs2<<"}";
fs2.release();
fs2.open("2.xml",FileStorage::READ);
FileNode n2 = fs2["Mapping"];
if (n2.type()!=FileNode::MAP)
{
return -1;//erro occur
}
int one = (int)n2["One"];
int two = (int)n2["Two"];
fs2.release();