분류 전체보기 108

[OpenCV] 캐니 에지 검출

캐니(Canny) 에지 캐니 에지 검출이란 1986년 캐니(J. Canny)가 소벨 에지 검출 방법의 단점을 해결할 수 있는 방법을 제시한 검출 방법이다. 제시한 방법은 3가지로, 좋은 에지 검출기의 조건으로 제시했다. ​ 1. 정확한 검출(good detection) : 에지를 검출하지 못하거나 또는 에지가 아닌데 에지로 검출하는 확률을 최소화해야 한다. ​ 2. 정확한 위치(good localization) : 실제 에지의 중심을 찾아야 한다. ​ 3. 단일 에지(single edge) : 하나의 에지는 하나의 점으로 표현되어야 한다. ​ 캐니는 이러한 조건을 만족하는 새로운 형태의 에지 검출 방법을 제시했고, 이 것을 캐니 에지 검출기(canny edge detector)라고 한다. ​ 소벨 에지 ..

[OpenCV] 소벨 필터 마스크 에지 검출 방법

에지(edge)란 영상에서 에지(edge)란 한쪽 방향으로 픽셀 값이 급격하게 바뀌는 부분을 말한다. 즉, 어두운 영역에서 갑자기 밝아진다거나, 밝은 영역에서 갑자기 어두워지는 부분을 에지라고 한다. ​ 일반적으로 객체와 배경의 경계 또는 객체와 다른 객체의 경계에서 에지가 발생한다. 영상에서 에지를 찾아내는 작업은 객체의 윤곽을 알아낼 수 있는 유용한 방법이며 비전 시스템에서 객체 판별을 위한 전처리로 에지 검출이 사용되고 있다. ​ 기본적으로 영상에서 에지를 찾아내려면 픽셀 값의 변화율을 측정하여 변화율이 큰 픽셀을 선택해야 한다. ​ 2차원 공간에서 정의된 영상에서 에지를 찾으려면 x축 방향과 y축 방향의 편미분을 모두 사용해야 한다. 2차원 공간에서 정의된 함수 f(x, y)가 있을 때 이 함수의..

[OpenCV] 투시 변환

영상의 투시 변환(perspective transform) 영상의 투시 변환이란 직사각형 형태의 영상을 임의의 블록 사각형 형태로 변경하는 변환이다. ​ 점 4개의 이동 관계에 의해 결정되는 투시 변환의 예이다. 왼쪽 직사각형 꼭지점 4개를 표시하고, 이 점들이 이동한 위치를 꼭지점으로 사용하는 사각형의 변환 형태이다. 투시 변환은 직선의 평행 관계가 유지되지 않기 때문에 결과 영상의 형태가 임의의 사각형 형태로 나타나게 된다. ​ 투시 변환은 보통 3 x 3 크기의 실수 행렬로 표현한다. 투시 변환은 8개의 파라미터로 표현할 수 있지만, 좌표 계산의 편의상 9개의 원소를 갖는 3 x 3 행렬을 사용한다. ​ OpenCV는 투시 변환 행렬을 구하는 함수와 투시 변환을 수행하는 함수를 모두 제공한다. ​ ..

[OpenCV] 영상의 변환 방법

영상의 이동 변환(translation transformation) 영상의 이동 변환이란 영상을 가로나 세로 방향으로 일정 크기만큼 이동 시키는 연산을 의미한다. 시프트(shift) 연산 이라고도 한다. 노란색으로 표현한 사각형이 w x h 크기의 원본 영상이다. 녹색으로 표현한 사각형은 가로 방향으로 a, 세로 방향으로 b 만큼 이동 변환 결과 영상이다. ​ 위의 그림과 같이 영상을 x 방향으로 a 만큼, y 방향으로 b 만큼 이동하는 어파인 변환 행렬은 M과 같이 구할 수 있다. OpenCV에서 영상을 이동 변환하려면 2 x 3 형태의 실수 행렬을 만들고, 이를 warpAffine() 함수 인자로 전달한다. #include "opencv2/opencv.hpp" #include using namespa..

[Flutter] Flutter 폴더 및 내부 구조

플러터 폴더 구조 먼저 플러터 폴더 구조 중 크게 android, ios, lib, test 폴더가 있다. 여기서 가장 중요하게 볼 폴더는 lib 폴더이다. 폴더 이름 내용 비고 android Android 프로젝트 관련 파일 Android Studio로 실행 가능 ios IOS 프로젝트 관련 파일 X-Code로 실행 가능(Mac) lib 플러터 앱 개발을 위한 Dart 파일 플러터 SDK 설치 필요 test 플러터 앱 개발 중 테스트 파일 테스트 편의성 제공 먼저 lib 폴더에는 플러터 앱의 코드가 작성된 main.dart 파일이 존재한다. 그리고 android 폴더와 ios 폴더에는 각 운영체제에서 프로젝트를 시작할 때 필요한 피일이 있다. test 폴더에는 다트 코드로 함수를 테스트할 때 사용하는 ..

