• 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 关闭所有图像窗口

    0 前言 1 opencv使用说明 1.1 头文件的使用

    1. #include
    2. #include

    1.2 CMakeLists.txt的使用

    1. find_package( OpenCV 3 REQUIRED )
    2. include_directories(${
    3. OpenCV_INCLUDE_DIR})
    4. add_executable(xxx src/xxx.cpp)
    5. target_link_libraries( xxx ${
    6. OpenCV_LIBS} )

    1.3 代码的使用 1.3.1 定义图像格式

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

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

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

    1.3.3 图像的高、宽、通道数

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

    输出:

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

    1.3.4 显示图像

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

    1.3.5 判断图像类型

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

    1.3.6 遍历图像的一种方式

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

    输出:

    遍历图像用时:0.00867939 秒。
    

    1.3.7 图像复制的两种方式 1.3.7.1 直接=赋值 这种方式修改 image_another 会导致 image 发生变化这种方式类似于创建快捷方式

    1. // 关于 cv::Mat 的拷贝
    2. // 直接赋值并不会拷贝数据
    3. cv::Mat image_another = image;
    4. // 修改 image_another 会导致 image 发生变化
    5. image_another(cv::Rect(0, 0, 100, 100)).setTo(0); // 将左上角100*100的块置零
    6. cv::imshow("image", image);
    7. cv::imshow("image_another", image_another);
    8. cv::waitKey(0);

    1.3.7.2 使用clone赋值 这种方式类似于拷贝

    1. // 使用clone函数来拷贝数据
    2. cv::Mat image_clone = image.clone();
    3. image_clone(cv::Rect(0, 0, 100, 100)).setTo(255);
    4. cv::imshow("image", image);
    5. cv::imshow("image_clone", image_clone);
    6. cv::waitKey(0);

    1.3.8 关闭所有图像窗口

        cv::destroyAllWindows();
  • 相关阅读:
    第四天:java基础复习(集合)
    并发中级(第一篇)
    ts类型声明declare
    网络安全面试、实习、校招经验打包分享
    NeRF神经网络介绍
    C++&QT day11
    #gStore-weekly | SPARQL 执行过程中高级查询函数的求值(上)
    pycharm的常用快捷键
    Java IO中其它字节流简介说明
    基础二:Java进阶
  • 原文地址:https://blog.csdn.net/weixin_72426331/article/details/128181992