在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 #include #include 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(srpmain.cpp)find_package(OpenCV 4 REQUIRED)find_package(ZBar REQUIRED)target_include_directories(srpPUBLIC${OpenCV_INCLUDE_DIRS}${ZBar_INCLUDE_DIRS}"include")target_link_libraries(srpPUBLIC${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 hasasked CMake to find a package configuration file provided by "ZBar", butCMake did not find one.Could not find a package configuration file provided by "ZBar" with any ofthe following names:ZBarConfig.cmakezbar-config.cmakeAdd 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 beeninstalled.-- 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(srpmain.cpp
    )set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")find_package(OpenCV 4 REQUIRED)find_package(ZBar REQUIRED)target_include_directories(srpPUBLIC${OpenCV_INCLUDE_DIRS}${ZBar_INCLUDE_DIRS}"include"
    )target_link_libraries(srpPUBLIC${OpenCV_LIBS} ${ZBAR_LIBRARIES}
    )
    
  1. 应该要成功编译了
  • 进入build目录,最好先删干净原来产生的中间文件,然后输入 cmake ..,接着输入 make,应该是不会报错的,生成的可执行文件为srp,输入 ./srp运行它:5.png
  • 注意如果读不到图片可以将图片路径换为绝对路径

写在后面

  • 后续会持续更新该srp的项目代码


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部