2、opencv工程创建及cmake编译

文章目录

    • 1 创建工程目录
    • 2 编写及编译代码
    • 3 用到的opencv知识
      • 3.1 图像的读取、显示、保存
      • 3.2 色彩空间的转换、图像创建
      • 3.2 像素操作
    • 4 C++ 模板函数 模板类的使用
      • 4.1 单独的模板函数
      • 4.2 类中的模板函数
      • 4.3 模板类中函数

上一篇文章( 1 超详细的ubuntu安装opencv)讲述了ubuntu18.4安装opencv的步奏,接下来就可以基于安装好的opencv库开发项目了。本文的代码已经上传到我的github仓库,可以通过切换tag来查看不同版本的代码。

1 创建工程目录

在/home下面创建了一个叫opencv的文件夹,在文件夹中创建三个目录 images、out、src 分别用来存放 需要处理和保存的图像,编译输出的可执行文件,工程源码。
2、opencv工程创建及cmake编译_第1张图片

进入src目录中,创建两个目录 include、source,和CMakeLists.txt 文件。其中source用来存放程序的源文件,include用于存放头文件。
2、opencv工程创建及cmake编译_第2张图片

整个工程的目录结构如下:
2、opencv工程创建及cmake编译_第3张图片

2 编写及编译代码

使用VScode打开opencv文件夹
在source目录中创建 main.cpp 文件 ColChange.cpp 文件,在include目录中创建 ColChange.h文件。个文件的源码如下:

main.cpp

#include 
#include 
#include "ColChange.h"

//using namespace cv;
using namespace std;


int main(int argc, char** argv )
{
  //读取图片,将图片存为Mat类的image实例中
  Mat image = imread("../images/123.jpg");

  if(image.empty()){
    printf("could not load image...\n");
    return -1;
  }
  //实例化一个QuickDemo
  QuickDemo qd;

  //qd.colorSpace_Demo(image);
  //qd.mat_creat_demo(image);
  qd.pixel_visit_demo(image);

  //创建窗口SSJ
  //cv::namedWindow("SSJ",WINDOW_FREERATIO);

  //在SSJ窗口上,显示图片
  //cv::imshow("SSJ", image);
  //显示状态阻塞
  cv::waitKey(0);

  return 0;
}

ColChange.cpp

#include "ColChange.h"

/*
 * Author:SSJ-xiaoguoke
 * Funtion:转换图像的色彩空间,transform the color space of the image
 */
void QuickDemo::colorSpace_Demo(Mat &image)
{
  Mat gray,hsv;
 
  cvtColor(image,hsv,COLOR_BGR2HSV);
  cvtColor(image, gray,COLOR_BGR2GRAY);

  imshow("HSV",hsv);
  imshow("huidu",gray);

  imwrite("../images/hsv.jpg",hsv);
  imwrite("../images/gray.jpg",gray);

}

/*
 * Author:SSJ-xiaoguoke
 * Funtion:创建Mat对象,Creating an image object
 */
void QuickDemo::mat_creat_demo(Mat &image)
{
    Mat m1,m2;

    m1 = image.clone();
    image.copyTo(m2);

/*
 * Size(8,8):创建的矩阵尺寸为 8*8
 * CV_8UC1:8位 U:无符号unsigned C:char型 1:单通道
 */
    //Mat m3 = Mat::zeros(Size(8,8),CV_8UC1);
    /*三通道*/
    Mat m3 = Mat::zeros(Size(500,500),CV_8UC3);
    /*创建一个值全是1的矩阵*/
    //Mat m3 = Mat::ones(Size(8,8),CV_8UC1);

    m3 = Scalar(0,0,255);
    //std::cout << m3 << std::endl;

    imshow("red",m3);

}

/*
 * Author:SSJ-xiaoguoke
 * Funtion:像素操作,Pixel operations
 */
void QuickDemo::pixel_visit_demo(Mat &image)
{
    int W = image.cols;
    int h = image.rows;
    int dims = image.channels();

    /*for(int row=0; row < h; row++){
        for(int col=0; col(row,col);
                image.at(row,col) = 255 - pv;

            }
            if(dims==3){

                Vec3b bgr = image.at(row,col);
                image.at(row,col)[0] = 255 - bgr[0];
                image.at(row,col)[1] = 255 - bgr[1];
                image.at(row,col)[2] = 255 - bgr[2];

            }
        }
    }*/
    /*通过指针的方法实现*/
    for(int row=0;row < h; row++){

        uchar* current_row = image.ptr(row);

        for(int col=0;col < W;col++){
            if(dims==1){
                int pv = *current_row;
                *current_row++ = 255-pv;

            }
            if(dims==3){
                *current_row++ = 255 - *current_row;
                *current_row++ = 255 - *current_row;
                *current_row++ = 255 - *current_row;
            }
        }
    }

    imshow("Pixel operations",image);

}

