Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/yeatse/opencv-spm
Integrate OpenCV into your project using Swift Package Manager.
https://github.com/yeatse/opencv-spm
ios macos opencv swift swift-package-manager visionos
Last synced: about 2 months ago
JSON representation
Integrate OpenCV into your project using Swift Package Manager.
- Host: GitHub
- URL: https://github.com/yeatse/opencv-spm
- Owner: yeatse
- License: apache-2.0
- Created: 2022-09-22T16:51:46.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-08-04T12:14:48.000Z (5 months ago)
- Last Synced: 2024-08-05T11:57:24.595Z (5 months ago)
- Topics: ios, macos, opencv, swift, swift-package-manager, visionos
- Language: Swift
- Homepage:
- Size: 203 KB
- Stars: 59
- Watchers: 3
- Forks: 21
- Open Issues: 6
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome - opencv-spm - A Swift package wrapping around OpenCV. (OOM-Leaks-Crash / Graphs Processing And Rendering)
- awesome - opencv-spm - A Swift package wrapping around OpenCV. (OOM-Leaks-Crash / Graphs Processing And Rendering)
README
# OpenCV-SPM
Use [OpenCV](https://github.com/opencv/opencv) in your Swift project in a more elegant way.
This Swift package simplifies the process of importing the prebuilt `opencv2.xcframework` into your project, eliminating the need for manual building. It monitors release events in the [OpenCV Github Project](https://github.com/opencv/opencv) and automatically generates new releases using [Github Actions](https://github.com/features/actions).
## Installation
Add `https://github.com/yeatse/opencv-spm.git` to your package dependencies
![add dependency](screenshots/add%20dependency.png)
## Usage
Import `opencv2` and use it as documented in [opencv.org](opencv.org). For example, a swift version of [Extract horizontal and vertical lines by using morphological operations](https://docs.opencv.org/4.6.0/dd/dd7/tutorial_morph_lines_detection.html):
```swift
import opencv2// Show source image
let src = Mat(uiImage: image)// Transform source image to gray if it is not already
let gray: Mat
if (src.channels() == 3) {
gray = Mat()
Imgproc.cvtColor(src: src, dst: gray, code: .COLOR_BGR2GRAY)
} else {
gray = src
}// Apply adaptiveThreshold at the bitwise_not of gray, notice the ~ symbol
let notGray = Mat()
Core.bitwise_not(src: gray, dst: notGray)let bw = Mat()
Imgproc.adaptiveThreshold(src: notGray, dst: bw, maxValue: 255, adaptiveMethod: .ADAPTIVE_THRESH_MEAN_C, thresholdType: .THRESH_BINARY, blockSize: 15, C: -2)// Create the images that will use to extract the horizontal lines
let horizontal = bw.clone()
let vertical = bw.clone()// Specify size on horizontal axis
let horizontalSize = horizontal.cols() / 30
// Create structure element for extracting horizontal lines through morphology operations
let horizontalStructure = Imgproc.getStructuringElement(shape: .MORPH_RECT, ksize: .init(width: horizontalSize, height: 1))
// Apply morphology operations
Imgproc.erode(src: horizontal, dst: horizontal, kernel: horizontalStructure, anchor: .init(x: -1, y: -1))
Imgproc.dilate(src: horizontal, dst: horizontal, kernel: horizontalStructure, anchor: .init(x: -1, y: -1))// Specify size on vertical axis
let verticalSize = vertical.rows() / 30// Create structure element for extracting vertical lines through morphology operations
let verticalStructure = Imgproc.getStructuringElement(shape: .MORPH_RECT, ksize: .init(width: 1, height: verticalSize))// Apply morphology operations
Imgproc.erode(src: vertical, dst: vertical, kernel: verticalStructure, anchor: .init(x: -1, y: -1))
Imgproc.dilate(src: vertical, dst: vertical, kernel: verticalStructure, anchor: .init(x: -1, y: -1))// Inverse vertical image
Core.bitwise_not(src: vertical, dst: vertical)// Extract edges and smooth image according to the logic
// 1. extract edges
// 2. dilate(edges)
// 3. src.copyTo(smooth)
// 4. blur smooth img
// 5. smooth.copyTo(src, edges)
// Step 1
let edges = Mat();
Imgproc.adaptiveThreshold(src: vertical, dst: edges, maxValue: 255, adaptiveMethod: .ADAPTIVE_THRESH_MEAN_C, thresholdType: .THRESH_BINARY, blockSize: 3, C: -2)// Step 2
let kernel = Mat.ones(rows: 2, cols: 2, type: CvType.CV_8UC1)
Imgproc.dilate(src: edges, dst: edges, kernel: kernel)// Step 3
let smooth = Mat();
vertical.copy(to: smooth)// Step 4
Imgproc.blur(src: smooth, dst: smooth, ksize: .init(width: 2, height: 2))// Step 5
smooth.copy(to: vertical, mask: edges)// Show final result
let result = vertical.toUIImage()
```