安装完ZBar和ImageMagick++后,发现ImageMagick只是用来打开图片,转换成统一的灰度矩阵数据。所以这次我尝试用OpenCV来实现ImageMagick的功能。
1.删除工程属性中ImageMagick的相关设置,增加OpenCV的设置。
我的OpenCV版本是2.4.9。OpenCV安装请参考
http://www.cnblogs.com/freedomshe/archive/2012/04/25/2470540.html
1.VC++目录->可执行文件目录
C:\Program Files\opencv\build\x86\vc10\bin;
2.C/C++->常规->附加包含目录
C:\Program Files\opencv\build\include;
3.链接器->常规->附加库目录
C:\Program Files\opencv\build\x86\vc10\lib
4.链接器->输入->附加依赖性
opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_objdetect249d.lib
opencv_ts249d.lib
opencv_video249d.lib
2.修改源码如下
#include <iostream>
//#include <Magick++.h>
#include <zbar.h>
#define STR(s) #s
#include <opencv2/opencv.hpp>
using namespace std;
using namespace zbar;
using namespace cv;
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
// 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("barcode.png"); // 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();
cv::Mat img = cv::imread("barcode.png");
cv::Mat imgGray ;
imgGray.create(img.size(),CV_8UC1);
cvtColor(img,imgGray,CV_BGR2GRAY);
int width = imgGray.cols; // extract dimensions
int height = imgGray.rows;
// wrap image data
// Image image(width, height, "Y800", raw, width * height);
Image image(width, height, "Y800", imgGray.data, 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);
}
3.修改完成后运行出现fopen.c中if(*file==_T(‘\0’))的报错
修改属性C/C++->预处理器->预处理器定义将NDEBUG改成_DEBUG
4.完成!
用更多图片试验后证明OpenCV完全可以取代ImageMagick++。下一步测试Qt和ZBar。