を使用しCIDetector
て、長方形の画像に置き換えたい長方形を検出しています。
検出は正常に機能しており、その上にオーバーレイを描画できます。画像をすべてのコーナーに合わせて貼り付けるにはどうすればよいですか?
コードは次のとおりです。
func drawHighlightOverlayForPoints(image: CIImage, topLeft: CGPoint, topRight: CGPoint,
bottomLeft: CGPoint, bottomRight: CGPoint) -> CIImage {
var overlay = CIImage(color: CIColor(red: 1.0, green: 0, blue: 0, alpha: 0.5))
overlay = overlay.imageByCroppingToRect(image.extent)
overlay = overlay.imageByApplyingFilter("CIPerspectiveTransformWithExtent",
withInputParameters: [
"inputExtent": CIVector(CGRect: image.extent),
"inputTopLeft": CIVector(CGPoint: topLeft),
"inputTopRight": CIVector(CGPoint: topRight),
"inputBottomLeft": CIVector(CGPoint: bottomLeft),
"inputBottomRight": CIVector(CGPoint: bottomRight)
])
return overlay.imageByCompositingOverImage(image)
}
オーバーレイを単純に画像に置き換えると、画像が非常に小さく表示され、特定の 1 つの角だけにくっついて四角形が塗りつぶされません。
let testImage = UIImage(named: "card.jpg")
var overlayImage = CIImage(image: testImage!)
アップデート:
Simons プロジェクトを使用すると、私が望んでいた結果が得られますが、しばらくするとフレーム レートが 1 fps 未満に低下します。
func newCameraImage(cameraCaptureHelper: CameraCaptureHelper, image: CIImage)
{
//halftone.setValue(image, forKey: kCIInputImageKey)
if let rect = detector.featuresInImage(image).first as? CIRectangleFeature {
perspectiveTransform.setValue(CIVector(CGPoint:rect.topLeft),
forKey: "inputTopLeft")
perspectiveTransform.setValue(CIVector(CGPoint:rect.topRight),
forKey: "inputTopRight")
perspectiveTransform.setValue(CIVector(CGPoint:rect.bottomRight),
forKey: "inputBottomRight")
perspectiveTransform.setValue(CIVector(CGPoint:rect.bottomLeft),
forKey: "inputBottomLeft")
perspectiveTransform.setValue(addImage,
forKey: kCIInputImageKey)
composite.setValue(image, forKey: kCIInputBackgroundImageKey)
composite.setValue(perspectiveTransform.outputImage!, forKey: kCIInputImageKey)
// let transformFinal = composite.outputImage
imageView.image = composite.outputImage
} else {
imageView.image = image
}
}