Linux中使用Cmake编译工程
Linux中使用Cmake编译工程:
1. 创建工程目录
在/home下面创建了一个工程文件夹,在文件夹中创建三个目录 images、out、src 分别用来存放 需要处理和保存的图像,编译输出的可执行文件,
工程源码。
进入src目录中,创建两个目录 include、source,和CMakeLists.txt 文件。其中source用来存放程序的源文件,include用于存放头文件。
整个工程的目录结构如下:
2 编写及编译代码
使用VScode打开opencv文件夹
在source目录中创建 main.cpp 文件 ColChange.cpp 文件,在include目录中创建 ColChange.h文件。个文件的源码如下:
main.cpp
1 #include <stdio.h> 2 #include <opencv2/opencv.hpp> 3 #include "ColChange.h" 4 5 //using namespace cv; 6 using namespace std; 7 8 9 int main(int argc, char** argv ) 10 { 11 //读取图片,将图片存为Mat类的image实例中 12 Mat image = imread("../images/123.jpg"); 13 14 if(image.empty()){ 15 printf("could not load image...\n"); 16 return -1; 17 } 18 //实例化一个QuickDemo 19 QuickDemo qd; 20 21 //qd.colorSpace_Demo(image); 22 //qd.mat_creat_demo(image); 23 qd.pixel_visit_demo(image); 24 25 //创建窗口SSJ 26 //cv::namedWindow("SSJ",WINDOW_FREERATIO); 27 28 //在SSJ窗口上,显示图片 29 //cv::imshow("SSJ", image); 30 //显示状态阻塞 31 cv::waitKey(0); 32 33 return 0; 34 }
ColChange.cpp
1 #include "ColChange.h" 2 3 /* 4 * Author:SSJ-xiaoguoke 5 * Funtion:转换图像的色彩空间,transform the color space of the image 6 */ 7 void QuickDemo::colorSpace_Demo(Mat &image) 8 { 9 Mat gray,hsv; 10 11 cvtColor(image,hsv,COLOR_BGR2HSV); 12 cvtColor(image, gray,COLOR_BGR2GRAY); 13 14 imshow("HSV",hsv); 15 imshow("huidu",gray); 16 17 imwrite("../images/hsv.jpg",hsv); 18 imwrite("../images/gray.jpg",gray); 19 20 } 21 22 /* 23 * Author:SSJ-xiaoguoke 24 * Funtion:创建Mat对象,Creating an image object 25 */ 26 void QuickDemo::mat_creat_demo(Mat &image) 27 { 28 Mat m1,m2; 29 30 m1 = image.clone(); 31 image.copyTo(m2); 32 33 /* 34 * Size(8,8):创建的矩阵尺寸为 8*8 35 * CV_8UC1:8位 U:无符号unsigned C:char型 1:单通道 36 */ 37 //Mat m3 = Mat::zeros(Size(8,8),CV_8UC1); 38 /*三通道*/ 39 Mat m3 = Mat::zeros(Size(500,500),CV_8UC3); 40 /*创建一个值全是1的矩阵*/ 41 //Mat m3 = Mat::ones(Size(8,8),CV_8UC1); 42 43 m3 = Scalar(0,0,255); 44 //std::cout << m3 << std::endl; 45 46 imshow("red",m3); 47 48 } 49 50 /* 51 * Author:SSJ-xiaoguoke 52 * Funtion:像素操作,Pixel operations 53 */ 54 void QuickDemo::pixel_visit_demo(Mat &image) 55 { 56 int W = image.cols; 57 int h = image.rows; 58 int dims = image.channels(); 59 60 /*for(int row=0; row < h; row++){ 61 for(int col=0; col<W; col++){ 62 if(dims==1){ 63 64 int pv = image.at<uchar>(row,col); 65 image.at<uchar>(row,col) = 255 - pv; 66 67 } 68 if(dims==3){ 69 70 Vec3b bgr = image.at<Vec3b>(row,col); 71 image.at<Vec3b>(row,col)[0] = 255 - bgr[0]; 72 image.at<Vec3b>(row,col)[1] = 255 - bgr[1]; 73 image.at<Vec3b>(row,col)[2] = 255 - bgr[2]; 74 75 } 76 } 77 }*/ 78 /*通过指针的方法实现*/ 79 for(int row=0;row < h; row++){ 80 81 uchar* current_row = image.ptr<uchar>(row); 82 83 for(int col=0;col < W;col++){ 84 if(dims==1){ 85 int pv = *current_row; 86 *current_row++ = 255-pv; 87 88 } 89 if(dims==3){ 90 *current_row++ = 255 - *current_row; 91 *current_row++ = 255 - *current_row; 92 *current_row++ = 255 - *current_row; 93 } 94 } 95 } 96 97 imshow("Pixel operations",image); 98 99 }
ColChange.h
1 #include <opencv2/opencv.hpp> 2 3 using namespace cv; 4 using namespace std; 5 6 class QuickDemo { 7 public: 8 void colorSpace_Demo(Mat &image); 9 10 void mat_creat_demo(Mat &image); 11 12 void pixel_visit_demo(Mat &image); 13 14 };
CMakeLists.txt
1 #可执行文件名 2 project(test) 3 #设置可执行程序的输出路径 4 set(EXECUTABLE_OUTPUT_PATH ../out/) 5 #设置源码路径 6 set(SOURCES 7 ./source/main.cpp 8 ./source/ColChange.cpp 9 ) 10 #添加头文件搜索路径 11 include_directories(./include) 12 #查找包 13 find_package(OpenCV 3 REQUIRED ) 14 #添加编译的可执行文件 15 add_executable(test ${SOURCES}) 16 #链接可执行文件 17 target_link_libraries(test ${OpenCV_LIBS})
代码编写完成之后,进入src目录中,执行指令编译工程
1 cmake ./ 2 make
编译完成之后会在out目录下输出一个叫 test的可执行文件。在image下面放一张图片 改名为123.jpg(可以修改代码来修改加载的图片名字)
进入out目录
./test