目标解码模拟激光条码扫描器的行为。然而,读者不是看整个视野,而是试图解码只在激光瞄准点下的条形码。这可以防止操作人员意外读取附近的其他条形码。
支持设备:
配置dmcc:
启用或禁用目标解码(或检索它的状态)。
默认值:从
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。TARGET-DECODING”);
设置(或获得)居中窗口的大小。这些数字占图像的百分比。
如果条形码与居中窗口重叠,则对该条形码进行解码。因此,居中窗口不一定需要包含整个条形码。
默认值:50 50 10 10
例子
ReaderDevice.getDatamansystem()。sendcommand(“设置解码器。Codering-Window 50 50 5 5”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。中心窗50 50 5 5”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。居中窗50 50 5 5"];
如果将居中窗口添加到SVG结果,则设置(或获取)。
默认值:上
例子
ReaderDevice.getDatamansystem()。sendcommand(“设置解码器.display-target on”);
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。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(“多码。NUM-CODES 3”);
self.readerDevice.dataManSystem()。sendCommand(“多码。NUM-CODES 3”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。NUM-CODES 3”);
定义读者如何解释要查找的代码数量。
默认值:从
例子
readerDevice.getDataManSystem()。sendCommand(“多码。部分结果”);
self.readerDevice.dataManSystem()。sendCommand(“多码。部分结果”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。部分结果”);
如果该代码是在最近N次读取期间读取的,则不要读取该代码。
默认值:0(无限制)
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1 ");
self.readerDevice.dataManSystem()。sendCommand(“设置解码器。REREAD-NOT-LAST-N 1”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。REREAD-NOT-LAST-N 1 ");
为每个符号组定义期望的最大编码数:
任何单一符号的期望值都不能超过MULTICODE参数。num代码,要找到的代码的总数。第一个参数是符号群,第二个参数是最大码数。
缺省值: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, Key-Value),用于搜索、排序和验证。解析器有六种类型:
在cmbSDK中也有使用AUTO解析器类型的选项,它会尝试找到最适合的。
支持设备:
使用setParser()方法来设置要使用的解析器类型,或getParser ()获得所选类型。在与读取器设备的有效连接后设置解析器类型。默认情况下没有。
例子
readerDevice.setParser (ResultParser.AAMVA);
self.readerDevice.parser = CMBResultParserAAMVA
self.readerDevice.parser = CMBResultParserAAMVA;
你可以在ReadResult的onReadResultReceived回调函数中获得结构化的格式,在你启用所需的解析器类型后:
//从结果中返回json格式的解析文本。//从结果结果中返回解析后的文本。
让结果:[CMBReadResult] = readResults?。readResults一样吗?(CMBReadResult) ? ?[] //从结果返回json格式的解析文本让parsedJSON = results.first?parsedJSON //从结果返回解析的文本让parsedText = results.first
nsArray *结果= ReadResults.readResults;//从结果nsstring * parsedjson = [[结果FirstObject] Parsedjson]以JSON格式返回解析的文本;//从结果nsstring * parsedtext = [[结果FirstObject] ParseDtext]返回解析的文本;
您可以使用此功能指定将用于定位和解码符号的图像的确切区域。如果两个条形码距离很近,并且您需要确保只阅读目标区域的代码,那么这将非常有用。减少感兴趣区域并不一定会减少解码时间或增加图像传输速率。
支持设备:
配置dmcc:
(获取|设置)译码器。投资回报率[x w y h]
检查0-100的范围,以及宽度和高度的最小值为5,以及参数之间的约束,例如给定轴的总和不超过100。
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。投资回报率10 80 10 80”);
self.readerdevice.datamansystem()。sendcommand(“设置解码器.10 80 80 80”)
[self.readerDevice。dataManSystem sendCommand: @”设置解码器。投资回报率10 80 10 80”];
SDK可以从图像文件中解码条形码(仅限摄像机API)。支持的图像格式包括BMP,PNG和JPG。图像不能是任何大于5000 x 5000像素的像素。
支持设备:
要扫描映像,应用程序必须首先将映像读入内存,然后使用的形象。负载DMCC命令解码它。必须在发送之前初始化和配置ReaderDevice对象的形象。负载命令。下面是使用sendCommand方法初始化的形象。负载函数。
例子
readerDevice.getDataManSystem () .sendCommand (String.format”的形象。负载%d", imageData.length), imageData, 500, false, (dataManSystem, response) -> { if (response.getError() != null) { // IMAGE.LOAD DMCC finished with error, handle the error here } });
self.readerDevice.dataManSystem () ? .sendCommand(”的形象。负载\(imageData.count)", with: imageData, timeout: 100, expectBinaryResponse: false, callback: { (response) in if response?.status != DMCC_STATUS_NO_ERROR { // IMAGE.LOAD DMCC finished with error, handle the error here } })
注意:ImageData是图像的数据。
[self.readerDevice。dataManSystem sendCommand:(NSString stringWithFormat: @”形象。负载%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 } }];
注意:imageData是图像的NSData。
就像实时扫描一样,当的形象。负载命令完成后,结果在您的读取结果数组中接收ReaderDevice的使用以下方法委托:
void onReadResultReceived(ReaderDevice reader, ReadResults results)
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()?负载\(imageData.count)", with: imageData, timeout: 100, expectBinaryResponse: false, callback: { (response) in if response?.status != DMCC_STATUS_NO_ERROR { // IMAGE.LOAD DMCC finished with error, handle the error here } }) }
- (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: @”形象。负载 %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,Codabar代号93,代号39,代码128Telepen,MSI Plessey.,UPC / EAN。
当处理读错误时,考虑结合SDK的其他特性使用位置验证,例如设置最小读长度和调整解码器的努力水平(参见DMCC命令decoder . effort)。
支持设备:
配置API:
例子
BarcodeScanner.MWBsetParam (BarcodeScanner。MWB_CODE_MASK_39 BarcodeScanner。MWB_PAR_ID_VERIFY_LOCATION BarcodeScanner.MWB_PAR_VALUE_VERIFY_LOCATION_ON);
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。违约,(ViewGroup) findViewById (R.id.rlPreviewContainer));
将新添加的UIView连接到ViewController中的outlet
@IBOutlet弱var previewContainer: UIView!
然后在构造函数中使用previewContainer作为参数创建readerDevice
让readerDevice = CMBReaderDevice。readerOfDeviceCamera(:自我。cameraMode previewOptions: CDMPreviewOption。init (rawValue: 0), previewView self.previewContainer):
将新添加的UIView连接到ViewController中的outlet
@property (weak, nonatomic) IBOutlet UIView *previewContainer;
然后在构造函数中使用previewContainer作为参数创建readerDevice
CMBReaderDevice *readerDevice = [CMBReaderDevice readerOfDeviceCameraWithCameraMode:cameraMode previewOptions:kCDMPreviewOptionDefaults previewView:self.previewContainer];
这是它看起来的样子