2017.5.25
任务:
解析PCANet的c语言代码;相关知识多为链接形式,点开即可看到。
目录
4.1 sprintf(filename, "%s.xml", var_name);
4.2 FileStorage fs(filename, FileStorage::WRITE);
4.7 const int *p与int *const p的区别
6.4 C++文件读写详解(ofstream,ifstream,fstream)
相关知识:
一、头文件
#include<opencv2/opencv.hpp>
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。
#include<opencv2/core/eigen.hpp>
#include<iostream>
当使用<iostream>的时候,iostream的意思是输入输出流,直接点说就是in(输入) out(输出) stream(流),取in、out的首字母与stream合成。该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
#include<fstream>
#include<stdio.h>
#include<math.h>
#include<ctime>
#include"utils.h"
#include<omp.h>
#include<sys/time.h>
#include<Eigen/Dense>
#include<Eigen/Eigenvalues>
二、OpenCV的MAT
https://docs.opencv.org/master/d6/d6d/tutorial_mat_the_basic_image_container.html
(官方说明)
using namespace cv;
三、关于using namespace
3.1 #include<iostream>
当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
3.2 using namespace std
引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。
3.3 cin和cout函数
3.4 #define SIZE 4 符号常量,可以用一个标识符来表示一个常量,称之为符号常量。其特点是编译后写在代码区,不可寻址,不可更改,属于指令的一部分。
四、细碎的函数
4.1 sprintf(filename, "%s.xml", var_name);
sprintf()函数用于将格式化的数据写入字符串,其原型为:
int sprintf(char *str, char * format [, argument, ...]);
C语言sprintf()函数:将格式化的数据写入字符串,此程序新版本会报错,多改为sprintf_s
既输出又save
4.2 FileStorage fs(filename, FileStorage::WRITE);
4.3 c++ 时间类型详解(time_t和tm)
4.4 template <class T>
4.5 Libsvm和Liblinear的使用经验谈
4.6 const int与int 的区别 const表示恒定的,使用只读,就是程序只从变量读,而不写。这样程序会把每个当成常量来处理,而不会写入或者更改。需要在声明时候对它进行初始化,因为在声明之后就不能再进行赋值。
4.7 const int *p与int *const p的区别
关于存储类,链接和内存管理,C Prime Plus书12章321页
五、编程命名规范
5.1 命名原则https://wenku.baidu.com/view/1d1ea89a866fb84ae45c8dfd.html
5.2 驼峰命名法,变量小驼峰,函数大驼峰
5.3 形式参量和实际参量:1 形式参数:就是在定义函数或过程的时候命名的参数。通俗讲就是一个记号。2 实际参数:就是在执行时,调用函数或过程时,传递给函数或过程的参数。通俗讲就是实际值。3 参数嘛,就是一个可变量,它随着使用者的不同而发生变化。举个例子,在中学的时候学过sin(x)函数,这里的x就是形式参数,当你需要求1的正弦值时,你会使用sin(1),这里的1就是实际参数。4 形参和实参间的关系:两者是在调用的时候进行结合的,通常实参会将取值传递给形参,形参去之后进行函数过程运算,然后可能将某些值经过参数或函数符号返回给调用者。
六、读取cifar10的时候用到的知识
6.1 vector<cv::Mat> &train_batch_img
6.1.1 属于using namespace std;
6.1.2用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a.同理想用向量代替三维数组也是一样,vector <int**>a;再往上面依此类推.
6.2 int file_num = train ? 5 : 1; 条件表达式
6.3 为什么头文件里面定义IMG_DATA_LENGTH为3072
http://www.cs.toronto.edu/~kriz/cifar.html
6.4 C++文件读写详解(ofstream,ifstream,fstream)
ifstream batch_file(path, ios::binary); 可以看出以二进制方式打开文件
七、能运行的PCAfaceTry代码
7.1 为什么注意到vector <int *> a为二维数组,vector <int**>a;为三维数据,维数等于指针号的个数加一
7.2 IplImage* img;
7.3 几个cv函数,cvLoadImage、cvCreateImage、cvConvertScale、
7.4 c++中的new和delete
7.5 pushback是什么意思
7.6 结构体中的箭头
指向结构体成员运算符。有点和箭头,成员用点,指针用箭头
7.7 src:source。dst:destination
7.8 c++中的指针与数组。《c primer plus》p244
数组名同时也是该数组首元素的地址。flizny==flizny[0];这个语句是正确的
八、换卷积过程中用到的函数
8.1 # pragma omp parallel 并行运算
并行运算,openMP,
8.2 copyMakeBorder函数,然后以各种外插方式自动填充图像边界。
8.3 如何对cv::Mat 进行操作