sprintf函数功能

  • 把格式化的数据写入某个字符串缓冲区。

1.头文件
stdio.h

2.原型

int sprintf( char *buffer, const char *format, [ argument] … );

参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
返回值:字符串长度(strlen)

如何批量的读取图片

  • 下面程序实现了批量的读取照片并进行处理,方法值得学习。
int main()
{
        Mat img,image;
        for (int l = 1; l < 27; l++)
    {
        string filename;
        char buf[50];
        sprintf(buf,"..\\jaffe\\happy\\%d.tiff",l);
        //字符串格式化命令,主要功能是把格式化的数据写入某个字符串中
        //留意此处如何批量的打开文件
        cout<<l<<" is processing"<<endl;
        filename=buf;
        img= imread(filename);
        std::vector<Rect> eyes,faces;
        faces=detectFaces(img);
        waitKey(1000); // 为了查看图像,我自己加的,2016 1 6
    }
}

rng.fill()函数:随机对矩阵进行填充

void RNG::fill(InputOutputArray mat, int distType, InputArray a, InputArray b, bool saturateRange=false )   
参数含义:
    mat:填充的矩阵。
    distType:填充数据类型   1、RNG::UNIFORM(均匀分布)    2、RNG::NORMAL(正太分布)
    a: 对于RNG::UNIFORM ,a是填充范围的下边界(包含a本身)
       对于RNG::NORMAL,a是范围的均值
    b: 对于RNG::UNIFORM ,b是填充范围的上边界(不包含b本身)
       对于RNG::NORMAL,b是范围的标准差
    saturateRange:不做具体介绍,主要意思好像是对范围(a,b)处理,详细可以查看教程文档‘OpenCV2refman.pdf’

saturate_cast()函数:防止数据溢出

其实就是为了防止像素值在[0 255]的范围以外:
如下例
if(data<0)  
    data=0;  
else if(data>255)  
    data=255;

Matx:(类) Template class for small matrices whose type and size are known at compilation time:

用于定义一个小的已知类型和尺寸的矩阵:
typedef Matx<float, 1, 2> Matx12f;
typedef Matx<double, 1, 2> Matx12d;
...
typedef Matx<float, 1, 6> Matx16f;
typedef Matx<double, 1, 6> Matx16d;
typedef Matx<float, 2, 1> Matx21f;
typedef Matx<double, 2, 1> Matx21d;
...
typedef Matx<float, 6, 1> Matx61f;
typedef Matx<double, 6, 1> Matx61d;
typedef Matx<float, 2, 2> Matx22f;
typedef Matx<double, 2, 2> Matx22d;
...
typedef Matx<float, 6, 6> Matx66f;
typedef Matx<double, 6, 6> Matx66d

如下例子:定义了一个3*3的浮点型矩阵。

Matx33f m(1, 2, 3,
4, 5, 6,
7, 8, 9)

Vec:Template class for short numerical vectors, a partial case of Matx:

typedef  Vec<uchar, 2> Vec2b;
typedef  Vec<uchar, 3> Vec3b;
typedef  Vec<uchar, 4> Vec4b;
typedef  Vec<short, 2> Vec2s;
typedef  Vec<short, 3> Vec3s;
typedef  Vec<short, 4> Vec4s;
Vec3f表示的是3通道float类型的 Vect,就相当于3通道float类型的图像(这是其中一个具体化),解释可以从源代码中看出来。
下面给出一个具体的例子:
Vec3f point = Vec3f(10,10,3.2);//Float, 3 components
Mat mat(3,3,CV_32FC3,);//3 channel matrix
Vec3f v3f = mat.at<Vec3f>(y, x);//read color values for pixel (y,x)
这里注释一下:Vec3f是一种数据类型,其是3通道的float,后面的mat.at<Vec3f>(y, x)是访问图像的一种方式。(可以从定义形式上看出来 int a=....)
对于mat的理解,可以认为mat.at<Vec3f>是mat的一种访问形式,其有点类似vector。

Point :定义2D点的类

例子:
Point pt;
pt.x = 10;
pt.y = 8;
or
Point pt = Point(10, 8);
同理还有其他的类模板的类:
typedef Point_<int> Point2i;
typedef Point2i Point;
typedef Point_<float> Point2f;
typedef Point_<double> Point2d;

Scalar:Represents a 4-element vector. The type Scalar is widely used in OpenCV for passing pixel values.

类:表示一个含有四个元素的向量,经常用来传递像素值。

(函数)void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)

参数介绍:
img:    图像.
pt1:    矩形的一个顶点。
pt2:    矩形对角线上的另一个顶点
color:  线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
thickness:  组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
line_type:  线条的类型。见cvLine的描述
shift:  坐标点的小数点位数。

函数rowRange和colRange

取出矩阵的某些行或者列。
如下例子:
Mat img;
img.colRange(int x ,int y)或者img.rowRange(int x ,int y)
意思是取出来img的(x y]范围内的列、行。注意只能取到右边界,左边界取不到的。

几种矩阵的操作方式

如果要开辟新的矩阵用函数: Mat F = A.clone();或者 Mat G; A.copyTo(G);此时,对F和G的修改不会对原来的矩阵A产生影响的。而其他方法,如下面:对ABC任何一个更改,都会影响到另外两个的,注意
Mat A, C; // creates just the header parts   
A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // here we’ll know the method used     (allocate matrix) 
Mat B(A); // Use the copy constructor   4. C = A; // Assignment operator

at 操作取矩阵值

试了好多次数,终于摸到一下at的用法,例子如下。
Mat trainData=imread("D:/Opencv_tutorials_Learning/ML_Svm/SvmLearn/1.jpg",1);       
int b=trainData.at<Vec3b>(1,10)[0];//这句话可以输出坐标(1,10)位置的0通道像素值,也就是B通道值
cout<<trainData.at<Vec3b>(1,10)[0]<<endl;//此语句可以运行,但运行时候没有输出任何值,但输出了换行
cout<<trainData.at<Vec3b>(1,10)<<endl;//此语句可以输出三通道的值,例如[230 222 102].

3/23/2016 9:35:41 AM

C++ 运算符%的使用

两种意思:
1、格式化字符串输出
    目前printf支持以下格式的输出,例如:
    printf("%c",a);输出单个字符。
    printf("%d",a);输出十进制整数。
    printf("%f",a);输出十进制浮点数.
    printf("%o",a);输出八进制数。
    printf("%s",a);输出字符串。
    printf("%u",a);输出无符号十进制数。
    printf("%x",a);输出十六进制数。
    printf("%%");输出百分号'%'.
2、整数取余  
    整数取余,例如:
    9%4=1;
    6%3=0;

opencv关于读写xml、TXT、doc等文件的方法:主要是用FileStorage类

详细见opencv3编程入门,毛星云编著 149页