我想扫描黑色方案上黑色的 QR 码,即 QR 码在黑色背景上,QR 码也是黑色的,用点创建。 我尝试使用 Vision Framework 和 AVFoundation 来扫描这种类型的 QR(黑色方案 QR),还尝试通过降低和提高 ISO 来使用 ISO,但它没有用。
请提出任何想法,我怎样才能达到结果?
import Foundation
import UIKit
import AVFoundation
import Vision
class qrVC: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {
var captureSession: AVCaptureSession!
var previewLayer: AVCaptureVideoPreviewLayer!
let filter = CIFilter(name: "CIPhotoEffectMono")
override func viewDidLoad() {
super.viewDidLoad()
captureSession = AVCaptureSession()
captureSession.startRunning()
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }
let videoInput: AVCaptureDeviceInput
do {
videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)
} catch {
return
}
if (captureSession.canAddInput(videoInput)) {
captureSession.addInput(videoInput)
} else {
return
}
let videoOutput = AVCaptureVideoDataOutput()
videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoQueue"))
captureSession.addOutput(videoOutput)
videoOutput.connection(with: .video)?.videoOrientation = .portrait
previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
previewLayer.frame = view.layer.bounds
previewLayer.videoGravity = .resizeAspectFill
view.layer.addSublayer(previewLayer)
}
func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
guard let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }
let imageRequestHandler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, orientation: .up, options: [:])
guard let filteredPixelBuffer = applyFilter(to: pixelBuffer) else { return }
let previewImage = CIImage(cvPixelBuffer: filteredPixelBuffer)
let context = CIContext()
guard let previewCGImage = context.createCGImage(previewImage, from: previewImage.extent) else { return }
DispatchQueue.main.async {
self.previewLayer.contents = previewCGImage
}
do {
try imageRequestHandler.perform([detectQRCodeRequest])
} catch {
print(error)
}
}
// ----- detectQRCodeRequest -----
lazy var detectQRCodeRequest: VNDetectBarcodesRequest = {
let detectBarcodeRequest = VNDetectBarcodesRequest(completionHandler: { request, error in
if let results = request.results {
if let result = results.first as? VNBarcodeObservation {
if let payload = result.payloadStringValue {
DispatchQueue.main.async {
// Handle the decoded payload string value here
print(payload)
let alert = UIAlertController(title: "Alert", message: payload, preferredStyle: UIAlertController.Style.alert)
alert.addAction(UIAlertAction(title: "Click", style: UIAlertAction.Style.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
}
}
}
})
detectBarcodeRequest.symbologies = [.qr, .ean8, .ean13, .pdf417, .aztec, .code39, .code93, .code128, .itf14, .dataMatrix]
return detectBarcodeRequest
}()
func applyFilter(to pixelBuffer: CVPixelBuffer) -> CVPixelBuffer? {
// Convert pixel buffer to CIImage
let image = CIImage(cvPixelBuffer: pixelBuffer)
// Apply filter to CIImage
filter?.setValue(image, forKey: kCIInputImageKey)
guard let outputImage = filter?.outputImage else { return nil }
// Render filtered CIImage to CVPixelBuffer
var outputPixelBuffer: CVPixelBuffer?
CVPixelBufferCreate(nil, Int(outputImage.extent.width), Int(outputImage.extent.height), kCVPixelFormatType_32BGRA, nil, &outputPixelBuffer)
let context = CIContext()
context.render(outputImage, to: outputPixelBuffer!)
return outputPixelBuffer
}
}
示例照片