一,g++基础
g++ –version 查看版本
1
2
3
4
5
6
7
8
9
10 1#include <iostream>
2using namespace std;
3int main()
4{
5//hahha
6cout<<"hello world"<<endl;
7return 0;
8}
9
10
直接生成可执行程序test
g++ -o test test.cpp
深入解析生成可执行程序test的过程
1.g++ -E test.cpp > test.i
这一步生成test.i进行预处理,做了宏的替换,注释的消除,可看见//hahha不见了
2.g++ -S test.cpp
这一步生成test.s,表示生成汇编指令
3.g++ -c test.cpp
这一步生成test.o,将汇编语言变成目标代码,生成目标文件,也就是二进制文件
4.g++ test.o -o test
链接目标代码生成可执行程序test
上述编译过程产生了下面的文件
Makefile可以有效的减少大工程中需要编译和链接的文件,只编译和链接那些需要修改的文件,可以说使用Makefile,整个工程都可以完全自动化编译。
利用makefile对.cpp文件进行编译链接
DisplayImage.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 1#include <iostream>
2#include <cv.h>
3#include <highgui.h>
4
5//使用cv这个命名空间
6using namespace cv;
7using namespace std;
8/*
9 *一般有两种写法:
10 *main( int argc, char* argv[])
11 *main( int argc, char** argv)
12 */
13int main( int argc, char** argv )
14{
15 //建立一个Mat类型的变量image
16 Mat image;
17 /* API中有:
18 * C++: Mat imread(const string& filename, int flags=1 )
19 * 意思是返回Mat类型数据,第一个参数接受一个string类型的引用,
20 * 第二个参数接受一个int类型的flags,一般都是1。
21 */
22 image = imread( argv[1], 1 );
23
24 //当传的参数不是一个,或者图片没有数据则提示没有图片并退出程序
25 if( argc != 2 || !image.data )
26 {
27 cout<<"没有该图片"<<endl;
28 return -1;
29 }
30
31 //C++: void namedWindow(const string& winname, int flags=CV_WINDOW_AUTOSIZE )
32 namedWindow( "显示图片", CV_WINDOW_AUTOSIZE );
33 //C++: void imshow(const string& winname, InputArray mat)
34 imshow( "显示图片", image );
35 //C++: int waitKey(int delay=0)
36 waitKey(0);
37
38 return 0;
39}
40
41
编写makefile,在这里要注意opencv库和头文件
1
2
3
4
5
6
7
8
9
10
11
12 1export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/fzh/usr/lib/pkgconfig
2
3CXXFLAGS:=$(shell pkg-config --cflags --libs opencv)
4
5DisplayIMage:DisplayImage.o
6 g++ DisplayImage.o -o DisplayImage $(CXXFLAGS)
7DisplayImage.o:DisplayImage.cpp
8 g++ -c DisplayImage.cpp -o DisplayImage.o $(CXXFLAGS)
9clean:
10 rm *o DisplayImage
11
12
执行make
./DisplayImage dog.png
利用Cmake对cmakelists.txt进行编辑,会自动生成makefile
cmake –version
安装cmake apt-get install cmake
1.编写CMakeLists.txt
1
2
3
4
5
6
7 1cmake_minimum_required(VERSION 2.8)
2project(DisplayImage)
3find_package(Opencv REQUIRED)
4add_executable(DisplayImage DisplayImage.cpp)
5target_link_libraries(DisplayImage ${OpenCV_LIBS})
6
7
cmake .
进行编译
make生成DisplayImage
./DisplayImage dog.png
**二,输出hello world **
1.g++用法
g++ -o hello hello.cpp
2.int argc, char** argv参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1#include <iostream>
2using namespace std;
3
4int main(int argc, char** argv)
5{
6 cout << "You have entered " << argc
7 << " arguments:" << "\n";
8
9 for (int i = 0; i < argc; ++i)
10 cout << argv[i] << "\n";
11
12 return 0;
13}
14
15
g++ -o main main.cpp
** 三.指针与引用**
1.指针
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 1#include <iostream>
2
3using namespace std;
4
5int main ()
6{
7 int var1=10;
8 char var2[10];
9 int *ip; // 指针变量的声明
10
11 cout << "var1 变量的地址: ";
12 cout << &var1 << endl;
13
14 cout << "var2 变量的地址: ";
15 cout << &var2 << endl;
16
17 ip = &var1; // 在指针变量中存储 var 的地址
18
19 // 输出在指针变量中存储的地址
20 cout << "Address stored in ip variable: ";
21 cout << ip << endl;
22
23 // 访问指针中地址的值
24 cout << "Value of *ip variable: ";
25 cout << *ip << endl;
26
27 cout << "Value of var variable: ";
28 cout << var1 << endl;
29
30 return 0;
31}
32
2.引用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 1#include <iostream>
2
3using namespace std;
4
5int main( )
6{
7
8 int i;
9 double d;
10
11 int& r=i;
12 double& s=d;
13 i=5;
14 cout<<"i="<<i<<endl;
15 cout<<"r="<<r<<endl;
16
17}
18
四,安装C++版的opencv
1.安装
sudo apt-get install libopencv-dev python-opencv
编译命令:
g++ -o main xxx.cpp
1 | 1` |
pkg-config –cflags –libs opencv
1 | 1` |
1 | 1` |
pkg-config –cflags –libs opencv
1 | 1` |
起到include opencv的作用
例如 g++ -o main globalmatting.cpp guidedfilter.cpp main.cpp
1 | 1` |
pkg-config –cflags –libs opencv
1 | 1` |
然后在./main 输出结果
查看当前版本
pkg-config –modversion opencv
2.利用opencv读取与显示一张图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 1#include <iostream>
2#include <cv.h>
3#include <highgui.h>
4
5//使用cv这个命名空间
6using namespace cv;
7using namespace std;
8/*
9 *一般有两种写法:
10 *main( int argc, char* argv[])
11 *main( int argc, char** argv)
12 */
13int main( int argc, char** argv )
14{
15 //建立一个Mat类型的变量image
16 Mat image;
17 /* API中有:
18 * C++: Mat imread(const string& filename, int flags=1 )
19 * 意思是返回Mat类型数据,第一个参数接受一个string类型的引用,
20 * 第二个参数接受一个int类型的flags,一般都是1。
21 */
22 image = imread( argv[1], 1 );
23
24 //当传的参数不是一个,或者图片没有数据则提示没有图片并退出程序
25 if( argc != 2 || !image.data )
26 {
27 cout<<"没有该图片"<<endl;
28 return -1;
29 }
30
31 //C++: void namedWindow(const string& winname, int flags=CV_WINDOW_AUTOSIZE )
32 namedWindow( "显示图片", CV_WINDOW_AUTOSIZE );
33 //C++: void imshow(const string& winname, InputArray mat)
34 imshow( "显示图片", image );
35 //C++: int waitKey(int delay=0)
36 waitKey(0);
37
38 return 0;
39}
40
g++ -o test test.cpp
1 | 1` |
pkg-config –cflags –libs opencv
1 | 1` |
./test input.jpg 则显示正常.
五,类
1.类的实例化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 1#include <iostream>
2
3using namespace std;
4
5class Box
6{
7 public:
8 double length; // 盒子的长度
9 double breadth; // 盒子的宽度
10 double height; // 盒子的高度
11};
12
13
14
15
16int main()
17 {
18
19 Box Box1; // 声明 Box1,类型为 Box
20 Box Box2;
21 double volumn=0.0;
22
23 Box1.length=5.0;
24 Box1.height=6.0;
25 Box1.breadth=2.0;
26
27 Box2.length=1.0;
28 Box2.height=6.0;
29 Box2.breadth=2.0;
30
31 volumn=Box1.length*Box1.height*Box1.breadth;
32 cout<<"box1 volumn="<<volumn<<endl;
33
34 volumn=Box2.length*Box2.height*Box2.breadth;
35 cout<<"box2 volumn="<<volumn<<endl;
36
37 }
38
39
2.构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 1#include <iostream>
2
3using namespace std;
4
5class Line
6{
7 public:
8 void setLength( double len );
9 double getLength( void );
10 Line(double len); // 这是构造函数
11
12 private:
13 double length;
14};
15
16
17// 成员函数定义,包括构造函数
18Line::Line( double len)
19{
20 cout << "Object is being created, length = " << len << endl;
21 length = len;
22}
23
24void Line::setLength( double len )
25{
26 length = len;
27}
28
29double Line::getLength( void )
30{
31 return length;
32}
33// 程序的主函数
34int main( )
35{
36 Line line(10.0);
37
38 // 获取默认设置的长度
39 cout << "Length of line : " << line.getLength() <<endl;
40 // 再次设置长度
41 line.setLength(6.0);
42 cout << "Length of line : " << line.getLength() <<endl;
43
44 return 0;
45}
46
3.析构函数
其是类的一种特殊的成员函数,在删除创建的对象时执行。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 1#include <iostream>
2
3using namespace std;
4
5class Line
6{
7 public:
8 void setLength( double len );
9 double getLength( void );
10 Line(double len); // 这是构造函数
11 ~Line(); // 这是析构函数声明
12
13 private:
14 double length;
15};
16
17
18// 成员函数定义,包括构造函数
19Line::Line( double len)
20{
21 cout << "Object is being created, length = " << len << endl;
22 length = len;
23}
24// 析构函数
25Line::~Line(void)
26{
27 cout << "Object is being deleted" << endl;
28}
29
30void Line::setLength( double len )
31{
32 length = len;
33}
34
35double Line::getLength( void )
36{
37 return length;
38}
39// 程序的主函数
40int main( )
41{
42 Line line(10.0);
43
44 // 获取默认设置的长度
45 cout << "Length of line : " << line.getLength() <<endl;
46 // 再次设置长度
47 line.setLength(6.0);
48 cout << "Length of line : " << line.getLength() <<endl;
49
50 return 0;
51}
52
53