在Ubuntu中使用OpenCV-C++和ZBar库

在Ubuntu中使用OpenCV-C++和ZBar库

写在前面

  • 学校srp的内容是做一个快递站的货物放置小车,笔者负责其中的视觉部分,暂定我的任务是识别二维码告诉下位机货物的货架号,本可以使用openmv等实现,但考虑到后续可能会有的视觉引导机械臂放置货物,故还是选择OpenCV这一更加灵活的视觉库,并使用C++编写,以期望最后在树莓派上获得更高的帧率.
  • 笔者使用的是Ubuntu20.04,OpenCV是在装ROS时一起安装的,版本为4.2.

步骤

  1. 安装ZBar库,这里使用apt安装而不是用源码
  •   sudo apt install libzbar-dev
    
  • 安装后再在vscode中包含ZBar的头文件就已经不会再报错了
    1.png
  1. 写测试程序
  • 写一个测试程序,实现读取一张二维码图片,识别其中码的类型并读取码的内容打印到终端我是二维码图片
  •   #include <iostream>
      #include <opencv2/opencv.hpp>
      #include <zbar.h>
    
      using namespace cv;
      using namespace std;
      using namespace zbar;
    
      int main()
      {
          ImageScanner scanner;
          scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
          Mat image = imread("1.png");
    
          if (!image.data)
          {
              cout << "请确认图片" << endl;
              system("pause");
              return 0;
          }
    
          Mat gray;
          cvtColor(image, gray, COLOR_RGB2GRAY);
          
          Image imageZbar(gray.cols, gray.rows, "Y800", gray.data, gray.cols * gray.rows);
          int n=scanner.scan(imageZbar);
    
          Image::SymbolIterator symbol = imageZbar.symbol_begin();
          if (imageZbar.symbol_begin() == imageZbar.symbol_end())
          {
              cout << "查询条码失败,请检查图片!" << endl;
          }
          for (; symbol != imageZbar.symbol_end(); ++symbol)
          {
              cout << "类型:" << endl << symbol->get_type_name() << endl;
              cout << "内容:" << endl << symbol->get_data() << endl << endl;
          }
    
          imshow("Source Image", image);
          waitKey();
          return 0;
      }
    
  1. 写CMakeLists.txt
  •   cmake_minimum_required(VERSION 3.10)
    
      project(srp CXX)
    
      add_executable(srp
          main.cpp
      )
    
      find_package(OpenCV 4 REQUIRED)
    
      find_package(ZBar REQUIRED)
    
      target_include_directories(srp
          PUBLIC
              ${OpenCV_INCLUDE_DIRS}
              ${ZBar_INCLUDE_DIRS}
              "include"
      )
    
      target_link_libraries(srp
          PUBLIC
              ${OpenCV_LIBS} 
              ${ZBAR_LIBRARIES}
      )
    
  • 顺便提一嘴这个小工程的结构为:3.png
  • 然后在终端进入build目录,执行cmake ..,不出意外应该会报错:
    -- The CXX compiler identification is GNU 9.4.0
    -- Check for working CXX compiler: /usr/bin/c++
    -- Check for working CXX compiler: /usr/bin/c++ -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Detecting CXX compile features
    -- Detecting CXX compile features - done
    -- Found OpenCV: /usr (found suitable version "4.2.0", minimum required is "4") 
    CMake Error at CMakeLists.txt:13 (find_package):
    By not providing "FindZBar.cmake" in CMAKE_MODULE_PATH this project has
    asked CMake to find a package configuration file provided by "ZBar", but
    CMake did not find one.

    Could not find a package configuration file provided by "ZBar" with any of
    the following names:

        ZBarConfig.cmake
        zbar-config.cmake

    Add the installation prefix of "ZBar" to CMAKE_PREFIX_PATH or set
    "ZBar_DIR" to a directory containing one of the above files.  If "ZBar"
    provides a separate development package or SDK, be sure it has been
    installed.


    -- Configuring incomplete, errors occurred!
    See also "/home/thy/Documents/blogtest/build/CMakeFiles/CMakeOutput.log".
  • 报错说找不到 ZBarConfig.cmakezbar-config.cmake,我们先确定一下这两个文件是否确实不存在.在终端中输入 dpkg-query -L libzbar-dev列出已安装的 libzbar-dev 包中的文件路径,我的输出如下,可以看到确实没有那两个文件
    /.
    /usr
    /usr/include
    /usr/include/zbar
    /usr/include/zbar/Decoder.h
    /usr/include/zbar/Exception.h
    /usr/include/zbar/Image.h
    /usr/include/zbar/ImageScanner.h
    /usr/include/zbar/Processor.h
    /usr/include/zbar/Scanner.h
    /usr/include/zbar/Symbol.h
    /usr/include/zbar/Video.h
    /usr/include/zbar/Window.h
    /usr/include/zbar.h
    /usr/lib
    /usr/lib/x86_64-linux-gnu
    /usr/lib/x86_64-linux-gnu/libzbar.a
    /usr/lib/x86_64-linux-gnu/pkgconfig
    /usr/lib/x86_64-linux-gnu/pkgconfig/zbar.pc
    /usr/share
    /usr/share/doc
    /usr/share/doc/libzbar-dev
    /usr/share/doc/libzbar-dev/copyright
    /usr/lib/x86_64-linux-gnu/libzbar.so
    /usr/share/doc/libzbar-dev/changelog.Debian.gz
    
  • 笔者首先想到的是ZBar库是否正确安装,在终端输入 pkg-config --libs zbar,输出为 -lzbar,库已正确安装.故可能的原因是不同包管理系统提供的文件结构不同,只能手动创建一个 FindZBar.cmake文件.
  1. 写FindZBar.cmake
  • 在工程中新建一个cmake目录,在其中新建FindZBar.cmake文件
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(ZBAR REQUIRED IMPORTED_TARGET zbar)
    
    if (TARGET PkgConfig::ZBAR)
    set(ZBAR_FOUND TRUE)
    else()
    set(ZBAR_FOUND FALSE)
    endif()
    
    set(ZBAR_INCLUDE_DIRS ${PkgConfig_ZBAR_INCLUDE_DIRS})
    set(ZBAR_LIBRARIES PkgConfig::ZBAR)
    
    include_directories(${ZBAR_INCLUDE_DIRS})
    
    target_link_libraries(${ZBAR_LIBRARIES} INTERFACE ${ZBAR_LINK_LIBRARIES})
    
  • 此外在CMakeLists.txt中加一句话 set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake"),最后的CMakeLists.txt为:
    cmake_minimum_required(VERSION 3.10)
    
    project(srp CXX)
    
    add_executable(srp
        main.cpp
    )
    
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
    
    find_package(OpenCV 4 REQUIRED)
    
    find_package(ZBar REQUIRED)
    
    target_include_directories(srp
        PUBLIC
            ${OpenCV_INCLUDE_DIRS}
            ${ZBar_INCLUDE_DIRS}
            "include"
    )
    
    target_link_libraries(srp
        PUBLIC
            ${OpenCV_LIBS} 
            ${ZBAR_LIBRARIES}
    )
    
  1. 应该要成功编译了
  • 进入build目录,最好先删干净原来产生的中间文件,然后输入 cmake ..,接着输入 make,应该是不会报错的,生成的可执行文件为srp,输入 ./srp运行它:5.png
  • 注意如果读不到图片可以将图片路径换为绝对路径

写在后面

  • 后续会持续更新该srp的项目代码
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值