ios - AV Foundation 相机扫描箱内
<p><p> <a href="/image/LrFHJ.png" rel="noreferrer noopener nofollow"><img src="/image/LrFHJ.png" alt="enter image description here"/></a> </p>
<p>我能够成功扫描具有完整相机分辨率的条形码,但我希望它只能扫描特定框架内的条形码(位于中心的框)。如果条形码位于该框架之外,则不应扫描。 </p>
<pre><code>var session : AVCaptureSession = AVCaptureSession()
var previewLayer : AVCaptureVideoPreviewLayer!
var highlightView : UIView = UIView()
func opencamera()
{
if session.running
{
}
else
{
session = AVCaptureSession()
// Set the captureDevice.
let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
session.sessionPreset = AVCaptureSessionPresetInputPriority
// Create input object.
let videoInput: AVCaptureDeviceInput?
do {
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
} catch {
return
}
// Add input to the session.
if (session.canAddInput(videoInput)) {
session.addInput(videoInput)
} else {
scanningNotPossible()
}
let metadataOutput = AVCaptureMetadataOutput()
// Add output to the session.
if (session.canAddOutput(metadataOutput)) {
session.addOutput(metadataOutput)
// Send captured data to the delegate object via a serial queue.
metadataOutput.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue())
// Set barcode type for which to scan: EAN-13.
//metadataOutput.metadataObjectTypes = metadataOutput.availableMetadataObjectTypes
metadataOutput.metadataObjectTypes = [AVMetadataObjectTypeUPCECode,
AVMetadataObjectTypeCode39Code,
AVMetadataObjectTypeCode39Mod43Code,
AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeEAN8Code,
AVMetadataObjectTypeCode93Code,
AVMetadataObjectTypeCode128Code,
AVMetadataObjectTypePDF417Code,
]
} else {
scanningNotPossible()
}
previewLayer = AVCaptureVideoPreviewLayer(session: session);
previewLayer.frame = self.view.frame
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
previewLayer?.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))
image.layer.addSublayer(previewLayer);
session.startRunning()
}
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: !, fromConnection connection: AVCaptureConnection!) {
//var highlightViewRect = CGRectZero
// var barCodeObject : AVMetadataObject!
var detectionString : String!
let barCodeTypes = [AVMetadataObjectTypeUPCECode,
AVMetadataObjectTypeCode39Code,
AVMetadataObjectTypeCode39Mod43Code,
AVMetadataObjectTypeEAN13Code,
AVMetadataObjectTypeEAN8Code,
AVMetadataObjectTypePDF417Code,
]
// The scanner is capable of capturing multiple 2-dimensional barcodes in one scan.
for metadata in metadataObjects {
for barcodeType in barCodeTypes {
let decodedData:AVMetadataMachineReadableCodeObject =metadata as! AVMetadataMachineReadableCodeObject
if metadata.type == barcodeType {
detectionString = (metadata as! AVMetadataMachineReadableCodeObject).stringValue
if(metadata.type== AVMetadataObjectTypeEAN13Code){
if (detectionString.hasPrefix("0") && detectionString.characters.count > 1){
detectionString = String(detectionString.characters.dropFirst())
}
}
AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
self.session.stopRunning()
break
}
}
}
print(detectionString)
self.previewLayer.removeFromSuperlayer()
self.highlightView.removeFromSuperview()
}
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>尝试为您的 <code>AVCaptureMetaDataOutput</code> 设置 <code>rectOfInterest</code>。</p>
<pre><code>self.metadataOutput.rectOfInterest = ;
</code></pre>
<p>根据 <a href="https://developer.apple.com/reference/avfoundation/avcapturemetadataoutput/1616291-rectofinterest" rel="noreferrer noopener nofollow">documentation</a> </p>
<blockquote>
<p>rectOfInterest A rectangle of interest for limiting the search area
for visual metadata.</p>
<p>The value of this property is a CGRect value that determines the
object’s rectangle of interest for each frame of video.</p>
<p>The rectangle's origin is top left and is relative to the coordinate
space of the device providing the metadata.</p>
<p>Specifying a rectangle of interest may improve detection performance
for certain types of metadata. Metadata objects whose bounds do not
intersect with the rectOfInterest will not be returned.</p>
<p>The default value of this property is a rectangle of (0.0, 0.0, 1.0,
1.0).</p>
</blockquote>
<p>请注意,该值不是您的像素。看看 SO 答案 <a href="https://stackoverflow.com/questions/32401364/how-do-i-use-the-metadataoutputrectofinterestforrect-method-and-rectofinterest-p" rel="noreferrer noopener nofollow">here</a>和 <a href="https://stackoverflow.com/questions/26634036/xcode-avcapturesession-scan-barcode-in-specific-frame-rectofinterest-is-not-wor" rel="noreferrer noopener nofollow">here</a>了解更多信息。</p></p>
<p style="font-size: 20px;">关于ios - AV Foundation 相机扫描箱内,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/41340123/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/41340123/
</a>
</p>
页:
[1]