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

ここから先は

3,530字
文章やサンプルコードは多少荒削りかもしれませんが、ブログや書籍にはまだ書いていないことを日々大量に載せています。たったの400円で、すぐに購読解除してもその月は過去記事もさかのぼって読めるので、少しでも気になる内容がある方にはオトクかと思います。

技術的なメモやサンプルコード、思いついたアイデア、考えたこと、お金の話等々、頭をよぎった諸々を気軽に垂れ流しています。

最後まで読んでいただきありがとうございます!もし参考になる部分があれば、スキを押していただけると励みになります。 Twitterもフォローしていただけたら嬉しいです。 https://twitter.com/shu223/