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源代码如下:
改用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来加载才可以用,具体原因还需探究。
从以上不难看出,加载图像的目的就是获取raw数据,然后把这个raw送到Image的构造其中创建实例。
zbar的识别效果针对于小图的二维码识别,整张图识别效果不佳。
另外,使用Opencv或者Cximage需要设置对应的环境。
使用其中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需要设置对应的环境。
相关文章推荐
- 【c++程序】十六进制转换十进制
- C++检测一个文件是否存在
- Boost之字符串
- C++之类和对象的使用(三)
- C语言5种存储区域
- C、C++获取文件大小(占用字节数)
- C++ 带默认形参值的函数
- 网狐全局定义,用户数据,更改要慎重!
- C语言使用回溯法解旅行售货员问题与图的m着色问题
- 多线程内存池基本框架(C++)
- C++ 继承、函数重载
- C++基础5 运算符重载【提高】
- C++轻量级界面库DuiLib简介(二)—使用DuiLib
- C++写时拷贝,引用计数
- C++ 函数重载
- Visual Studio中C++代码块的折叠
- C++String深浅拷贝问题
- C++设计模式-Adapter适配器模式
- C++类的静态成员详细讲解
- IP首部校验和算法