VNUtils
Visionが返す結果は基本的に正規化されているが、他のiOSフレームワークで取り扱う場合にピクセルサイズに変換する必要が生じることは多い(例:トラッキング中の矩形をCore Graphicsで可視化する場合)。
で、そういう変換処理をいつも自前で書いてしまうのだが、そういえばVision標準で既に用意されてるのだったと思い出したので備忘録としてここに貼り付けておく。
## VNImageRectForNormalizedRect
正規化されたCGRectをピクセル単位でのCGRectに変換する。
/**
@discussion Returns a rectangle in (possibly non-integral) image coordinates that is projected from a rectangle in a normalized coordinate space.
@param normalizedRect The rectangle in the normalized coordinate space of [0..1].
@param imageWidth The pixel width of the image.
@param imageHeight The pixel height of the image.
@return the rectangle in pixel coordinates.
*/
@available(iOS 11.0, *)
public func VNImageRectForNormalizedRect(_ normalizedRect: CGRect, _ imageWidth: Int, _ imageHeight: Int) -> CGRect
これは物体検出・トラッキング系で必ず使う。こんな感じで:
let imageRect = VNImageRectForNormalizedRect(bestResult.boundingBox,
imageSize.width,
imageSize.height)
で、(気の利いてないことに)この関数は原点の変換はやってくれない。Visionの座標系に則った左下原点のまま。つまりこのimageRectのoriginは顔の矩形の左下の座標を表している。
次のように補正してやる必要がある。
let y = imageSize.height - imageRect.maxY
let fixedRect = CGRect(origin: CGPoint(x: imageRect.minX, y: y), size: imageRect.size)
## VNNormalizedRectForImageRect
最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/