본문 바로가기

코딩124

[C++ opencv] 관심영역 Region of Interest (RoI) 사용 방법 본문 목표 영상처리에서 가장 중요한 것은 정확성과 처리속도라고 할 수 있다. 정확성을 높이기 위해서는 관찰하려는 대상에 초점이 맞춰져 있어야한다. 원하는 피사체(대상)를 따로 분리하여 영상처리를 하고 싶은 경우 사용하는 방법이 '관심영역 설정'이다. 영어로는 RoI(Region of Interest) 라고 부른다. 키워드 : rect, RoI 알아볼 함수 원형 - 관심영역 ( Roi ) Mat img = imread("Lenna.png", 1); Mat img_roi_1, img_roi_2; img_roi_1 = img(Rect(200, 200, 100, 100)); img_roi_2 = img(Rect(Point(300, 200),Point( 400, 300))); src( Rect( x, y, wid.. 2020. 7. 21.
[C++ opencv] 이미지에 원 그리기, circle( ) 본문 목표 이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다. 원을 표현해야하는 경우 어떻게 원을 이미지에 그려넣을 수 있는지 알아보자. 키워드 : circle( ) 알아볼 함수 원형 - 원 그리기 ( circle ) Mat img = imread("lane.png", 1); Mat img_circle; img.copyTo(img_circle); circle(img_circle, Point(500, 100), 50, Scalar(255, 0, 255), 1, 8, 0); circle(img_circle, Point(100, 100), 100, Scalar(255,0,0), 1, 4, 0); circle(img_circle, Point(200, 300), 70, Scalar:.. 2020. 7. 21.
[C++ opencv] 이미지에 사각형 그리기, rectangle( ) 본문 목표 이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다. 사각형을 표현해야하는 경우 어떻게 사각형을 이미지에 그려넣을 수 있는지 알아보자. 키워드 : rectangle( ) 알아볼 함수 원형 - 사각형 그리기 ( rectangle ) Mat img = imread("lane.png", 1); Mat img_rectangle; img.copyTo(img_rectangle); rectangle(img_rectangle, Rect(Point(200, 200), Point(300, 300)), Scalar(0, 0, 255), 1, 8, 0); rectangle(img_rectangle, Rect(400, 400, 100, 100), Scalar(0, 0, 255), 1, 8.. 2020. 7. 21.
[C++ opencv] 이미지에 선, 직선 그리기 본문 목표 이미지를 처리함에 있어서 사용자가 확인할 수 있어야 쉽게 코드를 개발할 수 있다. 직선을 표현해야하는 경우 어떻게 직선을 이미지에 그려넣을 수 있는지 알아보자. 키워드 : line() 알아볼 함수 원형 - 함수 기능 ( Function Name ) Mat img = imread("lane.png", 0); Mat img_line; img.copyTo(img_line); line(img_line, Point(200, 200), Point(200, 300), Scalar::all(255), 1, 8, 0); line(img_line, Point(200, 200), Point(200, 100), Scalar(105,200,100), 1, 8, 0); line( Input Output Array, p.. 2020. 7. 21.
[C++ opencv] "이미지 복사" 개념 이해하기 .copyTo 본문 목표 코드 개발을 하다보면 연산 처리에 쓰이는 변수 값이 다른 변수값에 영향을 줘야 할 때가 많다. 영상처리에 있어서도 그러한데, 쉽게 생각하다가는 큰 실수가 되고, 결과에 치명적인 문제를 안겨주게 된다. 주소값과 데이터 값을 통해 영상처리에서 이미지 변수를 어떻게 사용하여야 정확하게 사용하는 것인지 알아보자. 키워드 : .copyTo 알아볼 함수 원형 - 이미지 복사 ( .copyTo ) Mat img = imread("Lenna.png", 0); Mat img_copy; img.copyTo(img_copy); src.copyTo( dst ) : src 이미지를 dst 에 복사 ○ src : 복사 시킬 원본 이미지 ○ dst : 복사 되어 저장 될 이미지 변수 우선 .copyTo( ) 가 왜 필요.. 2020. 7. 21.
[C++ opencv] High pass filter (HPF)로 윤곽선 검출, edge detection 본문 목표 저번 포스터에서 Low pass filter를 다뤘고, 영상에서 노이즈 제거를 함을 알아봤다. 이번에는 비슷한 개념이면서 다른 High pass filter를 이해해보고, 어느 상황에서 사용하는지 알아보자. 키워드 : high pass filter, HPF, 고주파 통과 필터, 라플라시안, 라플라시안-가우시안, sobel 알아볼 함수 원형 - 고역주파수 통과 필터 ( High pass filter ) GaussianBlur(img, img_gaussian, Size(3, 3), 0, 0, 4); Sobel(img_gaussian, img_sobel_x, CV_8U, 1, 0, 3, (1.0), (0, 0), 4); Sobel(img_gaussian, img_sobel_y, CV_8U, 0, 1.. 2020. 7. 15.
[C++ opencv] low pass filters (LPF)로 노이즈 제거하기 본문 목표 영상처리에서 노이즈제거는 매우 중요하다. 앞선 포스트에서 평균필터(average filter)와 가우시안 블러(gaussian blur)를 다뤘었다. 이번에는 보다 전문적으로 노이즈 제거 방법에 대해서 알아보도록 한다. 그리고 영상처리에 있어서 low pass filter는 노이즈 제거라는 것을 이해한다. 키워드 : low pass filter, average filter, gaussian filter, median filter, bilateral filter 알아볼 함수 원형 - 필터 적용 ( filter2d ) blur(img, img_blur, Size(5, 5), Point(-1, -1), BORDER_REFLECT); GaussianBlur(img, img_gaussian, Size(.. 2020. 7. 15.
[C++ opencv] 이미지 사이즈 변경하기, resize( ) 함수 사용법 본문 목표 연산속도를 빠르게 하기위해서 RGB 색 채널보다는 Grayscale을 사용한다. 그런데 이보다 더 연산속도를 빠르게 할 수 있는 방법은 이미지 사이즈를 줄이는 것이다. opencv에서 제공하는 이미지 사이즈 변경 방법에 대해서 알아보자. 키워드 : resize , 보간법 알아볼 함수 원형 - 이미지 크기 변경 ( Resize ) ... Mat img = imread("Lenna.png"); img_small; resize(img, img_small, Size(200, 200)); ... resize( src, dst, Size(cols, rows) ) ○ src : 입력할 이미지 변수 ○ dst : 필터가 적용되어 저장될 이미지 변수 ○ Size(cols, rows) : 변환시킬 이미지의 크기.. 2020. 7. 14.
C언어 기초 - 쓰레드 이해하고 사용하는 방법 본문 목표 코드를 여러개 동시에 돌리고 싶을 때, 사용하는 것이 쓰레드이다. 쓰레드의 원리를 이해하고, 사용방법을 알아보자. 개념 정리 코드는 하나만 돌아가는 것이 기본이다. 그런데 성능 좋은 컴퓨터에서 여러개를 동시에 처리하지 못하는 것 만큼 제값 못하는건 또 없다. 여러개를 동시에 처리하기 위한 개념이 쓰레드이다. 다시말해서 코드는 하나 실행했는데, 작동되는 기능이 2개 이상 되게 하는 것이 쓰레드이다. 아두이노 같은 임베디드 보드를 사용하면 우리는 loop( ) 또는 while(1) 처럼 무한 반복문 안에다가 코딩을 하고, 계속 반복을 돌리게 한다. 그런데 기능을 두가지를 동시에 하게 하고 싶으면 timer 기능을 사용하게 된다. 예를 들어, 타이머를 시작해두고, 100ms 마다 1번 기능의 whi.. 2020. 7. 9.
C언어 기초 - 헤더파일 만드는 방법과 사용하는 방법 본문 목표 프로젝트가 복잡하고 규모가 클 수록, 코드가 많이 길어지게 된다. 코드가 길어지면 가독성이 떨어지게 된다. 가독성이 떨어지면, 코드 개발이 복잡해지고, 오류가 발생할 확률이 높고, 오류를 잡기 힘들어진다. 따라서 가독성을 높이기 위해서는 여러개의 소스파일을 사용한다. 여러개 소스파일을 만들고, 사용하는 방법을 헤더파일을 통해 알아보자. 개념 정리 학창시절 공부를 한다고 했을 때, 단원별로 공부를 하고, 개념노트를 만들곤 했을 것이다. 프로그래밍도 마찬가지로, 계속 개발할 수록 비슷한 것들 끼리 묶어서 저장하는 것이 좋다. 나중에 찾아보기도 쉽고 이해하기도 쉽기 때문이다. 노트 하나에 수학, 물리, 화학을 한꺼번에 정리하면 완전 뒤죽박죽이 되어서 알 수 없듯이 프로그래밍도 소스파일 하나에 개발을.. 2020. 7. 8.
C언어 기초 - 포인터 와 주소 이해하기, pointer 본문 목표 C언어의 핵심 중 하나가 '포인터' 이다. 포인터를 사용할 줄 알아야 C언어를 통해서 개발을 수월하게 할 수 있다. 단순히 변수를 사용하면 해당 소스 파일에서만 사용이 가능한데, 다른 외부 소스 파일에서 해당 변수 값을 참조할 때 사용하는게 '포인터'이다. 메모리 주소에 대해서 이해하여 포인터가 무엇인지 이해하고 사용하는 방법을 알아보자. 개념 정리 포인터는 영어로 'pointer' 이다. 뜻을 생각해보면, '가르키는 것' 이라고 할 수 있겠다. 실제로 C언어에서의 포인터는 해석 그대로의 개념이다. 가르키는 것인데, 무엇을 가르키냐면 바로 '메모리 주소 값' 이다. 컴퓨터의 RAM 이라는 부분을 메모리라고 하는데, 그 메모리에 우리가 사용하고자 하는 변수들이 저장 되는 것이다. 우리가 char.. 2020. 7. 8.
C언어 기초 - 사용자 정의함수 만들기 본문 목표 저번 포스팅까지 해서 자료형, 조건문, 반복문까지 핵심적인 것들은 다 다뤄보았다. 이번에는 다음으로 중요한 사용자 정의함수를 만드는 것을 이해하고 자신의 함수를 만들어 사용해본다. 개념 정리 사용자 정의 함수는 프로그램에서 제공하는 기본 함수들을 이용하여 새롭게 함수를 만드는 것이다. 원할 때, 호출해서 사용할 수 있으며, 코드를 단순히 할 때 필수적이다. 코드가 단순해야 나중에 문제가 생겨도 쉽게 원인을 파악할 수 있어서 중요하다. 사용자 정의함수 만들기 전에 자료형을 다시 살펴보자. return 0; 을 쓸때는 뭐고 return; 을 쓸때는 뭔지 모른다면 집중하시길! 자료형을 간단히 하자면 void - 없음 char - 작은 정수 또는 문자 short - 크기가 작은 정수 int - 정수 .. 2020. 7. 6.
C 언어 기초 - 반복문 for 이해하기 본문 목표 C언어에서 반복문은 for 와 while 이 있다. 이번에는 반복문 for 을 이해하고, 사용법을 알아보자. 개념 정리 반복문의 기초는 반복의 '조건' 이 '참' 이면 반복을 하는 것이다. for는 정수형 변수를 사용하여 조건을 세우는 대표적인 반복문이다. (while은 논리 연산, 관계 연산 다 사용가능 한 것과 제일 큰 차이점이다.) 물론 조건 자리에 들어갈 연산은 그 어느것이 와도 되지만, 그렇게 사용하지는 않는다. 기본 형태는 다음과 같다. for(변수 선언 또는 초기화 ; 조건식 ; 증감식) { 반복할 코드 } 변수 선언 또는 초기화 - 이 부분에서 변수를 선언하고 초기화 해도 된다. ex) int i = 0 - 변수가 이미 선언 되어 있다면 초기화를 한다. ex) i = 0 조건식 .. 2020. 7. 6.
C언어 기초 - 반복문 while 이해하기 본문 목표 C 언어를 다루는데에 있어서 중요한것은 3가지라고 할 수 있다. 1. 자료형(변수) 2. 반복문 3. 조건문 이렇게 세가지만 잘 다룰 줄 알아도 대부분의 프로그램 알고리즘을 실현시킬 수 있다. 이번 포스팅에서는 반복문을 다루려고 한다. 반복문 중에서 for 이 있고, while 이 있는데 while 을 먼저 다뤄보려한다. while을 이해하고 사용방법을 알아가는 것이 이번 포스팅의 목표이다. 개념 정리 반복문은 코드 실행에 있어서 반복적으로 실행시키게 하는 것이다. 모든 반복문은 조건을 갖고 있고, 해당 조건에 충족한다면 반복연산을 실시한다. while 역시 조건문이 필요한데, 조건문은 괄호 안에 들어간다. while( 조건 ) { 반복 실행할 코드 } 이런 형식으로 사용한다. 순서도로 살펴보.. 2020. 7. 5.
C언어 기초 - 조건문 if , else if, else 이해하기 본문 목표 조건문은 주어진 조건이 참일 경우 해당 코드를 실행하는 명령이다. 주어진 조건에 따라서 경우의 수를 여러개로 나눌 수 있는데, if, else if, else 가 그렇다. if 를 여러개 사용해도 되지만, 그러면 안 되는 이유는 실행 속도에서 손해를 보기 때문이다. if 는 무조건 조건 검사를 하는데, 이미 해결된 사안이고, 뒤에 있는 거짓이라 필요 없음에도 다 한번씩 두드려보기에 코드 작동 속도에 저하가 생기게 된다. 따라서 올바른 조건문을 사용할 줄 알아야 한다. 개념 정리 if, else if, else 의 사용 방법은 아래와 같다. if ( 조건1 ) { 조건 1이 참이면 실행 } else if ( 조건2 ) { 조건 1이 거짓이고, 조건 2가 참이면 실행 } else if ( 조건3 .. 2020. 7. 5.