【Opencv】【OpenCV实践】【OpenCV的使用学习记录】

【Opencv】【OpenCV实践】【OpenCV的使用学习记录】

  • 0 前言
  • 1 opencv使用说明
    • 1.1 头文件的使用
    • 1.2 CMakeLists.txt的使用
    • 1.3 代码的使用
      • 1.3.1 定义图像格式
      • 1.3.2 读取指定路径下的图像|并判断是否读取
      • 1.3.3 图像的高、宽、通道数
      • 1.3.4 显示图像
      • 1.3.5 判断图像类型
      • 1.3.6 遍历图像的一种方式
      • 1.3.7 图像复制的两种方式
        • 1.3.7.1 直接=赋值
        • 1.3.7.2 使用clone赋值
      • 1.3.8 关闭所有图像窗口
    • 1.4 而外的功能代码
      • 1.4.1 随机数产生
        • 1.4.1.1 生成高斯随机数gaussion(double sigmma)

0 前言

  • 全文代码参考【slam十四讲第二版】【课本例题代码向】【第五讲~相机与图像】【opencv3.4.1安装】【OpenCV、图像去畸变、双目和RGB-D、遍历图像像素14种】的3 OpenCV基本使用方法

1 opencv使用说明

1.1 头文件的使用

#include 
#include 

1.2 CMakeLists.txt的使用

find_package( OpenCV 3 REQUIRED )

include_directories(${OpenCV_INCLUDE_DIR})#或者  include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(xxx src/xxx.cpp)

target_link_libraries( xxx ${OpenCV_LIBS} )
#或者
#target_link_libraries(xxx ${OpenCV_LIBRARIES})

1.3 代码的使用

1.3.1 定义图像格式

    // 读取argv[1]指定的图像
    cv::Mat image;

1.3.2 读取指定路径下的图像|并判断是否读取

    //image = cv::imread(argv[1]); //cv::imread函数读取指定路径下的图像
    image = cv::imread("./src/ubuntu.png");
    // 判断图像文件是否正确读取
    if (image.data == nullptr) { //数据不存在,可能是文件不存在
        cerr << "文件" << argv[1] << "不存在." << endl;
        return 0;
    }

1.3.3 图像的高、宽、通道数

    // 文件顺利读取, 首先输出一些基本信息
    cout << "图像宽为" << image.cols << ",高为" << image.rows << ",通道数为" << image.channels() << endl;

输出:

图像宽为1200,高为674,通道数为3

1.3.4 显示图像

    cv::imshow("image", image);      // 用cv::imshow显示图像
    cv::waitKey(0);                  // 暂停程序,等待一个按键输入

1.3.5 判断图像类型

    // 判断image的类型
    if (image.type() != CV_8UC1 && image.type() != CV_8UC3) {
        // 图像类型不符合要求
        cout << "请输入一张彩色图或灰度图." << endl;
        return 0;
    }

1.3.6 遍历图像的一种方式

    // 遍历图像, 请注意以下遍历方式亦可使用于随机像素访问
    // 使用 std::chrono 来给算法计时
    chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
    for (size_t y = 0; y < image.rows; y++) {
        // 用cv::Mat::ptr获得图像的行指针
        unsigned char *row_ptr = image.ptr<unsigned char>(y);  // row_ptr是第y行的头指针
        for (size_t x = 0; x < image.cols; x++) {
            // 访问位于 x,y 处的像素
            unsigned char *data_ptr = &row_ptr[x * image.channels()]; // data_ptr 指向待访问的像素数据
            // 输出该像素的每个通道,如果是灰度图就只有一个通道
            for (int c = 0; c != image.channels(); c++) {
                unsigned char data = data_ptr[c]; // data为I(x,y)第c个通道的值
            }
        }
    }
    chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
    chrono::duration<double> time_used = chrono::duration_cast < chrono::duration < double >> (t2 - t1);
    cout << "遍历图像用时:" << time_used.count() << " 秒。" << endl;

输出:

遍历图像用时:0.00867939 秒。

1.3.7 图像复制的两种方式

1.3.7.1 直接=赋值

  • 这种方式修改 image_another 会导致 image 发生变化
  • 这种方式类似于创建快捷方式
    // 关于 cv::Mat 的拷贝
    // 直接赋值并不会拷贝数据
    cv::Mat image_another = image;
    // 修改 image_another 会导致 image 发生变化
    image_another(cv::Rect(0, 0, 100, 100)).setTo(0); // 将左上角100*100的块置零
    cv::imshow("image", image);
    cv::imshow("image_another", image_another);
    cv::waitKey(0);

1.3.7.2 使用clone赋值

  • 这种方式类似于拷贝
    // 使用clone函数来拷贝数据
    cv::Mat image_clone = image.clone();
    image_clone(cv::Rect(0, 0, 100, 100)).setTo(255);
    cv::imshow("image", image);
    cv::imshow("image_clone", image_clone);
    cv::waitKey(0);

1.3.8 关闭所有图像窗口

    cv::destroyAllWindows();

1.4 而外的功能代码

1.4.1 随机数产生

  • 定义随机数产生器
    cv::RNG rng; // OpenCV随机数产生器   OpenCV random number generator

1.4.1.1 生成高斯随机数gaussion(double sigmma)

  • 如果要产生均值为λ,标准差为σ的随机数,可以λ+ RNG::gaussian( σ)
double x;
x = exp(λ) + rng.gaussian(σ)

你可能感兴趣的