目标解码模拟激光条形码扫描仪的行为。但是,阅读器不查看整个视野,而是尝试解码仅位于激光瞄准点下方的条形码。这可防止操作员意外读取附近的其他条形码。
支持的设备:
配置DMCC:
启用或禁用目标解码(或检索其状态)。
默认值:关闭
例子
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
readerDevice.getDataManSystem()。sendCommand(“设置解码器。TARGET-DECODING”);
self.readerDevice.dataManSystem().sendCommand(“将DECODER.TARGET-DECODING设置为ON”)
[self.readerDevice.dataManSystem sendCommand:@“设置解码器.TARGET-DECODING ON”];
设置(或获得)居中窗口的大小。这些数字占图像的百分比。
如果条形码与定心窗口重叠,则该条形码将被解码。因此,居中窗口不一定需要包含整个条形码。
默认值: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(“将DECODER.DISPLAY-TARGET设置为ON”)
[self.readerdevice.datamansystem sendcommand:@“set decoder.display-target上”];
评论
以下是在相机AP中启用目标解码时相机的扫描预览示例(黄色,较小的矩形为目标解码窗口)I:
目标解码窗口(矩形)可以使用以下方式更改线路的颜色和重量:
如果您想在一次扫描过程中扫描多个条形码,您可以使用多极体读数。
支持的设备:
配置DMCC:
设置解码器应为成功读取结果找到的代码数。
默认值:1
例子
readerDevice.getDataManSystem().sendCommand(“SET MULTICODE.NUM-CODES 3”);
self.readerDevice.dataManSystem().sendCommand(“SET MULTICODE.NUM-CODES 3”)
[self.readerDevice.dataManSystem sendCommand:@“SET MULTICODE.NUM-CODES 3”];
定义读取器如何解释要查找的代码数。
默认值:关闭
例子
readerDevice.getDataManSystem().sendCommand(“将MULTICODE.PARTIAL-RESULTS设置为ON”);
self.readerDevice.dataManSystem().sendCommand(“将MULTICODE.PARTIAL-RESULTS设置为ON”)
[self.readerDevice。dataManSystem sendCommand: @”设置多码。部分结果”);
如果该代码是在最近N次读取期间读取的,则不要读取该代码。
默认值:0(无限制)
例子
readerDevice.getDataManSystem().sendCommand(“SET DECODER.REREAD-NOT-LAST-n1”);
self.readerDevice.dataManSystem().sendCommand(“SET DECODER.REREAD-NOT-LAST-N 1”)
[self.readerDevice.dataManSystem sendCommand:@“设置解码器。重新读取-非最后一次-N 1”];
为每个符号组定义要查找的预期最大代码数:
任何单个符号的预期值都不能超过参数MULTICODE.NUM-CODES,即要查找的代码总数。第一个参数是符号组,第二个参数是最大代码数。
默认值: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回调函数中接收的结果获取结构化格式:
//从result.getResultAt(0.getParsedJSON()返回json格式的解析文本//从结果返回已解析的文本。getResultAt(0)。getParsedText();
let results:[CMBReadResult]=readResults?。readResults为?[CMBReadResult]??[]//从结果let parsedJSON=results.first?.parsedJSON//返回json格式的解析文本,从结果let parsedText=results.first?.parsedText//返回解析文本
nsArray *结果= ReadResults.readResults;//从结果nsstring * parsedjson = [[结果FirstObject] Parsedjson]以JSON格式返回解析的文本;//从结果nsstring * parsedtext = [[结果FirstObject] ParseDtext]返回解析的文本;
您可以使用此功能指定用于定位和解码符号的图像的确切区域。如果两个条形码彼此非常接近,并且您需要确保仅沿目标区域读取代码,则此功能可能会有所帮助。减少感兴趣区域并不一定会减少解码时间或增加解码时间e图像传输速率。
支持的设备:
配置DMCC:
(准备就绪)解码器.ROI百分比[X W Y H]
检查范围为0-100,宽度和高度的最小值为5,以及参数之间隐含的约束,例如给定轴的总和不超过100。
例子
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(){let imagePickerController=UIImagePickerController()imagePickerController.allowsEditing=false imagePickerController.delegate=self imagePickerController.sourceType=.photoLibrary self.present(imagePickerController,动画:true,完成:nil)}//MARK:UIImagePickerController删除方法func imagePickerController(picker:UIImagePickerController,didFinishPickingMediaWithInfo:[UIImagePickerController.InfoKey:Any]){picker.Dismise(动画:true,完成:nil)让imagePath=info[UIImagePickerController.InfoKey.imageURL]作为!NSURL guard让imageData=try?Data.init(contentsOf:imagePath.absoluteURL!)else{return}self.readerDevice.dataManSystem()?.sendCommand(“IMAGE.LOAD\(imageData.count)”,带:imageData,超时:100,expectBinaryResponse:false,回调:{(response)in if response?.status!=DMCC_status_NO(错误{//IMAGE.LOAD DMCC finished with ERROR,在此处处理错误}})
-(void)showImagePickerController{UIImagePickerController*imagePickerController=[[UIImagePickerController alloc]init];imagePickerController.AllowsEdit=NO;imagePickerController.delegate=self;[imagePickerController设置资源类型:UIImagePickerController资源类型PhotoLibrary];[self-presentViewController:imagePickerController已设置动画:是完成:否];#pragma标记-UIImagePickerController删除-(void)imagePickerController:(UIImagePickerController*)picker完成了PickingMediaWithInfo:(NSDictionary*)信息{[self-DismissionViewController已设置:是完成:否];NSURL*图像路径=[info valueForKey:UIImagePickerControllerImageURL];NSData*imageData=[NSData dataWithContentsOfURL:imagePath];if(imageData){[self.readerDevice.dataManSystem sendCommand:[NSString stringWithFormat:@“IMAGE.LOAD%lu”,[imageData length]]with数据:imageData超时:100 expectBinaryResponse:无回调:^(CDMRResponse*response){if(response.status!=DMCC_status_NO_ERROR){//IMAGE.LOAD DMCC已完成,但有错误,请在此处处理错误}}}}};}
由于在一些一维条形码中缺乏错误校正甚至校验和值,许多条形码容易误读和短读(只有一部分条形码被解码)。诸如打印质量差、光照不一致、图像模糊、极度倾斜和其他变量都可能造成失真。
SDK减轻误读和短读的方法之一是使用一种称为位置验证的功能。启用后,SDK将更加努力地验证一维条码的边缘和完整位置;从而大大减少了读取错误。请注意,位置验证可能会降低扫描性能,特别是当启用多个符号或在CPU速度较慢的值线设备上使用时。
位置验证可用于以下条码类型(粗体部分默认启用此功能):代码11,代码25,库德巴,代码93,代码39,代码128Telepen,MSI Plessey.,UPC / EAN。
当处理读错误时,考虑结合SDK的其他特性使用位置验证,例如设置最小读长度和调整解码器的努力水平(参见DMCC命令decoder . effort)。
支持的设备:
配置API:
例子
默认情况下,当你使用摄像头API创建阅读器时,全屏预览将被使用。如果你想使用部分屏幕预览,你需要创建viewgroup.android或android的布局中的容器看法如果未设置该参数或零已设置,将使用全屏预览。
当使用部分屏幕预览时,来自摄影机的帧将填充在预览容器中,如果预览容器的纵横比不同于摄影机的纵横比,我们将执行裁剪以避免失真。
支持的设备:
例子
首先在布局/情节提要中创建容器。
<?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(this,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];
这是它看起来的样子