ColChange.h

#include 

using namespace cv;
using namespace std;

class QuickDemo {
    public:
        void colorSpace_Demo(Mat &image);

        void mat_creat_demo(Mat &image);

        void pixel_visit_demo(Mat &image);

};

CMakeLists.txt

#可执行文件名
project(test)
#设置可执行程序的输出路径
set(EXECUTABLE_OUTPUT_PATH ../out/)
#设置源码路径
set(SOURCES
    ./source/main.cpp
    ./source/ColChange.cpp     
)
#添加头文件搜索路径
include_directories(./include)
#查找包
find_package(OpenCV 3 REQUIRED )
#添加编译的可执行文件
add_executable(test ${SOURCES})
#链接可执行文件
target_link_libraries(test ${OpenCV_LIBS})

代码编写完成之后,进入src目录中,执行指令编译工程

cmake ./
make

编译完成之后会在out目录下输出一个叫 test的可执行文件。在image下面放一张图片 改名为123.jpg(可以修改代码来修改加载的图片名字)
进入out目录

./test

2、opencv工程创建及cmake编译_第4张图片
这里显示的结果是我对图像进行像素值取反的结果。

3 用到的opencv知识

3.1 图像的读取、显示、保存

cv::imread("../images/123.jpg");

cv::imshow("窗口名字",mat);

/*par1:保存的路径
*par2: 要保存的Mat对象
*/
cv::imwrite("../images/tom.jpg",tom);

3.2 色彩空间的转换、图像创建

/*将image的色彩空间装换成HSV,并将转换后的图像存在tom中*/
cvtColor(image, tom,COLOR_BGR2HSV);

图像的克隆,复制 以及 赋值操作。克隆和复制创建了新的数据,赋值与被赋值者公用同一段data,修改其中一个另一个也会改变。

Mat m1,m2,m3;
m1 = image.clone();
image.copyTo(m2);
m3 = image;

创建Mat对象,以及赋值

/*
 * Size(8,8):创建的矩阵尺寸为 8*8
 * CV_8UC1:8位 U:无符号unsigned C:char型 1:单通道
 */
Mat m3 = Mat::zeros(Size(500,500),CV_8UC3);
m3 = Scalar(0,0,255); //bgr, red通道拉满 其他通道为0 所以是一个纯红图片

3.2 像素操作

/*坐标法*/
int pv = image.at(row,col);
image.at(row,col) = 255 - pv;

/*指针法*/
uchar* current_row = image.ptr(row);
for(int col=0;col < W;col++){
 if(dims==1){
        int pv = *current_row;
       *current_row++ = 255-pv;

 }
if(dims==3){
        *current_row++ = 255 - *current_row;
        *current_row++ = 255 - *current_row;
        *current_row++ = 255 - *current_row;
}

4 C++ 模板函数 模板类的使用

4.1 单独的模板函数

/*模板函数声明*/
template void ColorSpace_Demo(Mat &image,T cs);
/*模板函数定义*/
template 
void ColorSpace_Demo(Mat &image, T cs)
{
  Mat tom;
  
  cvtColor(image, tom,cs);
  
  imshow("Tom",tom);

  imwrite("../images/tom.jpg",tom);
}
/模板函数的使用/
ColorSpace_Demo(image,40);

4.2 类中的模板函数

/*类中模板函数的声明*/
class QuickDemo {
    public:
        template void ColorSpace_Demo(Mat &image,T cs);
           
        void mat_creat_demo(Mat &image);
};
/*类中模板函数的定义*/
template void QuickDemo::ColorSpace_Demo(Mat &image, T cs)
{
	Mat tom;
	cvtColor(image, tom,cs);
	imshow("Tom",tom);
	
	imwrite("../images/tom.jpg",tom);
}
**/*类中模板函数的使用*/**
QuickDemo qd;
qd.ColorSpace_Demo(image,40);

4.3 模板类中函数

/*模板类函数的声明*/
template
class QuickDemo {
    public:
        void ColorSpace_Demo(Mat &image,T cs);
};
/*模板类函数的定义*/
template 
void QuickDemo::ColorSpace_Demo(Mat &image, T cs)
{
  Mat tom;
  cvtColor(image, tom,cs);
  
  imshow("Tom",tom);

  imwrite("../images/tom.jpg",tom);
}

/*模板类函数的使用*/
QuickDemo qd;
qd.ColorSpace_Demo(image,40);

你可能感兴趣的:(opencv学习笔记,opencv,计算机视觉,人工智能)