c++ zbar opencv 二维码识别
Posted 小田田_XOW
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
zbar的识别效果针对于小图的二维码识别,整张图识别效果不佳。
另外,使用Opencv或者Cximage需要设置对应的环境。
以上是关于c++ zbar opencv 二维码识别的主要内容,如果未能解决你的问题,请参考以下文章
二维码解码器Zbar+VS2010开发环境配置(使用opencv库)