精华内容
下载资源
问答
  • opencv二维码 识别

    2021-04-13 21:11:56
    opencv微信二维码识别
  • c++ zbar opencv 二维码识别

    千次阅读 2016-07-04 16:47:45
    c++ opencv zbar 二维码识别

    zbar的下载地址:http://zbar.sourceforge.net/download.html

    使用其中zbar->examples->scan_image.cpp的代码,可以得到识别结果。

    但是前提是你需要安装:Magick++

    参见:http://www.imagemagick.org/Magick++/

    然而这个图像处理类不是很方便,也很容易出问题,配置什么的也很麻烦。于是可以尝试使用opencv或者Cximage来配合使用。

    scan_image.cpp源代码如下:

    int main (int argc, char **argv)
    {
        if(argc < 2) return(1);
    
    #ifdef MAGICK_HOME
        // http://www.imagemagick.org/Magick++/
        //    under Windows it is necessary to initialize the ImageMagick
        //    library prior to using the Magick++ library
    	const char * path = MAGICK_HOME;
        Magick::InitializeMagick(MAGICK_HOME);
    #endif
    
        // create a reader
        ImageScanner scanner;
    
        // configure the reader
        scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
    
        // obtain image data
        Magick::Image magick(argv[1]);  // read an image file
        int width = magick.columns();   // extract dimensions(尺寸)
        int height = magick.rows();
        Magick::Blob blob;              // extract the raw data
        magick.modifyImage();
        magick.write(&blob, "GRAY", 8);
        const void *raw = blob.data();
        // wrap image data
        Image image(width, height, "Y800", raw, width * height);
        // scan the image for barcodes
        int n = scanner.scan(image);
    
        // extract results
        for(Image::SymbolIterator symbol = image.symbol_begin();
            symbol != image.symbol_end();
            ++symbol) {
            // do something useful with results
            cout << "decoded " << symbol->get_type_name()
                 << " symbol \"" << symbol->get_data() << '"' << endl;
        }
        // clean up
        image.set_data(NULL, 0);
    
        return(0);
    其中最关键的一句话是:

    Image image(width, height, "Y800", raw, width * height);
    也就是说需要将原图片加载进来然后构造一个Image类的实例,然后再去识别。

    改用Cximage加载的代码变成如下:

    /将图像灰度化
    //xImage是已加载图像的Cximage实例。
    xImage.GrayScale();
    xImage.SetJpegQuality(8);
    //xImage.Resample(xImage.GetWidth()*2, xImage.GetHeight()*2);
    //xImage.Save("gray.tif", CXIMAGE_FORMAT_TIF);
    // wrap image data
    BYTE * nBit = xImage.GetBits();
    const void * raw = (void *)xImage.GetBits();
    Image image(xImage.GetWidth(), xImage.GetHeight(), "Y800", raw, xImage.GetSize());


    
    然而使用Cximage加载的图像只能进行条形码的识别,后改用Opencv来加载才可以用,具体原因还需探究。
    

    //opencv
    int width = 0, height = 0;
    const void *raw = NULL;
    CvMat *cv_matrix = cvLoadImageM(m_getIdcode.strSave8.c_str(),CV_LOAD_IMAGE_GRAYSCALE);
    width = cv_matrix->width;
    height= cv_matrix->height;
    raw = (char*)cv_matrix->data.ptr;
    Image image(width, height, "Y800", raw, width * height);


    从以上不难看出,加载图像的目的就是获取raw数据,然后把这个raw送到Image的构造其中创建实例。

    zbar的识别效果针对于小图的二维码识别,整张图识别效果不佳。

    另外,使用Opencv或者Cximage需要设置对应的环境。



    展开全文
  • opencv二维码识别解码

    2019-08-22 16:18:14
    使用opencv识别QR二维码,框出图片中的二维码,并使用开源库Zxing解码,在这过程中学习理解opencv库相应的函数。 环境: 1. window7系统       2. QT create 1.准备 首先安装QT和QT create...

    目的:

    使用opencv库识别QR二维码,框出图片中的二维码,并使用开源库Zxing解码,在这过程中学习理解opencv库相应的函数。

    环境:

    1. window7系统

          2. QT create

    1.准备

    首先安装QT和QT create开发环境,window下使用cmake编译opencv生产lib库。这部分内容网上很多资料,直接搜索安装就行。

    2.工程代码

    QT create配置使用opencv库。在工程的pro文件下面添加指定opencv库的头文件和lib的路径。如下:
    1. INCLUDEPATH+=C:\Qt\opencv\include\opencv\
    2. C:\Qt\opencv\include\opencv2\
    3. C:\Qt\opencv\include
    4. LIBS+=C:\Qt\opencv\lib\libopencv_calib3d320.dll.a\
    5. C:\Qt\opencv\lib\libopencv_core320.dll.a\
    6. C:\Qt\opencv\lib\libopencv_features2d320.dll.a\
    7. C:\Qt\opencv\lib\libopencv_flann320.dll.a\
    8. C:\Qt\opencv\lib\libopencv_highgui320.dll.a\
    9. C:\Qt\opencv\lib\libopencv_imgcodecs320.dll.a\
    10. C:\Qt\opencv\lib\libopencv_imgproc320.dll.a\
    11. C:\Qt\opencv\lib\libopencv_ml320.dll.a\
    12. C:\Qt\opencv\lib\libopencv_objdetect320.dll.a\
    13. C:\Qt\opencv\lib\libopencv_photo320.dll.a\
    14. C:\Qt\opencv\lib\libopencv_shape320.dll.a\
    15. C:\Qt\opencv\lib\libopencv_stitching320.dll.a\
    16. C:\Qt\opencv\lib\libopencv_superres320.dll.a\
    17. C:\Qt\opencv\lib\libopencv_video320.dll.a\
    18. C:\Qt\opencv\lib\libopencv_videoio320.dll.a\
    19. C:\Qt\opencv\lib\libopencv_videostab320.dll.a

    opencv识别定位二维码的代码如下:
    1. #include "opencv2/highgui/highgui.hpp"
    2. #include "opencv2/imgproc/imgproc.hpp"
    3. #include <iostream>
    4. #include <stdio.h>
    5. #include <stdlib.h>
    6. #include <math.h>
    7. #include <QDebug>
    8. using namespace cv;
    9. using namespace std;
    10. Mat src; Mat src_gray;
    11. RNG rng(12345);
    12. //Scalar colorful = CV_RGB(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
    13. //获取轮廓的中心点
    14. Point Center_cal(vector<vector<Point> > contours,int i)
    15. {
    16. int centerx=0,centery=0,n=contours[i].size();
    17. //在提取的小正方形的边界上每隔周长个像素提取一个点的坐标,
    18. //求所提取四个点的平均坐标(即为小正方形的大致中心)
    19. centerx = (contours[i][n/4].x + contours[i][n*2/4].x + contours[i][3*n/4].x + contours[i][n-1].x)/4;
    20. centery = (contours[i][n/4].y + contours[i][n*2/4].y + contours[i][3*n/4].y + contours[i][n-1].y)/4;
    21. Point point1=Point(centerx,centery);
    22. return point1;
    23. }
    24. int main( int argc, char** argv[] )
    25. {
    26. src = imread( "core.jpg", 1 );
    27. Mat src_all=src.clone();
    28. //彩色图转灰度图
    29. cvtColor( src, src_gray, CV_BGR2GRAY );
    30. //对图像进行平滑处理
    31. blur( src_gray, src_gray, Size(3,3) );
    32. //使灰度图象直方图均衡化
    33. equalizeHist( src_gray, src_gray );
    34. namedWindow("src_gray");
    35. imshow("src_gray",src_gray);
    36. Scalar color = Scalar(1,1,255 );
    37. Mat threshold_output;
    38. vector<vector<Point> > contours,contours2;
    39. vector<Vec4i> hierarchy;
    40. Mat drawing = Mat::zeros( src.size(), CV_8UC3 );
    41. Mat drawing2 = Mat::zeros( src.size(), CV_8UC3 );
    42. Mat drawingAllContours = Mat::zeros( src.size(), CV_8UC3 );
    43. //指定112阀值进行二值化
    44. threshold( src_gray, threshold_output, 112, 255, THRESH_BINARY );
    45. namedWindow("Threshold_output");
    46. imshow("Threshold_output",threshold_output);
    47. /*查找轮廓
    48. * 参数说明
    49. 输入图像image必须为一个2值单通道图像
    50. contours参数为检测的轮廓数组,每一个轮廓用一个point类型的vector表示
    51. hiararchy参数和轮廓个数相同,每个轮廓contours[ i ]对应4个hierarchy元素hierarchy[ i ][ 0 ] ~hierarchy[ i ][ 3 ],
    52. 分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,该值设置为负数。
    53. mode表示轮廓的检索模式
    54. CV_RETR_EXTERNAL 表示只检测外轮廓
    55. CV_RETR_LIST 检测的轮廓不建立等级关系
    56. CV_RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
    57. CV_RETR_TREE 建立一个等级树结构的轮廓。具体参考contours.c这个demo
    58. method为轮廓的近似办法
    59. CV_CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
    60. CV_CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
    61. CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain 近似算法
    62. offset表示代表轮廓点的偏移量,可以设置为任意值。对ROI图像中找出的轮廓,并要在整个图像中进行分析时,这个参数还是很有用的。
    63. */
    64. findContours( threshold_output, contours, hierarchy, CV_RETR_TREE, CHAIN_APPROX_NONE, Point(0, 0) );
    65. int c=0,ic=0,k=0,area=0;
    66. //通过黑色定位角作为父轮廓,有两个子轮廓的特点,筛选出三个定位角
    67. int parentIdx=-1;
    68. for( int i = 0; i< contours.size(); i++ )
    69. {
    70. //画出所以轮廓图
    71. drawContours( drawingAllContours, contours, parentIdx, CV_RGB(255,255,255) , 1, 8);
    72. if (hierarchy[i][2] != -1 && ic==0)
    73. {
    74. parentIdx = i;
    75. ic++;
    76. }
    77. else if (hierarchy[i][2] != -1)
    78. {
    79. ic++;
    80. }
    81. else if(hierarchy[i][2] == -1)
    82. {
    83. ic = 0;
    84. parentIdx = -1;
    85. }
    86. //有两个子轮廓
    87. if ( ic >= 2)
    88. {
    89. //保存找到的三个黑色定位角
    90. contours2.push_back(contours[parentIdx]);
    91. //画出三个黑色定位角的轮廓
    92. drawContours( drawing, contours, parentIdx, CV_RGB(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)) , 1, 8);
    93. ic = 0;
    94. parentIdx = -1;
    95. }
    96. }
    97. //填充的方式画出三个黑色定位角的轮廓
    98. for(int i=0; i<contours2.size(); i++)
    99. drawContours( drawing2, contours2, i, CV_RGB(rng.uniform(100,255),rng.uniform(100,255),rng.uniform(100,255)) , -1, 4, hierarchy[k][2], 0, Point() );
    100. //获取三个定位角的中心坐标
    101. Point point[3];
    102. for(int i=0; i<contours2.size(); i++)
    103. {
    104. point[i] = Center_cal( contours2, i );
    105. }
    106. //计算轮廓的面积,计算定位角的面积,从而计算出边长
    107. area = contourArea(contours2[1]);
    108. int area_side = cvRound (sqrt (double(area)));
    109. for(int i=0; i<contours2.size(); i++)
    110. {
    111. //画出三个定位角的中心连线
    112. line(drawing2,point[i%contours2.size()],point[(i+1)%contours2.size()],color,area_side/2,8);
    113. }
    114. namedWindow("DrawingAllContours");
    115. imshow( "DrawingAllContours", drawingAllContours );
    116. namedWindow("Drawing2");
    117. imshow( "Drawing2", drawing2 );
    118. namedWindow("Drawing");
    119. imshow( "Drawing", drawing );
    120. //接下来要框出这整个二维码
    121. Mat gray_all,threshold_output_all;
    122. vector<vector<Point> > contours_all;
    123. vector<Vec4i> hierarchy_all;
    124. cvtColor( drawing2, gray_all, CV_BGR2GRAY );
    125. threshold( gray_all, threshold_output_all, 45, 255, THRESH_BINARY );
    126. findContours( threshold_output_all, contours_all, hierarchy_all, RETR_EXTERNAL, CHAIN_APPROX_NONE, Point(0, 0) );//RETR_EXTERNAL表示只寻找最外层轮廓
    127. Point2f fourPoint2f[4];
    128. //求最小包围矩形
    129. RotatedRect rectPoint = minAreaRect(contours_all[0]);
    130. //将rectPoint变量中存储的坐标值放到 fourPoint的数组中
    131. rectPoint.points(fourPoint2f);
    132. for (int i = 0; i < 4; i++)
    133. {
    134. line(src_all, fourPoint2f[i%4], fourPoint2f[(i + 1)%4]
    135. , Scalar(20,21,237), 3);
    136. }
    137. namedWindow("Src_all");
    138. imshow( "Src_all", src_all );
    139. //框出二维码后,就可以提取出二维码,然后使用解码库zxing,解出码的信息。
    140. //或者研究二维码的排布规则,自己写解码部分
    141. waitKey(0);
    142. return(0);
    143. }

    下面是代码运行的图片,代码处理过程的图片都有,包括二值化图片,轮廓图,找到的定位角图和最终的框出二维码图都显示出来了。如下:


    这部分的代码主要是修改自guanyonglai博主的代码,在此基础上学习了相应的opencv库函数,并根据自己的理解添加了一些注释。实现的主要功能是根据QR二维码三个定位角的特点找出定位角的坐标,并框出整个QR二维码。
    框出二维码后能做的事情就多了,可以使用相应的开源解码库解出二维码的信息,比如Zxing库,libdmtx库。Zxing库能解码的格式和支持的语音格式挺多的,网址:https://github.com/zxing/zxing。libdmtx库主要解码data matrix二维码,网址:http://libdmtx.sourceforge.net/这个库我使用过,很简单,直接调用几个函数就可以解出码的信息。
    解码部分使用libdmtx库的方式已经实现的了,有时间再补充。去除opencv库,直接用算法处理图片并定位二维码并解码的也写了demo,这部分内容较多,有时间再补充,需要大概思路的可以留言。

    展开全文
  • 本文是上篇博文的进阶,Zbar+ROS+opencv二维码识别与定位研究(一) 1.首先下载Zbar的源代码源代码链接 在ubuntu下,用命令行的方式在官网下载 $wget http://downloads.sourceforge.net/zbar/0.10/zbar-0.10.tar.bz2...

    本文是上篇博文的进阶,Zbar+ROS+opencv二维码识别与定位研究(一)

    1.首先下载Zbar的源代码源代码链接

    在ubuntu下,用命令行的方式在官网下载

    $wget http://downloads.sourceforge.net/zbar/0.10/zbar-0.10.tar.bz2

    2.安装相关包

    $sudo apt install python-gtk2 python-gtk2-dev libmagickwand-dev imagemagick autoconf libv4l-dev

    3.设置和编译

    $sudo ln -s /usr/include/libv4l1-videodev.h   /usr/include/linux/videodev.h
    $tar xf zbar-0.10.tar.bz2
    $cd zbar-0.10
    $sed -i 's|linux/videodev.h|libv4l1-videodev.h|g' zbar/video/v4l1.c include/config.h.in configure.ac configure
    $./configure --prefix=/usr --without-gtk --without-python
    $make
    $sudo make install

    注意:如果make的时候报错:

    在./configure上增加一行

    $export CFLAGS=""  

     

    4.测试一下

     

    $zbarimg 111.jpeg//111.jpeg为测试二维码

    显示结果:

    ubuntu@xxxx:~/图片$ zbarimg 111.jpeg

    QR-Code:http://weixin.qq.com/r/d0iJkerEhrf5ra7y9x1l
    scanned 1 barcode symbols from 1 images in 0.06 seconds

     

    1)工程环境:QT+C++

    2)编译方法:CMake

    3)用到的opencv和zbar库

    CMakeList.txt文件:

    cmake_minimum_required(VERSION 2.8.3)
    project(zbar_opencv)
    set(CMAKE_MODULE_PATH ${ZBARCV_SOURCE_DIR})
    find_package (OpenCV)
    find_package(catkin REQUIRED COMPONENTS
      cv_bridge##ros的数据转化成opencv数据,再用opencv处理
      image_transport
      roscpp
      sensor_msgs
      std_msgs
    )
    
    find_package(PkgConfig)
    pkg_check_modules(PC_ZBAR QUIET zbar)
    set(ZBAR_DEFINITIONS ${PC_ZBAR_CFLAGS_OTHER})
    find_library(ZBAR_LIBRARIES NAMES zbar
                 HINTS ${PC_ZBAR_LIBDIR} ${PC_ZBAR_LIBRARY_DIRS} )
    find_path(ZBAR_INCLUDE_DIR Decoder.h
              HINTS ${PC_ZBAR_INCLUDEDIR} ${PC_ZBAR_INCLUDE_DIRS}
              PATH_SUFFIXES zbar )
    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(ZBAR  DEFAULT_MSG  ZBAR_LIBRARIES ZBAR_INCLUDE_DIR)
    catkin_package(
     INCLUDE_DIRS include
      LIBRARIES zbar_opencv
    )
    include_directories(
        include
      ${catkin_INCLUDE_DIRS}
    )
    
    add_executable(zbar_opencv src/zbar_opencv.cpp)
    target_link_libraries(zbar_opencv
      ${catkin_LIBRARIES}
      ${OpenCV_LIBRARIES}
     # ${Zbar_LIBRARIES}
      /usr/lib/libzbar.so##最重要的添加编译用的共享库
    
    )

    1)在主程序zbar_opencv.cpp里面自定义类,实现将usb摄像头采集回来的/usb_cam/image_raw,通过cv_ptr=cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);使用image_transport订阅图像话题“in” 和 发布图像话题“out” /camera/rgb/image_raw

    2)转换完了以后,用opencv的方法,调用gradient.cpp,查看具体实现在开头链接

    3)最后用定位好的图像传入zbarscanner()里面进行扫描识别

    zbar_opencv.cpp如下:

    class ImageConverter
    {
        ros::NodeHandle nh;
    
        image_transport::ImageTransport it;
        image_transport::Subscriber image_sub;
        image_transport::Publisher image_pub;
    
      public:
        ImageConverter():it(nh)
        {
            //使用image_transport订阅图像话题“in” 和 发布图像话题“out” /camera/rgb/image_raw
            image_sub=it.subscribe("/usb_cam/image_raw",1,&ImageConverter::imageCb,this);
            image_pub=it.advertise("zbar_opencv",1);
    
        }
    
        ~ImageConverter(){}
    
        //订阅回调函数
        void imageCb(const sensor_msgs::ImageConstPtr& msg)
        {
            cv_bridge::CvImagePtr cv_ptr;
            try
            {
                //将ROS图像消息转化为适合Opencv的CvImage
                cv_ptr=cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
    
            }
            catch(cv_bridge::Exception& e)
            {
                ROS_ERROR("cv_bridge exception: %s",e.what());
                return;
            }
            //梯度运算
            cv_ptr=gradient(cv_ptr);
            //水平投影法
            // projection(cv_ptr);
            zbarscanner(cv_ptr);
            // printf("OK1\n");
            image_pub.publish(cv_ptr->toImageMsg());
        }
    };
    

     

    展开全文
  • ROS:zbar+opencv 二维码识别

    千次阅读 热门讨论 2017-03-28 17:18:40
    zbar+opencv

    一、zbar安装
    1.下载zabr:zbar官网
    GitHub
    或命令行直接下载

    wget http://downloads.sourceforge.net/zbar/0.10/zbar-0.10.tar.bz2

    2.解压安装
    预先安装以下包

    sudo apt install python-gtk2 python-gtk2-dev libmagickwand-dev imagemagick autoconf libv4l-dev

    设置

    sudo ln -s /usr/include/libv4l1-videodev.h   /usr/include/linux/videodev.h

    安装

    tar xf zbar-0.10.tar.bz2
    cd zbar-0.10
    sed -i 's|linux/videodev.h|libv4l1-videodev.h|g' zbar/video/v4l1.c include/config.h.in configure.ac configure
    export CFLAGS=""
    ./configure --prefix=/usr --without-gtk --without-python
    make
    sudo make install

    二、代码
    1.zbar_opencv.cpp

    #include <ros/ros.h>
    #include <image_transport/image_transport.h>
    #include <cv_bridge/cv_bridge.h>
    #include <sensor_msgs/image_encodings.h>
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <zbar.h>
    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    using namespace cv;
    using namespace zbar;
    //static const std::string OPENCV_WINDOW="Image window";
    
    void zbarscanner(cv_bridge::CvImagePtr cv_ptr)
    {
            // Create a zbar reader
        ImageScanner scanner;
    
        // Configure the reader
        scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
    
    
            // Capture an OpenCV frame
            cv::Mat frame,frame_grayscale;
            frame=cv_ptr->image;
            // Convert to grayscale
            cvtColor(frame, frame_grayscale, CV_BGR2GRAY);
    
            // Obtain image data
            int width = frame_grayscale.cols;
            int height = frame_grayscale.rows;
            uchar *raw = (uchar *)(frame_grayscale.data);
    
            // Wrap image data
            Image image(width, height, "Y800", raw, width * height);
    
            // Scan the image for barcodes
    //
            scanner.scan(image);
    
            // Extract results
            int counter = 0;
            for (Image::SymbolIterator symbol = image.symbol_begin(); symbol != image.symbol_end(); ++symbol) {
                cout<< symbol->get_data() << endl;
                // Draw location of the symbols found
                if (symbol->get_location_size() == 4) {
    
                    line(frame, Point(symbol->get_location_x(0), symbol->get_location_y(0)), Point(symbol->get_location_x(1), symbol->get_location_y(1)), Scalar(0, 255, 0), 2, 8, 0);
                    line(frame, Point(symbol->get_location_x(1), symbol->get_location_y(1)), Point(symbol->get_location_x(2), symbol->get_location_y(2)), Scalar(0, 255, 0), 2, 8, 0);
                    line(frame, Point(symbol->get_location_x(2), symbol->get_location_y(2)), Point(symbol->get_location_x(3), symbol->get_location_y(3)), Scalar(0, 255, 0), 2, 8, 0);
                    line(frame, Point(symbol->get_location_x(3), symbol->get_location_y(3)), Point(symbol->get_location_x(0), symbol->get_location_y(0)), Scalar(0, 255, 0), 2, 8, 0);
                }
    
                counter++;
            }
    
    }
    
    class ImageConverter
    {
        ros::NodeHandle nh;
    
        image_transport::ImageTransport it;
        image_transport::Subscriber image_sub;
        image_transport::Publisher image_pub;
    
      public:
        ImageConverter():it(nh)
        {
            //使用image_transport订阅图像话题“in” 和 发布图像话题“out”
            image_sub=it.subscribe("/camera/rgb/image_raw",1,&ImageConverter::imageCb,this);
            image_pub=it.advertise("zbar_opencv",1);
    
        }
    
        ~ImageConverter(){}
    
        //订阅回调函数
        void imageCb(const sensor_msgs::ImageConstPtr& msg)
        {
            cv_bridge::CvImagePtr cv_ptr;
            try
            {
                //将ROS图像消息转化为适合Opencv的CvImage
                cv_ptr=cv_bridge::toCvCopy(msg,sensor_msgs::image_encodings::BGR8);
            }
            catch(cv_bridge::Exception& e)
            {
                ROS_ERROR("cv_bridge exception: %s",e.what());
                return;
            }
    
            zbarscanner(cv_ptr);
            image_pub.publish(cv_ptr->toImageMsg());
        }
    };
    
    
    int main(int argc, char **argv) {
    
        ros::init(argc,argv,"zbar_opencv");
        ImageConverter ic;
        ros::spin();
        return 0;
    }

    2.CMakeLists.txt

    cmake_minimum_required(VERSION 2.8.3)
    project(zbar_opencv)
    set(CMAKE_MODULE_PATH ${ZBARCV_SOURCE_DIR})
    find_package (OpenCV)
    find_package (ZBar0)
    find_package(catkin REQUIRED COMPONENTS
      cv_bridge
      image_transport
      roscpp
      sensor_msgs
      std_msgs
    )
    
    find_package(PkgConfig)
    pkg_check_modules(PC_ZBAR QUIET zbar)
    set(ZBAR_DEFINITIONS ${PC_ZBAR_CFLAGS_OTHER})
    find_library(ZBAR_LIBRARIES NAMES zbar 
                 HINTS ${PC_ZBAR_LIBDIR} ${PC_ZBAR_LIBRARY_DIRS} )
    find_path(ZBAR_INCLUDE_DIR Decoder.h
              HINTS ${PC_ZBAR_INCLUDEDIR} ${PC_ZBAR_INCLUDE_DIRS}
              PATH_SUFFIXES zbar )
    include(FindPackageHandleStandardArgs)
    find_package_handle_standard_args(ZBAR  DEFAULT_MSG  ZBAR_LIBRARIES ZBAR_INCLUDE_DIR)
    catkin_package(
    #  INCLUDE_DIRS include
    #  LIBRARIES zbar_opencv
      CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs std_msgs
    #  DEPENDS system_lib
    )
    include_directories(
      ${catkin_INCLUDE_DIRS}
    )
    add_executable(zbar_opencv src/zbar_opencv.cpp)
    target_link_libraries(zbar_opencv
      ${catkin_LIBRARIES}
      ${OpenCV_LIBRARIES} 
      ${ZBAR_LIBRARIES}
    )
    展开全文
  • 首先要下载Microsoft Visual Studio 2010或者更高版本:对与该软件的相关配置参考《OPENCV 3》这本书;2.下载和安装opencv3.0.0以及Zbar-0.10安装包(1)下载 Zbar下载:http://zbar.sourceforge.net/download.html...
  • #include <...#include "opencv2/opencv.hpp" #include "opencv2/highgui/highgui.hpp" //Mat src = imread("F:/C++/OpenCv_QR/photo/test.jpeg"); using namespace cv; using namespace std; Mat t...
  • 1.本文利用二维码的边缘信息,对其进行定位,经检验在3-4m以内有良好的定位效果 2.主要步骤:原图像大小调整,提高运算效率;转化为灰度图;高斯平滑滤波; 求得水平和垂直方向灰度图像的梯度差,使用Sobel算子;开...
  • 但常常会因为二维码图像污点、光照不均匀以及二维码图像倾斜等原因,使得二维码识别正确率低,针对这些问题,通过学习贾老师OpenCV课程以及其他博主的经验[作者仟人斩],实现了基于OpenCV二维码定位与识别,但仍...
  • 基于Opencv二维码识别源码!效果比较可以!
  • opencv4 二维码识别

    2020-04-01 15:09:36
    opencv正式将二维码识别加入进来。 #include <iostream> #include<opencv2\opencv.hpp> using namespace cv; int main() { cv::Mat src= imread("1.jpg"); cv::QRCodeDetector QRdetecter; std::...
  • # opencv二维码定位图案检测(c++) 通过二维码回字形定位图案三层轮廓1:1:3:1:1的结构,识别出其位置并用绿色方框框出。
  • 3、开发工具VS2010控制台程序+OpenCV2.4.3或以上 最后的结果类似下图: [img=https://img-bbs.csdn.net/upload/201505/04/1430742646_799196.jpg][/img] 求各位大神给个思路或者有偿编写也行,很简单的一个程序,...
  • 前面,我们已经介绍了两种集成 wechat_qrcode 微信二维码识别能力的做法: 完整编译 OpenCVOpenCV Contrib Native C++ 单独集成 wechat_qrcode 模块 这两种方式的预览和识别均是基于 OpenCV 提供的 JavaCamera...
  • opencv 二维码定位

    千次阅读 多人点赞 2018-11-24 14:11:26
    下图为二维码的其中一个黑色正方形,二维码定位主要是根据这个正方形的位置进行定位识别 这个正方形提供了两个特征: 该正方形有三个轮廓特征,因此我们可以找到一个符合该特征的轮廓,便可以节省许多操作。如一...
  • JavaCV/OpenCV 二维码扫描功能

    千次阅读 2020-10-07 14:21:36
    怎样配置工程就不再赘述,不清楚的读者可以网上查找资料,二维码扫描功能通过JavaCV实现起来还是挺简单的,主要OpenCV中QRCodeDetector提供强大的API,识别速度个人感觉以微信(经常扫不到)来作对比还是快许多。...
  • 使用Opencv+Zbar组合可以很容易的识别图片中的二维码,特别是标准的二维码,这里标准指的是二维码成像清晰,图片中二维码的空间占比在40%~100%之间,这样标准的图片,Zbar识别起来很容易,不需要Opencv额外的处理。...
  • OpenCV在对象检测模块中QRCodeDetector有两个相关API分别实现二维码检测与二维码解析: # 检测二维码 bool cv::QRCodeDetector::detect( InputArray img, OutputArray points )const img输入图像,灰度或者彩色...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 444
精华内容 177
关键字:

opencv二维码识别