原創(chuàng)|行業(yè)資訊|編輯:楊鵬連|2020-12-23 11:28:21.780|閱讀 292 次
概述:從8.0版開始,Dynamsoft向開發(fā)人員公開更多參數(shù)和中間結(jié)果(例如,灰度圖像,二進(jìn)制圖像,條形碼定位結(jié)果等),以進(jìn)行應(yīng)用程序調(diào)試和優(yōu)化,從而使Dynamsoft Barcode SDK在商業(yè)條形碼SDK中脫穎而出。在本文中,我將介紹一些相關(guān)的參數(shù)和API。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
Dynamsoft Barcode Reader SDK一款多功能的條碼讀取控件,只需要幾行代碼就可以將條碼讀取功能嵌入到Web或桌面應(yīng)用程序。這可以節(jié)省數(shù)月的開發(fā)時(shí)間和成本。能支持多種圖像文件格式以及從攝像機(jī)或掃描儀獲取的DIB格式。使用Dynamsoft Barcode Reader SDK,你可以創(chuàng)建強(qiáng)大且實(shí)用的條形碼掃描儀軟件,以滿足你的業(yè)務(wù)需求。
點(diǎn)擊下載Dynamsoft Barcode Reader最新版
在使用條形碼SDK掃描單個(gè)或多個(gè)條形碼時(shí),大多數(shù)開發(fā)人員只關(guān)心解碼速度和識(shí)別精度之間的權(quán)衡,因?yàn)樗麄儫o法獲取其他數(shù)據(jù)。從8.0版開始,Dynamsoft向開發(fā)人員公開更多參數(shù)和中間結(jié)果(例如,灰度圖像,二進(jìn)制圖像,條形碼定位結(jié)果等),以進(jìn)行應(yīng)用程序調(diào)試和優(yōu)化,從而使Dynamsoft Barcode SDK在商業(yè)條形碼SDK中脫穎而出。在本文中,我將介紹一些相關(guān)的參數(shù)和API。
要求
CMake
OpenCV 4.5.0版。對(duì)于Windows,您需要OpenCV_DIR = C:\opencv\build在系統(tǒng)環(huán)境變量中添加“ ”。
Dynamsoft條碼閱讀器8.0。要解鎖所有功能,您必須申請(qǐng)?jiān)囉迷S可證。
在CMake項(xiàng)目中鏈接OpenCV和Dynamsoft Barcode SDK
如果您已經(jīng)成功安裝了OpenCV,則鏈接OpenCV庫非常簡(jiǎn)單:
find_package(OpenCV REQUIRED) if (CMAKE_HOST_WIN32) if (CMAKE_CL_64) target_link_libraries (BarcodeReaderDemo "DBRx64" ${OpenCV_LIBS}) else () target_link_libraries (BarcodeReaderDemo "DBRx86" ${OpenCV_LIBS}) endif() else () target_link_libraries (BarcodeReaderDemo "DynamsoftBarcodeReader" ${OpenCV_LIBS}) endif()對(duì)于Dynamsoft Barcode SDK,鏈接目錄是手動(dòng)設(shè)置的:
if (CMAKE_HOST_WIN32) if (CMAKE_CL_64) link_directories("${PROJECT_SOURCE_DIR}/lib/Windows/x64") else() link_directories("${PROJECT_SOURCE_DIR}/lib/Windows/x86") endif() else if(CMAKE_HOST_UNIX) link_directories("${PROJECT_SOURCE_DIR}/lib/Linux") endif()獲取轉(zhuǎn)換后的圖像和預(yù)測(cè)的條形碼邊界框
讓我們來看一下Dynamsoft條碼讀取器的工作原理。
使用Dynamsoft條碼讀取器掃描條碼的一般方法如下:
CBarcodeReader reader; ret = reader.InitLicense("LICENSE-KEY"); ret = reader.DecodeFile(imageFile, templateName); TextResultArray *finalResults = NULL; reader.GetAllTextResults(&finalResults); for (int index = 0; index < finalResults->resultsCount; index++) { printf("Value: %s\r\n", finalResults->results[index]->barcodeText); }
DynamsoftBarcodeReader.h頭文件中定義了一些枚舉類型:
typedef enum IntermediateResultType { /**No intermediate result */ IRT_NO_RESULT = 0x00000000, /**Original image */ IRT_ORIGINAL_IMAGE = 0x00000001, /**Colour clustered image. Not supported yet. */ IRT_COLOUR_CLUSTERED_IMAGE = 0x00000002, /**Colour image converted to grayscale */ IRT_COLOUR_CONVERTED_GRAYSCALE_IMAGE = 0x00000004, /**Transformed grayscale image */ IRT_TRANSFORMED_GRAYSCALE_IMAGE = 0x00000008, /**Predetected region */ IRT_PREDETECTED_REGION = 0x00000010, /**Preprocessed image */ IRT_PREPROCESSED_IMAGE = 0x00000020, /**Binarized image */ IRT_BINARIZED_IMAGE = 0x00000040, /**Text zone */ IRT_TEXT_ZONE = 0x00000080, /**Contour */ IRT_CONTOUR = 0x00000100, /**Line segment */ IRT_LINE_SEGMENT = 0x00000200, /**Form. Not supported yet. */ IRT_FORM = 0x00000400, /**Segmentation block. Not supported yet. */ IRT_SEGMENTATION_BLOCK = 0x00000800, /**Typed barcode zone */ IRT_TYPED_BARCODE_ZONE = 0x00001000, /**Predetected quadrilateral*/ IRT_PREDETECTED_QUADRILATERAL = 0x00002000 }IntermediateResultType;根據(jù)定義,很容易推斷Dynamsoft采用了哪些圖像處理算法。現(xiàn)在,我寫一些代碼片段來演示如何獲取灰度圖像,二進(jìn)制圖像和條形碼邊界框。
reader.GetRuntimeSettings(&runtimeSettings); runtimeSettings.barcodeFormatIds = barcodeFormat.barcodeFormatIds; runtimeSettings.barcodeFormatIds_2 = barcodeFormat.barcodeFormatIds_2; runtimeSettings.intermediateResultSavingMode = IRSM_MEMORY; runtimeSettings.intermediateResultTypes = IRT_BINARIZED_IMAGE | IRT_TRANSFORMED_GRAYSCALE_IMAGE | IRT_TYPED_BARCODE_ZONE; runtimeSettings.scaleDownThreshold = 10000; ret = reader.UpdateRuntimeSettings(&runtimeSettings, errorMSG, 256);默認(rèn)情況下,保存模式為IRSM_MEMORY。如果要將數(shù)據(jù)保存到文件系統(tǒng),可以將其更改為IRSM_FILESYSTEM。所述scaleDownThreshold用于控制輸入圖像尺寸。如果輸入圖像的寬度大于閾值,則圖像將按比例縮小。
調(diào)用解碼方法后,我們可以調(diào)用GetIntermediateResults()以獲得混合數(shù)據(jù)列表:
IntermediateResultArray* intermediateResults = NULL; reader.GetIntermediateResults(&intermediateResults); for (int i = 0; i < intermediateResults->resultsCount; i++) { }如果數(shù)據(jù)類型為IMRDT_IMAGE,則可以獲取圖像緩沖區(qū):
if(intermediateResults->results[i]->dataType == IMRDT_IMAGE) { int type = 0; ImageData* imageData = (ImageData*)intermediateResults->results[i]->results[0]; switch(imageData->format) { case IPF_BINARY: case IPF_GRAYSCALED: case IPF_BINARYINVERTED: type = CV_8UC1; break; case IPF_RGB_888: type = CV_8UC3; break; default: break; } }如果數(shù)據(jù)類型為IMRDT_LOCALIZATIONRESULT,則可以獲得條形碼邊界框:
if (intermediateResults->results[i]->dataType == IMRDT_LOCALIZATIONRESULT { LocalizationResult *pLocalizationResult = (LocalizationResult *)intermediateResults->results[i]->results[0]; int x1 = pLocalizationResult->x1; int y1 = pLocalizationResult->y1; int x2 = pLocalizationResult->x2; int y2 = pLocalizationResult->y2; int x3 = pLocalizationResult->x3; int y3 = pLocalizationResult->y3; int x4 = pLocalizationResult->x4; int y4 = pLocalizationResult->y4; }我們使用OpenCV imshow()函數(shù)顯示轉(zhuǎn)換后的圖像和條形碼邊界框。
灰度圖像
二進(jìn)制圖像
條碼邊界框
您可以編寫代碼來探索Dynamsoft Barcode SDK生成的更多中間數(shù)據(jù)。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: