c++ zbar opencv 二维码识别

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,zbar,c++)