zbar使用


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平臺的攝像頭和圖片識別,都是基於此實現的,攝像頭識別這塊是跟平臺相關的(採集),剩下的流程都是一樣的。圖片識別所有平臺都是一樣的。

其他功能

  1. zbar的識別率高低和二值化處理,圖片處理有關
  2. 要實現移動端平臺自動放大需要修改一下zbar提供更多的數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章