opencv+zbar在arm下二維碼識別檢測
你好!這裡是風箏的部落格,
歡迎和我一起交流。
我們要識別檢測二維碼,還需要一個庫:zbar庫。
zbar下載:在csdn就有,直接搜尋zbar-0.10即可。我就不上傳了。
然後我們來開始配置環境:
sudo tar xzvf zbar-0.10.tar.gz
cd zbar-0.10
mkdir tmp
./configure --prefix=$PWD/tmp
$PWD是當前路徑,我的路徑是/work/system/zbar-0.10/
然後會發現一個問題:
configure: error: in `/work/system/zbar-0.10':
configure: error: Unable to find ImageMagick >= 6.2.6:
No package 'MagickWand' found
這是沒有MagickWand的原因,我們可以直接安裝MagickWand:
sudo apt-get install imagemagick libmagickwand-dev
但是,千萬別執行這條命令,當然,你執行了沒事,後面我會講……
如果執行了。繼續configure,還會有錯誤:
checking for GTK... configure: error: Package requirements (gtk+-2.0 gthread-2.0) were not met:
No package 'gtk+-2.0' found
這是沒有gtk的原因,同理,我們也可以安裝gtk來解決:
sudo apt-get install libgtk2.0-dev
但是,千萬別執行這條命令,當然,你執行了沒事,後面我會講……
如果執行了。繼續configure,還會有錯誤:
checking for PYGTK... configure: error: Package requirements (pygtk-2.0) were not met:
No package 'pygtk-2.0' found
同理,我們也可以解決:
sudo apt-get install python-gtk2-dev
但是,千萬別執行這條命令,當然,你執行了沒事,後面我會講……
當時我搞到這,發現要安裝的東西太太多了,好像我都用不到啊,尤其是gtk,我都要qt了,還要啥gtk啊。
我就惱了,發現,居然可以設定不編譯這些亂七八糟的東西,就不需要安裝這些其他東西了:
./configure --prefix=$PWD/tmp/ --without-gtk --without-qt --without-imagemagick --without-python
就是這條命令,其他的亂七八糟都不需要,直接就配置好了。
接著,make,發現:
In file included from /usr/include/stdio.h:936:0,
from zbar/debug.h:60,
from zbar/scanner.c:34:
/usr/include/x86_64-linux-gnu/bits/stdio2.h:139:1: error: expected identifier or ‘(’ before ‘{’ token
{
好像說的是gcc編譯器規則太嚴的問題,所以需要:export CFLAGS=””
即:
export CFLAGS=""
./configure --prefix=$PWD/tmp/ --without-gtk --without-qt --without-imagemagick --without-python
make
這樣應該就沒有錯誤了,接著
make install
就可以在當前目錄的tmp目錄下發現lib和include的檔案了。
最後,你以為這樣就可以了嗎?天真,坑我都替你們踩好了,,,,,,
這可是要在arm開發板裡執行的,配置的時候就不對,如果直接這樣安裝,我們編譯時會發現:
/work/system/zbar-0.10/tmp/lib//libzbar.so: file not recognized: File format not recognized
collect2: ld returned 1 exit status
說的就是libzbar.so這個庫的格式不對,因為我們是要進行交叉編譯的,所以直接配置時應該設定好:
./configure --prefix=$PWD/tmp/ --without-gtk --without-qt --without-python --without-imagemagick --host=arm-linux
這樣設定是給arm用的,重新make安裝即可!!!
然後就可以使用zbar來解碼了,從網上參考了一個簡單的識別二維碼的code:
zbar.cpp:
#include "zbar.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
using namespace zbar;
using namespace cv;
int main(int argc,char*argv[])
{
ImageScanner scanner;
// configure the reader
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
Mat image = imread("zbar.jpg");
Mat imageGray;
cvtColor(image,imageGray,CV_RGB2GRAY);
if(!imageGray.data)
{
cout << "read picture error!\n" << endl;
return 0;
}
int width = imageGray.cols;
int height = imageGray.rows;
uchar *raw = (uchar *)imageGray.data;
Image imageZbar(width, height, "Y800", raw, width * height);
// scan the image for barcodes
scanner.scan(imageZbar);
zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
if(imageZbar.symbol_begin()==imageZbar.symbol_end())
{
cout<<"decode failed!\n"<<endl;
}
for(;symbol != imageZbar.symbol_end();++symbol)
{
cout<<"type:"<<endl<<symbol->get_type_name()<<endl<<endl;
cout<<"data:"<<endl<<symbol->get_data()<<endl<<endl;
}
//imshow("Source Image",image);
waitKey();
// clean up
imageZbar.set_data(NULL,0);
return 0;
}
編譯:
arm-linux-g++ -Wno-psabi -I/usr/local/opencv/install_opencv/include/opencv/ -I/work/system/zbar-0.10/tmp/include/ -L/usr/local/opencv/install_opencv/lib/ -L/work/system/zbar-0.10/tmp/lib/ -L/work/qt/my_qt/lib -lQt5Widgets -lQt5Gui -lQt5Core -lopencv_core -lopencv_highgui -lzbar -lpthread -lrt -o zbar zbar.cpp
因為我之前一直opencv的時候選了WITH_QT這個選項,現在我要使用opencv編譯時都需要連線到qt的路徑和庫,有點煩。如果移植opencv時沒選WITH_QT的話,預設是WITH_QTK,編譯時就不需要加上QT的庫和路徑的。
這樣我們就可以生成一個zbar的可執行檔案了,把這個檔案和zbar的庫和一張二維碼圖片一起放到arm開發板上:
zbar.jpg:
執行zbar檔案:
解碼成功!