Application/Flutter 2022.11.21

[Flutter] 스트림(Stream) 통신하기

스트림(Stream) 통신이란 애플리케이션을 개발할 때 데이터를 순서대로 주고 받아야 할 경우가 있는데, 이와 같은 상황에서 데이터를 받을 순서를 보장할 때 스트림을 이용한다. 중간에 와이파이가 끊어져 데이터를 받지 못하거나 특정 API 호출이 늦어져 순서가 달라지면 애플리케이션이 원하는 흐름대로 동작하지 않는다. 이런 경우에 스트림을 이용하는데, 스트림은 처음에 넣은 데이터가 꺼낼 때도 가장 먼저 나오는 데이터 구조로 볼 수 있다. 따라서 스트림을 이용하면 데이터를 차례대로 주고받는 코드를 작성할 수 있다. 아래 예제는 스트림 통신의 예제이다. import 'dart:io'; import 'dart:async'; Future sumStream(Stream stream) async { var sum = ..

Application/Flutter 2022.11.21

[Flutter] Dart의 비동기 처리 방식과 스레드

다트는 비동기 처리를 지원하는 언어이다. 비동기(Asynchronous)란 비동기란 언제 끝날지 모르는 작업을 기다리지 않고 다음 작업을 처리하게 해주는 것을 의미한다. 만약 비동기를 지원하지 않고 동기(Synchronous)로만 처리한다면, 어떤 작업이 오래 걸릴 경우 사용자는 실행이 멈춘 것으로 생각할 수 있다. 일반적으로 네트워크에서 데이터를 가져오거나 데이터베이스에 쓰기, 파일 읽기 등의 작업은 상황에 따라 언제 끝날지 모르므로 비동기로 처리해야 한다. 아래 그림은 동기와 비동기 방식을 표현한 이미지이다. 동기 방식은 한 작업이 끝나면 다음 작업을 하고, 비동기 방식은 동시에 진행되는 것을 볼 수 있다. Dart의 비동기 프로세스 작동 방식 다트 언어에서는 async와 await 키워드를 이용해 ..

Application/Flutter 2022.11.21

[Flutter] 플러터 개발 환경 설정 - VS Code

플러터는 크로스 플랫폼 앱 개발 프레임워크로, IOS와 Android 둘 다 개발할 수 있는 프레임워크이다. 그러나 IOS는 애플의 macOS 운영체제에서만 실행할 수 있으므로, 이 글은 Android, 즉 Windows 환경에서의 설정이다. 1. Android Studio 설치 https://developer.android.com/studio Download Android Studio & App Tools - Android Developers Android Studio provides app builders with an integrated development environment (IDE) optimized for Android apps. Download Android Studio today. de..

Application/Flutter 2022.11.21

[Baekjoon] C++ 1312번 - 수 정렬하기 2 (Silver 5)

수 정렬하기 2 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 256 MB 224808 64544 44872 30.458% 문제 N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오. 입력 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. 출력 첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다. 예제 입력 1 복사 5 5 4 3 2 1 예제 출력 1 복사 1 2 3 4 5 정답 #include #include #include using namespace std; int main() { ios::sync..

Algorithm/Baekjoon 2022.11.21

[Baekjoon] C++ 1312번 - 소수 (Silver 5)

1312번: 소수 시간 제한메모리 제한제출정답맞힌 사람정답 비율 2 초 128 MB 8432 2518 2252 35.276% 문제 피제수(분자) A와 제수(분모) B가 있다. 두 수를 나누었을 때, 소숫점 아래 N번째 자리수를 구하려고 한다. 예를 들어, A=3, B=4, N=1이라면, A÷B=0.75 이므로 출력 값은 7이 된다. 입력 첫 번째 줄에 A와 B(1 ≤ A, B ≤ 100,000), N(1 ≤ N ≤ 1,000,000)이 공백을 경계로 주어진다. 출력 A÷B를 했을 때, 소숫점 아래 N번째 수를 출력한다. 예제 입력 1 복사 25 7 5 예제 출력 1 복사 2 정답 #include using namespace std; int main() { int A, B, N, result; // A, ..

Algorithm/Baekjoon 2022.11.20