OpenCV_Vision 프로젝트의 속성으로 들어간 후 구성(C): 모든구성, 플랫폼(P) : x64 로 설정
opencv가 설치된 경로를 추가한다. 공통설정4-3. 디버깅항목에 환경에 DLL경로를 입력 PATH = C:\opencv\build\x64\vc16\bin;%PATH%4-4. 구성-Debug 추가종속성에 opencv_world480d.lib 입력
4-2. 링커의 추가 라이브러리 디렉터리에 C:\OpenCV\build\x64\vc16\lib 입력 : 링커를 포함시킴
4-1. C/C++의 추가 포함 디렉터리에 C:\opencv\build\include 입력 : 헤더파일을 포함하는 것
OpenCV_Vision 프로젝트의 속성으로 들어간 후 구성(C): Debug, 플랫폼(P) : x64 로 설정
5-1. 추가 종속성 항목에 opencv_world480d.lib 입력
OpenCV_Vision 프로젝트의 속성으로 들어간 후 구성(C): Release, 플랫폼(P) : x64 로 설정
6-1. 추가 종속성 항목에 opencv_world480.lib 입력
정상적으로 세팅이 되었는지 샘플코드 입력 후 빌드/실행하여 확인한다.7-3. 샘플코드
/**
@file videocapture_basic.cpp
@brief A very basic sample for using VideoCapture and VideoWriter
@author PkLab.net
@date Aug 24, 2016
*/
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main(int, char**)
{
Mat frame;
//--- INITIALIZE VIDEOCAPTURE
VideoCapture cap;
// open the default camera using default API
// cap.open(0);
// OR advance usage: select any API backend
int deviceID = 0; // 0 = open default camera
int apiID = cv::CAP_ANY; // 0 = autodetect default API
// open selected camera using selected API
cap.open(deviceID, apiID);
// check if we succeeded
if (!cap.isOpened()) {
cerr << "ERROR! Unable to open camera\n";
return -1;
}
//--- GRAB AND WRITE LOOP
cout << "Start grabbing" << endl
<< "Press any key to terminate" << endl;
for (;;)
{
// wait for a new frame from camera and store it into 'frame'
cap.read(frame);
// check if we succeeded
if (frame.empty()) {
cerr << "ERROR! blank frame grabbed\n";
break;
}
// show live and wait for a key with timeout long enough to show images
imshow("Live", frame);
if (waitKey(5) >= 0)
break;
}
// the camera will be deinitialized automatically in VideoCapture destructor
return 0;
}
import SwiftUI // SwiftUI 인터페이스를 사용하겠다.
@main // 랜드마크라는 앱을 실행시키면 시작되는 프로그램의 진입점이다.
struct LandmarksApp: App // 랜드마크앱은 App의 앱구조를 가진다.
{
var body: some Scene // 몸체는 몇개의 씬으로 구성되는데
{
WindowGroup // 그룹내의 뷰 코드를 실행하게 된다.
{
ContentView() // 컨텐츠 뷰 코드를 실행해라.
}
}
}
**ContentView.swift**
import SwiftUI // SwiftUI 인터페이스를 사용하겠다.
struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
var body: some View // 컨텐츠의 몸체
{
Text("Hello, world!") // 헬로우 월드를 띄워라
.padding() // 패딩 좌우간격을 줘라
}
}
struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
static var previews: some View // 프리뷰의 몸체
{
ContentView() // 미리보기에 띄울 컨텐츠
}
}
미리보기 화면이 아래와 같이 나온다.
섹션 2. 텍스트 사용자 정의
미리보기 화면에서 커맨드 키를 누르고 Helloworld를 클릭하면 아래와 같은 화면이 나오는데 Show SwiftUI Inspector를 클릭한다.
화면에 표시할 텍스트를 바꿀 수 있고, 폰트관련 설정, 패딩, 외곽선등을 설정할 수 있다.
해당 창에서 설정을 수정하면 자동으로 코드에 반영된다.
역으로 코드상에서도 동일하게 수정하면 코드에 반영이 된다.
실행 결과는 아래와 같다.
**ContentView.swift**
import SwiftUI // SwiftUI 인터페이스를 사용하겠다.
struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
var body: some View // 컨텐츠의 몸체
{
Text("Turtle Rock") // 헬로우 월드를 띄워라
**.font(.title) // 폰트는 타이틀 폰트를 사용해라
.foregroundColor(Color.green) // 폰트 색상은 그린
.multilineTextAlignment(.center) // 가운데 정렬
.padding() // 패딩 좌우간격을 줘라**
}
}
struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
static var previews: some View // 프리뷰의 몸체
{
ContentView() // 미리보기에 띄울 컨텐츠
}
}
섹션3. 스택으로 보기 결합하기
한 묶음의 텍스트를 세로 방향으로 쌓고 싶을 때 : VStack
**ContentView.swift**
import SwiftUI // SwiftUI 인터페이스를 사용하겠다.
struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
var body: some View // 컨텐츠의 몸체
{
**VStack** // 텍스트를 세로방향으로 쌓는다.
{
Text("Turtle Rock") // 보여줄 텍스트 : 터틀락
.font(.title) // 타이틀 폰트를 사용한다.
Text("Joshua Tree National Park") // 보여줄 텍스트
.font(.subheadline) // 폰트
Text("California") // 보여줄 텍스트
.font(.subheadline) // 폰트
}
}
}
struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
static var previews: some View // 프리뷰의 몸체
{
ContentView() // 미리보기에 띄울 컨텐츠
}
}
한 묶음의 텍스트를 가로 방향으로 쌓고 싶을 때 : HStack
**ContentView.swift**
import SwiftUI // SwiftUI 인터페이스를 사용하겠다.
struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
var body: some View // 컨텐츠의 몸체
{
**HStack** // 텍스트를 세로방향으로 쌓는다.
{
Text("Turtle Rock") // 보여줄 텍스트 : 터틀락
.font(.title) // 타이틀 폰트를 사용한다.
Text("Joshua Tree National Park") // 보여줄 텍스트
.font(.subheadline) // 폰트
Text("California") // 보여줄 텍스트
.font(.subheadline) // 폰트
}
}
}
struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
static var previews: some View // 프리뷰의 몸체
{
ContentView() // 미리보기에 띄울 컨텐츠
}
}
VStack 과 HStack 을 모두 사용하여 이쁘게 만들어 보자.
import SwiftUI // SwiftUI 인터페이스를 사용하겠다.
struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
var body: some View // 컨텐츠의 몸체
{
VStack(alignment: .leading) // 텍스트를 세로방향으로 쌓는다.(좌로 정렬)
{
Text("Turtle Rock") // 보여줄 텍스트 : 터틀락
.font(.title) // 타이틀 폰트를 사용한다.
HStack
{
Text("Joshua Tree National Park") // 보여줄 텍스트
.font(.subheadline) // 폰트
Spacer() // 공원과 주 사이에 공간을 채워넣음
Text("California") // 보여줄 텍스트
.font(.subheadline) // 폰트
}
}
.padding() // 공원과 주를 분리할 때 너무 화면 끝으로 가버려서 약간의 공간을 줌
}
}
struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
static var previews: some View // 프리뷰의 몸체
{
ContentView() // 미리보기에 띄울 컨텐츠
}
}
섹션4. 사용자 정의 이미지 보기 생성
Assets에 이미지를 드래그앤 드랍으로 추가한다.
CircleImage.swift 라는 새로운 SwiftUI를 만든다.
이미지를 불러오고 원형으로 자르고 각종 이펙트를 넣는다.
import SwiftUI
struct CircleImage: View
{
var body: some View
{
Image("turtlerock") // 터틀락 이미지를 불러온다.
.clipShape(Circle()) // 이미지를 원형으로 자른다.
.overlay // 이미지에 덮어씌운다.
{
Circle() // 원을 덮어씌운다.
.stroke(.gray, lineWidth: 4)
// 속이 빈 원을 만드는데, 선 색깔과 두께를 설정한다.
// 흰색 테두리를 설정하려면 아래 코드 사용
// .stroke(.white, lineWidth: 4)
}
.shadow(radius: 7)
}
}
struct CircleImage_Previews: PreviewProvider
{
static var previews: some View
{
CircleImage()
}
}
섹션5. 다른 프레임 워크에서 SwiftUI 보기 사용
아까 만들었던 원에 지도를 배치하려면 SwiftUI로 MapView.swift 파일을 생성하고 아래 코드의 주석을 참조한다.
**MapView.swift**
import SwiftUI
import MapKit // 맵 킷을 불러온다.
struct MapView: View
{
@State private var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 37.5030042, longitude: 127.0507571),
span: MKCoordinateSpan(latitudeDelta: 0.2, longitudeDelta: 0.2)
)
// **@State**는 해당 View 외부로는 사용할 수가 없고 private 형태로 내부에서만 사용
//
// **region**은 지도에 대한 정보를 저장하는 private 상태변수
//
// **MKCoordinateRegion**은 Map에서 보여줄 원하는 좌표를 담을 매개변수,
// struct로 특정 경도와 위도를 중심으로 둘러싼 사각형 모양의 지역범위를 표시
//
// **CLLocationCoordinate2D**은 지정된 위치와 관련된 위도 및 경도 데이터
//
// **MKCoordinateSpan**은 척도를 나타냄
//
var body: some View
{
Map(coordinateRegion: $region)
// 앞서 선언한 상태변수 region을 **바인딩**(참조)으로 Map에 넣는다.
}
}
struct MapView_Previews: PreviewProvider {
static var previews: some View {
MapView()
}
}
섹션6. 상세도 작성
지금까지 작성한 컨텐츠들을 보기좋게 아래와 같이 배치
**Contentview.swift**
import SwiftUIimport SwiftUI // SwiftUI 인터페이스를 사용하겠다.
struct ContentView: View // 윈도우 그룹에서 띄울 컨텐츠
{
var body: some View // 컨텐츠의 몸체
{
VStack// 텍스트를 세로방향으로 쌓는다.(좌로 정렬)
{
MapView()
.ignoresSafeArea( edges : .top )
.frame(height:300)
CircleImage()
.offset(y:-130)
.padding(.bottom,-130)
VStack (alignment: .leading)
{
Text("Turtle Rock") // 보여줄 텍스트 : 터틀락
.font(.title) // 타이틀 폰트를 사용한다.
HStack
{
Text("Joshua Tree National Park") // 보여줄 텍스트
Spacer() // 공원과 주 사이에 공간을 채워넣음
Text("California") // 보여줄 텍스트
}
.font(.subheadline) // HStack으로 묶여있는 애들을 서브라인 폰트로 설정한다.
.foregroundColor(.secondary) // 글자색을 옅은 회색으로 설정한다.
Divider() // 구분선을 추가한다.
Text("About Turtle Rock")
.font(.title2)
Text("Descriptive text goes here.")
}
.padding() // 보기좋게 하기 위해 VStack 으로 쌓은 놈들에 패딩을 준다.
Spacer() // 지금까지 작성한 컨텐츠를 최상단으로 끌어올린다.
}
}
}
struct ContentView_Previews: PreviewProvider // 미리보기를 사용
{
static var previews: some View // 프리뷰의 몸체
{
ContentView() // 미리보기에 띄울 컨텐츠
}
}