目标解码模拟激光条码扫描器的行为。然而,读者不是看整个视野,而是试图解码只在激光瞄准点下的条形码。这可以防止操作人员意外读取附近的其他条形码。
支持的设备:
配置DMCC:
启用或禁用目标解码(或检索它的状态)。
默认值:关闭
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
self.readerdevice.datamansystem()。sendcommand(“设置解码器.target解码”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。TARGET-DECODING”);
设置(或获得)居中窗口的大小。这些数字占图像的百分比。
如果条形码与居中窗口重叠,则该条形码被解码。因此,居中窗口不一定需要包含整个条形码。
默认值:50 50 10 10
例子
ReaderDevice.getDatamansystem()。sendcommand(“设置解码器。Codering-Window 50 50 5 5”);
self.readerDevice.dataManSystem().sendCommand(“SET DECODER.CENTERING-WINDOW 50 5”)
[self.readerDevice.dataManSystem sendCommand:@“设置解码器.定心窗口50 5”];
设置(或获取)如果将居中窗口添加到SVG结果。
默认值:上
例子
ReaderDevice.getDatamansystem()。sendcommand(“设置解码器.display-target on”);
self.readerdevice.datamansystem()。sendcommand(“set decoder.display-target上”)
[self.readerdevice.datamansystem sendcommand:@“set decoder.display-target上”];
评论
以下是相机扫描预览的示例,当在相机AP中启用了目标解码时(黄色,较小的矩形是目标解码窗口)I:
目标解码窗口(矩形)可以使用以下方式更改线路的颜色和重量:
MWOverlay。targetRectLineColor = Color.RED;MWOverlay。targetRectLineWidth = 2;
mwoverlay.settargetrectlineuicolor(Uicolor.Red)mwoverlay.settargetrectlineWidth(2)
[MWOverlay setTargetRectLineUIColor:(用户界面颜色redColor]];[MWOverlay setTargetRectLineWidth: 2];
如果您想一次扫描更多条形码,可以在一个扫描会话中使用多极体读数。
支持的设备:
配置DMCC:
设置译码器为成功读取结果所应查找的码数。
默认值:1
例子
readerDevice.getDataManSystem().sendCommand(“SET MULTICODE.NUM-CODES 3”);
self.readerdevice.datamansystem()。sendcommand(“设置multicode.num-codes 3”)
[self.readerdevice.datamansystem sendcommand:@“set multicode.num-codes 3”];
定义读取器如何解释要查找的代码数。
默认值:关闭
例子
ReaderDevice.getDatamansystem()。SendCommand(“设置Multicode.partial-excue”);
self.readerDevice.dataManSystem().sendCommand(“将MULTICODE.PARTIAL-RESULTS设置为ON”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。部分结果”);
如果该代码是在最近N次读取期间读取的,则不要读取该代码。
默认值:0(无限制)
例子
ReaderDevice.getDatamansystem()。sendcommand(“set decoder.reread-not-last-n 1”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1”)
[self.readerDevice.dataManSystem sendCommand:@“设置解码器。重新读取-非最后一次-N 1”];
为每个符号组定义要查找的预期最大代码数:
任何单个符号系统的预期值都可以超过参数MultiCode.num-Codes,要查找的代码总数。第1 Param是符号族组,第二个是代码的最大数量。
所有组的默认值:1
例子
readerDevice.getDataManSystem()。sendCommand(“多码。MAX-NUM-CODES 1 3”);
self.readerdevice.datamansystem()。sendcommand(“set multicode.max-num-codes 1 3”)
[self.readerdevice.datamansystem sendcommand:@“set multicode.max-num码1 3”];
评论
如果启用了多代码读取,您可以在onReadResultReceived回调函数中通过使用getsubresults()ReadResults对象的方法。如果禁用多极体读数此方法返回NULL。
解析器帮助我们将解码结果提取为结构化格式(JSON、键值),用于搜索、排序和验证。有六种类型的解析器:
此外,还可以选择在CMBSDK中使用自动解析器类型,并试图找到哪一个适合最佳。
支持的设备:
使用setParser()来自ReaderDevice对象的方法,以设置要使用的解析器类型,或getParser()获得所选类型。在与读取器设备的有效连接后设置解析器类型。默认情况下没有。
例子
setParser(ResultParser.AAMVA);
self.readerDevice.parser=CMBResultParserAAMVA
self.readerDevice.parser = CMBResultParserAAMVA;
启用所需的解析器类型后,您可以从ReadResult的onReadResultReceived回调函数中接收的结果获取结构化格式:
//从结果结果返回JSON格式的解析文本.getResuptat(0).getParsedjson();//从结果结果返回解析的文本.getResuptat(0).getParsedText();
让结果:[cmbreadresult] = ReadResults?.readResults as?[cmbreadresult][] //从结果返回JSON格式中解析的文本让Parsedjson =结果.First?.parsedjson //从结果返回解析的文本,Let ParsedText =结果.First?.parsedText
nsArray *结果= ReadResults.readResults;//从结果nsstring * parsedjson = [[结果FirstObject] Parsedjson]以JSON格式返回解析的文本;//从结果nsstring * parsedtext = [[结果FirstObject] ParseDtext]返回解析的文本;
您可以使用此功能指定将用于定位和解码符号的图像的确切区域。如果两个条形码距离很近,并且您需要确保只阅读目标区域的代码,那么这将非常有用。减少感兴趣区域并不一定会减少解码时间或增加图像传输速率。
支持的设备:
配置DMCC:
(获取|设置)译码器。投资回报率[x w y h]
检查范围为0-100,宽度和高度的最小值为5,以及参数之间隐含的约束,例如给定轴的总和不超过100。
例子
readerDevice.getDataManSystem().sendCommand(“SET DECODER.ROI-PERCENT 10 80”);
self.readerdevice.datamansystem()。sendcommand(“设置解码器.10 80 80 80”)
[self.readerDevice.dataManSystem sendCommand:@“SET DECODER.ROI-PERCENT 10 80”];
SDK可以从图像文件中解码条形码(仅限摄像机API)。支持的图像格式包括BMP,PNG和JPG。图像不能是任何大于5000 x 5000像素的像素。
支持的设备:
要扫描图像,您的应用程序必须首先将图像读入内存,然后使用图像加载DMCC命令解码它。必须在发送之前初始化和配置ReaderDevice对象图像加载指挥部。下面是使用sendCommand方法启动图像加载功能。
例子
readerDevice.getDataManSystem () .sendCommand (String.format”的形象。-> {if (response. geterror () != null) {// imageData.length (), imageData, 500, false, (dataManSystem, response) -> {if (response. geterror () !LOAD DMCC finished with error,这里处理错误}});
self.readerDevice.dataManSystem()?.sendCommand(“IMAGE.LOAD\(imageData.count)”,with:imageData,timeout:100,expectBinaryResponse:false,callback:{(response)in if response?.status!=DMCC\u status\u NO\u ERROR{//IMAGE.LOAD DMCC finished with ERROR,在此处处理错误})
注意:ImageData是图像的数据。
[self.readerDevice。dataManSystem sendCommand:(NSString stringWithFormat: @”形象。LOAD %lu", [imageData length]] withData:imageData timeout:100 expectBinaryResponse:NO callback:^(CDMResponse *response) {if (response. timeout:100);{// IMAGE. status != DMCC_STATUS_NO_ERROR);LOAD DMCC finished with error, handle the error here}}];
注意:imageData是图像的NSData。
就像实时扫描一样,当图像加载命令完成后,结果在您的读取结果数组中接收ReaderDevice的使用以下方法委派:
收到ReadResultReceived时无效(ReaderDevice阅读器,ReadResults)
func didReceiveReadResult(fromReader reader: CMBReaderDevice, results readResults: CMBReadResults!)
- (void)didreceivereadresultfromReader :( cmbreaderdevice *)阅读器结果:( cmbreadresults *)readresults;
下面你会看到一个从你的设备照片库中选择和扫描图像的例子
私有void pickimagefromgallery(){Intent IntenPhoto = New Intent(Intent.Action_Pick,Android.Provider.MediaStore.Images.Media.external_Content_URI);startactivityforresult(pickphoto,pick_image);@Override受保护的void onActivityResult(int Requescode,int结果码,Intent Data){if(请求码== pick_image &&结果== result_ok && data!= null && data.getdata()!= null && readerdevice!= null && readerdevice!getConnectionState()== connectionstate.connected){try(inputstream imagestream = getContentResolver()。OpenInputStream(data.getdata()); bytearrayoutputstram buffer = new bytearrayoutputstream()){int nread;字节[]字节=新字节[1024];while((nread = imagestream.read(字节,0,bytes.length))!= -1){buffer.write(bytes,0,nread);buffer.flush();最终的字节[] bytearray = buffer.tobytearray();readerdevice.getDatamansystem()。sendcommand(string.format(“image.load%d”,bytearray.length),bytearray,500,false,(datamansystem,response) - > {if(response.geterror()!= null){toast.makeText(mainAdivity.this,“错误[+ response.getError()。ToString()+”]:“+ response.getError()。GetLocalizedMessage(),Toast.Length_long).show();}});catch(ioException e){e.printStacktrace(); } } super.onActivityResult(requestCode, resultCode, data); }
func showImagePicker(){让imagePickerController = UIImagePickerController()allowsEditing = false imagePickerController.delegate = self imagePickerController。sourceType = . photolibrary。现在(imagePickerController, animated: true, completion: nil)} // MARK: UIImagePickerControllerDelegate方法func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info:){选择器。解雇(动画:真的,完成:nil)让imagePath = info (UIImagePickerController.InfoKey。imageURL] !NSURL guard让imageData = try?数据。init(contentsOf: imagePath.absoluteURL!) else {return} self.readerDevice.dataManSystem()?LOAD \(imageData.count)", with: imageData, timeout: 100, expectBinaryResponse: false, callback: {(response) in if response?。DMCC_STATUS_NO_ERROR {// IMAGE. status != DMCC_STATUS_NO_ERROR {// IMAGE. status !LOAD DMCC finished with error,在这里处理错误}})}
- (void)showImagePicker {UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];imagePickerController。allowsEditing =没有;imagePickerController.delegate =自我;[imagePickerController setSourceType: UIImagePickerControllerSourceTypePhotoLibrary];[self presentViewController:imagePickerController animated:YES completion:nil];} #pragma mark - UIImagePickerControllerDelegate - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{[self dismissViewControllerAnimated:YES completion:nil];NSURL *imagePath = [info valueForKey:UIImagePickerControllerImageURL];NSData *imageData = [NSData dataWithContentsOfURL:imagePath];if (imageData) {[self.readerDevice. if (imageData);dataManSystem sendCommand:(NSString stringWithFormat: @”形象。LOAD %lu", [imageData length]] withData:imageData timeout:100 expectBinaryResponse:NO callback:^(CDMResponse *response) { if (response.status != DMCC_STATUS_NO_ERROR) { // IMAGE.LOAD DMCC finished with error, handle the error here } }]; } }
由于在一些一维条形码中缺乏错误校正甚至校验和值,许多条形码容易误读和短读(只有一部分条形码被解码)。诸如打印质量差、光照不一致、图像模糊、极度倾斜和其他变量都可能造成失真。
SDK缓解误读和短读的方式之一是使用称为位置验证的功能。启用后,SDK将更加努力地验证一维条形码的边缘和完整位置;从而大大尽量减少读取错误。请注意,位置验证可以减少扫描性能,尤其是当启用多个符号符号的时或在具有较慢CPU的值线设备上使用时。
位置验证可用于以下条码类型(粗体部分默认启用此功能):代码11,代码25.,托巴马尔,代码93,代码39,代码128Telepen,MSI Plessey.,UPC / EAN。
当处理读错误时,考虑结合SDK的其他特性使用位置验证,例如设置最小读长度和调整解码器的努力水平(参见DMCC命令decoder . effort)。
支持的设备:
配置API:
例子
BarcodeScanner.MWBsetParam(BarcodeScanner.MWB_代码_掩码_39,BarcodeScanner.MWB_PAR_ID_验证_位置,BarcodeScanner.MWB_PAR_值_验证_位置_打开);
mwb_setparam(mwb_code_mask_39,uint32(mwb_par_id_verify_location),uint32(mwb_par_value_verify_location_on))
MWB_setParam (MWB_CODE_MASK_39 MWB_PAR_ID_VERIFY_LOCATION MWB_PAR_VALUE_VERIFY_LOCATION_ON);
默认情况下,当你使用摄像头API创建阅读器时,全屏预览将被使用。如果你想使用部分屏幕预览,你需要创建viewgroup.Android或布局中的容器看法然后在reader设备构造函数中发送那个容器作为参数,否则如果那个参数没有被设置或者零已设置,将使用全屏预览。
当使用部分屏幕预览时,来自摄影机的帧将填充在预览容器中,如果预览容器的纵横比不同于摄影机的纵横比,我们将执行裁剪以避免失真。
支持的设备:
例子
首先在你的布局/故事板中创建容器。
<?xml version = " 1.0 " encoding = " utf - 8 " ?> < android.support.constraint。ConstraintLayout xmlns: android = " http://schemas.android.com/apk/res/android " xmlns:应用= " http://schemas.android.com/apk/res-auto " xmlns:工具= " http://schemas.android.com/tools " android: layout_width =“match_parent”android: layout_height =“match_parent”android:背景=“333333 #”工具:= " cognex.com.cmbcamerademo.ScannerActivity " > < RelativeLayout上下文android:id="@+id/rlPreviewContainer" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintBottom_toTopOf="@id/listResult" app:layout_constraintStart_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> ....
稍后创建读取器设备在读取器设备构造函数中发送该容器作为参数
ReaderDevice = ReaderDevice.getPhonecamerAdevice(param_cameramode,previewoption.defaults,(ViewGroup)findViewById(R.id.rlPreviewContainer);
将新添加的UIView连接到ViewController中的outlet
@IBV预览容器:UIView!
然后使用previewContainer作为构造函数中的参数创建readerDevice
让readerDevice = CMBReaderDevice。readerOfDeviceCamera(:自我。cameraMode previewOptions: CDMPreviewOption。init (rawValue: 0), previewView self.previewContainer):
将新添加的UIView连接到ViewController中的outlet
@属性(弱、非原子)IBUIView*previewContainer;
然后使用previewContainer作为构造函数中的参数创建readerDevice
CMBReaderDevice*readerDevice=[CMBReaderDevice readerOfDeviceCameraWithCameraMode:cameraMode预览选项:kCDMPreviewOptionDefaults预览视图:self.previewContainer];
这是它看起来的样子