您的位置:首页 > 编程语言 > C语言/C++

c++ zbar opencv 二维码识别

2016-07-04 16:47 495 查看
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需要设置对应的环境。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: