PCANet的c语言代码解析

2017.5.25

任务:

解析PCANet的c语言代码;相关知识多为链接形式,点开即可看到。

目录

相关知识:

二、OpenCV的MAT

(官方说明)

三、关于using namespace

3.1    #include

3.2    using namespace std

3.3  cin和cout函数

四、细碎的函数

4.1   sprintf(filename, "%s.xml", var_name);

4.2   FileStorage fs(filename, FileStorage::WRITE);

4.3    c++ 时间类型详解(time_t和tm) 

4.4   template

4.5   Libsvm和Liblinear的使用经验谈 

4.7  const int *p与int *const p的区别

五、编程命名规范

六、读取cifar10的时候用到的知识

6.4  C++文件读写详解(ofstream,ifstream,fstream)

七、能运行的PCAfaceTry代码

八、换卷积过程中用到的函数


相关知识:

一、头文件

#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;

c++的cv::Mat统一了矩阵和图像这两个概念。在使用c++接口前,先包含相应的opencv namespace 
在使用#include语句包含相应头文件后,使用下面语句即可包含相应的opencv命名空间 
using namespace cv;

 

 

三、关于using namespace

3.1    #include<iostream>

当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

3.2    using namespace std

 

引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。

 

3.3  cin和cout函数

endl函数

 

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);

FileStorage类的数据读写操作与示例

 

4.3    c++ 时间类型详解(time_t和tm) 

Localtime 函数

 

4.4   template <class T>

C++ 模板详解(一)

 

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

关于vector

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函数,cvLoadImagecvCreateImagecvConvertScale

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 进行操作

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祥瑞Coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值