๐ฑBrain Buddy โ๏ธ
2023๋ 5์ 17์ผ ~ 2023๋ 6์์ค ( ์ฝ 3์ฃผ )
- ๊ธฐํ
- ๊ฐ๋ฐ๊ณผ์
- ์๋ฌ์ฌํญ
๊ธฐํ
์ฌ์ค ๊ธฐํ์๋๋ ํ๋ถ ์์ ์ข ์ด์ ์ ์ด๊ฐ๋ฉฐ ์๊ธฐํ๋ฉฐ ๊ณต๋ถํ๋ ๋์ ๋ชจ์ต์ ๋ ์ฌ๋ฆฌ๊ณ ๊ธฐํํ๊ฒ ๋์๋ค.
์ ๊ณต์์ ์ ์๋ ๋ด์ฉ์ ๋ฐฑ์ง์ ์ฎ๊ฒจ ์ ์ด๊ฐ๋ฉฐ ์ธ์ฐ๊ณ ๋ฌ์๋, ์ด๋ฅผ ๋ค์ ๋น์นธ์ ๋ด๊ฐ ๋ง๋ค์ด์ ์ ์ธ์ ๋ ์ํ ๋ณด๊ณ ์ถ์๋๋ฐ
๋น์นธ์ ๋ง๋ค์๊ฐ์ ์ฐจ๋ผ๋ฆฌ ์กฐ๊ธ ๋ ์ธ์ฐ๋๋ฐ ์ง์ค์ ํด๋ณด๊ณ ์ ํ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋์
์ฌ์ฉ์๊ฐ ์ค์ค๋ก ๊ณต๋ถํ๋ฉฐ ๋ฐฑ์ง์ ์ ์ ๋ด์ฉ๋ค์ ์ฌ์ง์ผ๋ก ์ฐ์ผ๋ฉด ํด๋น ๋ด์ฉ์ค์์ ๋๋ค์ผ๋ก ๋น์นธ์ ์์ฑํด์ฃผ๋ฉฐ
๋น์นธ ๋ด์ฉ์ ์ฑ์๋ณผ ์ ์๋ ์ฑ์ ์๊ฐํ๊ฒ ๋์๋ค.
๋ํ ์ค์ ๋ก ํ์ ์ด์ฉํด ์ํ์ ๋ณด๋ ๊ฒ๊ณผ ๊ฐ์ ๋๋์ ์ฃผ๊ธฐ ์ํด์
ํ ์คํธ ์ ๋ ฅ๋ณด๋ค๋ ์ ํํ์ฌ์ ์ฌ์ฉํ์ฌ ์ง์ ์ธ ์ ์๋
iPad ์ ์ฉ ์ฑ์ผ๋ก ๊ฐ๋ฐ ํ๊ธฐ๋ก ํ์๋ค.
๊ทธ๋ ๊ฒ ์ฌ์ง์ธ์, ํ ์คํธ ๋ณํ ๋ฑ ์ฌ๋ฌ๊ฐ์ง ๊ธฐ์ ๋ค์ ์ฐพ์๋ณด๋ค๊ฐ
iOS๋ด VisionFramework๊ฐ ์กด์ฌํ๊ณ ํด๋น VisionKit์ด ์กฐ๊ธ์ฉ ์ ๋ฐ์ดํธ๋์ด ํ์ฌ 3๊น์ง ๋์์๋ค๋๊ฒ์ ๋ณด๊ฒ ๋์๊ณ
์ด ๋ด์ฅ ๊ธฐ์ ์ ์ฌ์ฉํ๊ธฐ๋ก ํ์ต๋๋ค.
๊ฐ๋ฐ ๊ณผ์
ํ ๋์ ๋ค์ด์ค๋ฉฐ ์ง๊ด์ ์ด๊ณ ํ์ผ ์ ์ฅ๊ณผ ๋ถ๋ฌ์ค๋ ๊ฒ์ ํธํ๊ฒ -> CollectionView & Cell
ํ ์คํธ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๊ณ๊ฐ ์ฝ์ ์ ์๋ ํ ์คํธ ํฌ๋งท์ผ๋ก ๋ณํ -> VisionKit Framework
์ฌ์ฉ์์๊ฒ ์ฑ ์ฌ์ฉ ๋ฐฉ๋ฒ ์๋ ค์ฃผ๊ธฐ -> Onboarding
์ ์ฒด์ ์ธ ๋ ์ด์์์ SnapKit์ ์ฌ์ฉํ๋ค.
๐ VisionKit ์ฌ์ฉ๊ณผ์
1. Vision ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ํฌํธ
2. CGImage๋ก ์ด๋ฏธ์ง ํ์ ๋ณํ
์ด๋ฏธ์ง ์ธ์์ ์์ฒญํ๋ handler๋ฅผ ์์ฑํ ๋
= VNImageRequestHandler( cgImage: , options: [:])
cgImage๋ฅผ ์๊ตฌํ๋ค. ์ํ๋ UIImage๋ฅผ cgImage๋ก ๋ณํํ๋ค.
3. VNRecognizeTextRequest ์ธ์คํด์ค ์์ฑ
๋ณธ๊ฒฉ์ ์ธ VisionKit ์ฌ์ฉ์ด๋ค.
VisionKit์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ฐ์ฅ ๋จผ์ ์ธ์คํด์ค ์์ฑ๋ถํฐ ํด์ผํ๋ค.
4. Vision ๋ฒ์ ๊ณผ ์ธ์ด ์ค์
VNRecognizeTextRequest๋ ์ฌ๋ฌ๊ฐ์ง ์ต์ ์ ์ ๊ณตํ๋ค.
์ธ์คํด์ค๋ฅผ ์์ฑํ์ผ๋ฉด ์ต์ ์ค์ ์ ํ๋ฉด ๋๋ค.
revision : VNRecognizeTextRequest์ ๋ฒ์ ์ ํ
( 2023.12์ ๊ธฐ์ค revision3๊ฐ ๊ฐ์ฅ ์ต์ ๋ฒ์ )
recognitionLevel : ๋ฒ์ ์ธ์์ ์ ํ๋ ๋ ๋ฒจ
recognitionLanguages : ๋ฒ์ญ ํ ์ธ์ด ์ ํ
VisionKit์ ๊ฒฝ์ฐ ์ง์ํ๋ ์ธ์ด๊ฐ ํ์ ์ ์ธ๋ฐ
๋ด๊ฐ ์ํ๋ ์ธ์ด๊ฐ ์ง์ํ๋์ง ํ์ธํ ์ ์๋ ํจ์๊ฐ ์๋ค.
supportedRecognitionLanguages() : ํจ์ ํธ์ถ ์ ์ง์ํ๋ ์ธ์ด ํ์ธ ๊ฐ๋ฅ
iOS16์ด์, VNRecognizeTextRequestRevision3 ๋ฒ์ = 14๊ฐ์ง ์ธ์ด ์ง์
' ์์ด, ๋ถ์ด, ์ดํ๋ฆฌ์์ด, ๋ ์ผ์ด, ์คํ์ธ์ด, ํฌ๋ฅดํฌ์นผ์ด(๋ธ๋ผ์ง), ์ค๊ตญ์ด ๊ฐ์ฒด, ์ค๊ตญ์ด ๋ฒ์ฒด, ๊ด๋์ด ๊ฐ์ฒด, ๊ด๋์ด ๋ฒ์ฒด,
ํ๊ธ, ์ผ๋ณธ์ด, ๋ฌ์์์ด, ์ฐํฌ๋ผ์ด๋์ด '
5. RequestHandler ๋์
์์์ ์ค์ ํ handler, request๋ฅผ ๋์ํ๋ค.
ํด๋น ๊ธฐ์ ์ ํด๋นํ๋ ์ ์ฒด ์ฝ๋
/// Visision : Image -> TextRecognition
private func recognizerText(image: UIImage?) { // ์ด๋ฏธ์ง๋ ์ ํ์ฌํญ
guard let cgImage = image?.cgImage else { return } // Ui ์ด๋ฏธ์ง์ CG์ด๋ฏธ์ง ๋ฒ์ ์ ์ป๋ ๊ฒ
// Handler
let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
// Reqeust ( ํ
์คํธ ๊ฐ์ง๋ฅผ ์ํ ์์ฒญ ์์ฑ )
let request = VNRecognizeTextRequest{ [weak self] request, error in
// ์ค์ ๊ด์ฐฐ๋ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ ( request.results = ๊ด์ฐฐ / ์ฌ๊ธฐ์์ ๋ฌธ์์ด์ ๊ฐ์ ธ์ค๊ณ )
guard let observations = request.results as? [VNRecognizedTextObservation],
error == nil else {
return
}
// ์์ถ๋งคํ
let text = observations.compactMap({
$0.topCandidates(1).first?.string
}).joined(separator:"\n") // ์ค๋ฐ๊ฟ์ผ๋ก ๊ตฌ๋ถ
DispatchQueue.main.async {
self?.addImageView.setTextViewText(text)
self?.textTemp = text
}
}
request.recognitionLevel = .accurate // ์ ํ๋ ๋ ๋ฒจ
request.recognitionLanguages = ["ko","en","zh-Hans","ja"] // ํ
์คํธ ๊ฐ์ง ์ธ์ด -> ํ๊ตญ์ด, ์์ด, ์ค๊ตญ์ด ์ผ๋ณธ์ด
request.usesLanguageCorrection = true
request.revision = VNRecognizeTextRequestRevision3 // ๋ฒ์
// Process request
do {
try handler.perform([request]) // Handler์์ ์์ฒญ ์ํ
}
catch {
addImageView.setTextViewText("\(error)")
}
}
์๋ฌ์ฌํญ
Onboarding ํ๋ฉด์ ์ ์ธํ Vision ๊ธฐ์ , ์ ์ฒด์ ์ธ ํ๋ฉด์ ๊ฑฐ์ ๋ค ๊ตฌํํ์ ๋ ์ฏค ์๋ฌ์ฌํญ์ ๋ฐ๊ฒฌํ๋ค.
๋ณํ ์ธ์ด๋ฅผ request.recognitionLanguages = ["ko","en","zh-Hans","ja"]
์ด๋ ๊ฒ ์ ์ค์ ํ์์๋ ์ ๋ฒ์ญ๋์ง ์๋ ๊ฒ์ด๋ค.
TEST 1 : ์ธํฐ๋ท์์ ๋ค์ด๋ฐ์ ์ ๊ฐํ ํ๊ธ๋ง ์๋ ๊ฒฝ์ฐ
๋ณด๋ค์ํผ ๋๊ฐ๋ด๋ ์ ์ฝ์ ์ ์๋ ํ๊ธ์ ๊ฒฝ์ฐ ๊ฑฐ์ ๋ชจ๋ ๊ธ์๊ฐ ์ ์์ ์ผ๋ก ๋ณํ๋๋ค.
TEST 2 : ์ฌ๋์ด ์ง์ ํ์ผ๋ก ์ฎ๊ฒจ ์ด ํ๊ธ๊ณผ ์์ด
์ผ์ชฝ : ์ค์ ๊ณต๋ถํ ๊ฒ์ฒ๋ผ ์ด ๊ฒ
์ค๋ฅธ์ชฝ : ์์ดํจ๋ ์ฑ ๋ด์์ ํ์ฌ์ ์ด์ฉํด ์ด ๊ธ์จ
๋ณด๋ค์ํผ ์ฌ๋์ด ์ง์ ํ๊ธฐํด๋ ๊นจ๋ํ๊ฒ ์ ์ธ์๋ก ์ธ์๋ฅ ์ด ์ข๋ค.
๋ํ ๊ดํธ๋ ์์ด๋ ์ ๋ณํ๋๋ ๊ฒ์ ํ์ธํ๋ค.
TEST3 : ์์ด๋ง ์๋ ๊ฒฝ์ฐ
์ญ์ ๊น๋ํ๊ณ ์ ์จ์ง ์์ด ๋ํ ์ ๋ณํ๋๋ค.
TEST 4 : ์ค๊ตญ์ด , ์ผ๋ณธ์ด๊ฐ ์๋ ๊ฒฝ์ฐ
์ธํฐ๋ท์์ ๋ค์ด ๋ฐ์ ์ ๊ฐํ ๊ธ์จ์์๋ ์ค๊ตญ์ด์ ์ผ๋ณธ์ด๋ ์ ๋ฒ์ญ๋์ง ์๋๋ค.
์ฌ์ค ํ๊ตญ์ด์ ์์ด๋ง ์ ๋ฒ์ญ๋๋คํด๋ ์๊ด์๊ฒ ์ง๋ง, ์ค๊ตญ์ด์ ์ผ๋ณธ์ด ์ ๋๋ ์ถ๊ฐํ๊ณ ์ถ์๋ค.
๊ตฌ๊ธ๋ง ํด๋ณธ ๊ฒฐ๊ณผ ๋์ ๋๊ฐ์ ์ํฉ์ ๊ฒช๊ณ ์๋ ๊ธ์ ๋ณผ ์ ์์๋๋ฐ,
์ค๋ฒํ๋ก์ฐ์ฌ์ดํธ์์๋ ์ข์ ํด๊ฒฐ๋ฐฉ์์ ์์๋ค.
์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํ์ผ๋ก ๊ฒฐ๊ตญ ์ค๊ตญ์ด์ ์ผ๋ณธ์ด๊น์ง ์ ์ธ์ํ๊ฒ ํ๋ ค๋ฉด
๋ด์ฅ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง๋ง๊ณ ์ง์ OCR๊ธฐ์ ์์ฒด๋ฅผ ๊ตฌํํด์ ์ฐ๋ํด์ผํ๋๊ฒ์ด ์๋๊ฐ.. ์๊ฐ์ด ๋ค์๋ค.
์ฌ์ค ๊ธฐํ ํ ๋ ๋ฐฑ์ง์ ๋ด์ฉ๋ค์ ์ ๊ณ -> ์ค์ํ ํค์๋๋ค์ ํ๊ดํ์ผ๋ก ์น ํ๋ฉด
์ด ํ๊ดํ์ผ๋ก ์น ํด์ง ๋ถ๋ถ๋ง ์ธ์ํ์ฌ ๋น์นธ์ผ๋ก ๋ง๋ค๊ณ ์ถ์๋ค๋ ์์ฃผ ํฐ ์์ฌ์ ์๊ฐํด๋ณด๊ธฐ๋ ํ์ง๋ง
์ด๋ ๋ ํผ์๋ก๋ ์ ๋ง ์ด๋ ค์ ์ ๊ฒ์ด๋ผ๋๊ฒ์ด๋ค..
์ด ํ๋ก์ ํธ๋ฅผ ํ์ฌ ์ํฉ์์ ์ถ์ํ๋ ค๋ฉด ์ด๋ป๊ฒ ๋ฐ๊ฟ์ผํ ์ง,
์ถ์๋ฅผ ๋ชปํ๋คํ๋๋ผ๋ ์ด๋ป๊ฒ ๋ฐ๊พธ๋ฉด ์ข์์ง ์๊ฐํด๋ด์ผ๊ฒ ๋ค.
ApplePencilKit
VisionKit
SnapKit
MVC
๋ฑ ์จ๋ณด์ง ๋ชปํ๋ ๊ฒ๋ค์ ์ฌ์ฉํด๋ณธ๊ฒ์ด ์ข์๋ค.
'๐ iOS > APP ๋ฐฐํฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Xcode ์ ๋ก๋ ์๋ฌ] Invalid App Store Icon. (0) | 2024.08.19 |
---|---|
ENABLE_USER_SCRIPT_SANDBOXING ์๋ฌํด๊ฒฐ (0) | 2024.01.21 |
[iOS] ๋น๋ฒํ ์ฑ ์ฌ์ฌ ๋ฆฌ์ ์ฌ์ (0) | 2023.05.31 |
[iOS] Software ๋ฒ์ ๊ด๋ฆฌ ๊ท์น (1) | 2023.05.12 |
[iOS] ๋๋ฒ์งธ ์ฑ ์ถ์ ( *๋ฆฌ์ ) (2) | 2023.05.06 |