zbar一個開源的C語言實現的條形碼和二維碼識別庫,可以用在任何平臺。
編譯
下面給出gn的寫法,其他的構建工具,例如ndk和cmake,拿去參考改改就好了。這裏還包括了libiconv的編譯。
# zbar project: https://github.com/ZBar/ZBar
# libiconv project: https://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.16.tar.gz
# libiconv build: https://www.codeproject.com/Articles/302012/How-to-Build-libiconv-with-Microsoft-Visual-Studio
config("zbar_config") {
include_dirs = [
"include",
"zbar",
"zbar/decoder",
"libiconv/include",
]
if (is_win) {
cflags = [
"/wd4018",
"/wd4245",
"/wd4005",
"/wd4706",
"/wd4554",
"/wd4090",
"/wd4206",
"/wd4146",
"/wd4142",
"/wd4310",
"/wd4389",
"/wd4295",
"/wd4013",
"/wd4189",
]
} else {
cflags = [
"-Wno-sign-compare",
"-Wno-unused-variable",
"-Wno-tautological-compare",
"-Wno-unused-function",
"-Wno-shift-op-parentheses",
"-Wno-logical-not-parentheses",
"-Wno-logical-op-parentheses",
"-Wno-bitwise-op-parentheses",
"-Wno-parentheses-equality",
"-Wno-incompatible-pointer-types",
"-Wno-implicit-function-declaration",
"-Wno-int-conversion",
"-Wno-unused-const-variable",
]
}
defines = [
]
}
config("public_zbar_config") {
include_dirs = [
"include",
]
}
static_library("libiconv") {
sources = [
"libiconv/iconv.c",
"libiconv/localcharset.c",
"libiconv/relocatable.c",
]
include_dirs = [
"libiconv",
"libiconv/include",
]
configs += [ ":zbar_config" ]
}
static_library("zbar") {
sources = [
"zbar/jpeg.c",
"zbar/img_scanner.c",
"zbar/decoder.c",
"zbar/image.c",
"zbar/symbol.c",
"zbar/convert.c",
"zbar/config.c",
"zbar/scanner.c",
"zbar/error.c",
"zbar/refcnt.c",
"zbar/video.c",
"zbar/video/null.c",
"zbar/decoder/code128.c",
"zbar/decoder/code39.c",
"zbar/decoder/code93.c",
"zbar/decoder/codabar.c",
"zbar/decoder/databar.c",
"zbar/decoder/ean.c",
"zbar/decoder/i25.c",
"zbar/decoder/qr_finder.c",
"zbar/decoder/pdf417.c",
"zbar/qrcode/bch15_5.c",
"zbar/qrcode/binarize.c",
"zbar/qrcode/isaac.c",
"zbar/qrcode/qrdec.c",
"zbar/qrcode/qrdectxt.c",
"zbar/qrcode/rs.c",
"zbar/qrcode/util.c",
]
configs += [ ":zbar_config" ]
public_configs = [ ":public_zbar_config" ]
deps = [
":libiconv",
"//third_party:jpeg",
]
if (is_win) {
libs = [ "winmm.lib" ]
defines = [
"WEBRTC_WIN",
]
}
}
executable("scan_image") {
sources = [ "examples/scan_image.c" ]
configs += [ ":zbar_config" ]
deps = [ ":zbar", "//third_party/libpng" ]
}
使用
實際上不管什麼類型的數據zbar都會把他轉換爲Y800
類型的YUV數據,也就是隻有Y值的YUV數據。所以不管我們要做相機的二維碼識別還是做圖片(BMP\JPG)的二維碼識別最終都是要把數據轉換爲Y800
類型。可以參考zbar的demo-scan_image.c。
我基於zbar實現了Android、iOS、Windows、Mac平臺的攝像頭和圖片識別,都是基於此實現的,攝像頭識別這塊是跟平臺相關的(採集),剩下的流程都是一樣的。圖片識別所有平臺都是一樣的。
其他功能
- zbar的識別率高低和二值化處理,圖片處理有關
- 要實現移動端平臺自動放大需要修改一下zbar提供更多的數據