본문 바로가기

코딩124

[C++ opencv] 이미지에 텍스트 넣기 본문 목표 OpenCV를 다루다보면 결과창(LCD)에 원하는 정보를 표현해야 할 때가 있다. printf( ) 또는 cout 을 이용해서 콘솔창에 정보를 띄워도 되지만, 이런 경우 이미지 화면과 콘솔 화면을 둘 다 봐야 하기에 시선이 분산 된다. 따라서 결과창에 텍스트를 넣어서 확인할 수 있다면 굳이 콘솔창을 띄우지 않아도 될 것이다. 오늘은 결과 이미지에 원하는 텍스트를 출력하는 것을 다뤄보도록 하겠다. 키워드 : putText 알아볼 함수 원형 - 텍스트 삽입하기( putText ) Mat img; img = imread("text_test_1.jpg", 1); Mat img_out; img.copyTo(img_out); char mystr[30]; sprintf_s(mystr, "Bird"); pu.. 2020. 10. 17.
아두이노 내부전원으로 서보모터(SG-90) 여러개 사용하는 방법 - 아두이노 내부 전원은 매우 약하다. 각종 센서나 LED 사용에는 큰 문제가 없지만, 모터류를 사용할 때에는 문제가 항상 따른다. 전류가 부족한 문제로, 모터쪽으로 과전류가 흐르게 되면 아두이노가 오작동 하는 등 문제가 생긴다. 그래서 원래는 외부전원을 사용하는 등 정석의 방법이 존재 한다. 하지만 이런 외부전원 회로를 만드는게 힘든 상황이거나 귀찮을 경우에 서모모터를 여러개 사용해야 하는 경우가 생기곤 한다. 이럴 때에 어떻게해야 아두이노 내부전원으로 서보모터를 여러개 돌릴 수 있을지 알아보자. - 아두이노(나노, 우노, 메가), 시리얼 통신 케이블, 점퍼선(M-M), 서보모터(SG-90) 여러개 아두이노 내부 전원 5V 를 통해서 서보모터 여러개에 전원 공급을 해준다. signal 신호는 각각 하나.. 2020. 10. 16.
c언어 코드 최적화 5장. 함수 호출 최적화 C언어 최적화에 대해서 벌써 마지막 장이다. (사실은 더 많은 방법이 있지만, 가장 큰 차이가 존재하는 것들을 위주로 다뤄보았다.) 지금까지 C언어 코드 최적화 포스팅을 정독했다면 컴퓨터에대한 원리를 이해했을 것이다. 이번에 다뤄볼 최적화 방법은 함수 호출과 관련이 있다. 함수 호출은 사용자 정의 함수를 main() 이나 다른 함수에서 호출하여 사용하는 것을 말한다. 예를 들면, 아래와 같은 경우가 함수 호출의 예가 되겠다. #include #include #include int sum(int a, int b) { return a + b; } void main() { int a = 5; int b = 7; printf("%d + %d = %d \n ", a, b, sum(a, b)); return; } .. 2020. 10. 15.
c언어 코드 최적화 4장. 조건문 최적화 C언어 최적화에는 여러가지 고려해야 할 것들이 많다. 이번에는 조건문에서의 최적화를 다뤄보도록 하자. 1. 조건문은 비교연산 횟수를 줄여야 한다. 우리가 흔히 사용하는 조건문은 if 조건문이다. 별 생각없이 코딩을 하게되면 아래와 같은 코드가 나오게 된다. if (i == 1) { } else if (i == 2) { } else if (i == 3) { } else if (i == 4) { } else if (i == 5) { } else if (i == 6) { } else if (i == 7) { } else if (i == 8) { } 연산속도가 중요하지 않다면 이렇게 사용해도 큰 문제가 없다. 하지만 연산속도를 중요시 한다면 이런 코딩보다는 다른 방식을 사용해야 한다. 문제를 잘 살펴보면 만약에.. 2020. 10. 14.
c언어 코드 최적화 3장. LOOP 최적화 코드를 짜다보면 반복문은 무조건 사용하게 되어있다. 그런데 이 반복문 연산속도가 빠른놈이 아니다. 1. 반복문은 연산속도가 느리다. 반복을 하게되면 연산속도가 늦다는 것인데, 예를 들면 1부터 n까지의 정수들으 더하는 코드를 작성하면 아래와 같을 것이다. for(int i = 1; i 2020. 10. 14.
C언어 코드 최적화 2장. 비트연산을 사용하자. C언어 코드 최적화 방법은 여러가지가 있다. 이전에 나눗셈을 사용하지 않는것을 다뤄봤었다. 이번에는 비트연산을 사용하는 것이 얼마나 빠르게 코드를 작동시키는지 다뤄보도록 하자. 비트(bit)라는 것은 데이터에서 가장 기본이 되는 값으로, 0과 1로 이루어져 있다. 1 byte 는 8 bit 이다. 우리가 사용하는 int 자료형은 4byte 로 32bit 크기라고 할 수 있겠다. 아무튼 이런 비트연산을 하면 왜 코드 작동 속도가 빨라지는지 이론상 원리로 알아보자. 1. 비트 연산( OR, AND, XOR 등)은 컴퓨터에서 가장 빠르게 실행되는 연산이다. 그러므로 이러한 연산을 사용하면 좋을 수 밖에 없다. 코드에서 예를 들어보면, struct HUMAN { int is_Alive; int is_Walkin.. 2020. 10. 14.
c언어 코드 최적화 1장. 나눗셈을 사용하지 말자. C언어는 오랜 역사를 갖고 있으며, 더 발전한 C++ 언어 역시 많은 곳에서 사용되고 있다. 특히 컴퓨터보다는 제한된 성능의 기계에서 사용하고는 한다. 보통 우리는 임베디드 시스템이라고 부른다. 임베디드 시스템에 적용하는 코드는 최적화가 절대적으로 필요하다. 왜냐하면, 컴퓨터처럼 성능이 좋은 것은 아니지마는 성능을 포기하지 않기 때문이다. 그러기에 코드 최적화를 통해서 코드 실행 시간을 단축할 필요가 있다. 코드 최적화라는 것은 쉽게 생각하면 메모리를 알맞게 사용하는 것이라고 보면 된다. 코드 최적화 방법에는 여러 가지가 있다. 그중에서 가장 기초가 되는 것이 나눗셈을 사용하지 않는 것이다. 인텔 Skylake cpu 를 기준으로 봤을 때, 나눗셈은 10 cycle의 연산이 필요하다면, 덧셈은 1 cyc.. 2020. 10. 9.
모스펫으로 DC모터 제어하는 방법 ( IRFZ44N ) 오늘 다룰 센서는 모스펫 ( MOSFET ) 이다. 생긴것이 마치 트랜지스터 처럼 생겼는데, 맞다. 트랜지스터의 한 종류다. 트랜지스터처럼 증폭의 역할을 하는 것이 아닌, 스위치의 역할을 한다고 보면 된다. 마치 릴레이와 같다. 릴레이는 하드웨어적으로 스위치 역할을 한다면, 모스펫은 회로적으로 스위치 역할을 한다. 모스펫은 언제 사용하나? - 아두이노의 출력으로는 부족한 센서를 다룰 때 사용 - 스위치 회로를 구성할 때 사용 모스펫의 활용도는 너무 무궁무진 하지만, 일반적으로 사용하는 경우는 위의 경우들이다. 아두이노는 보통 5V 와 낮은 출력 전류를 갖고 있기에 모터를 구동하기엔 턱없이 부족하다. 따라서 이런 경우에 릴레이는 부피가 너무 커서 부적합하며 모스펫을 사용하는 것이 적당하다. 또한 모터의 방.. 2020. 9. 14.
아두이노에서 서보모터 SG-90 사용하는 방법 모든 기계에서 구동부로 사용되는 부품중 제일 많은 것이 바로 모터이다. 서보모터는 기계 중에서도 로봇을 제어에 엄청 많이 사용되고 있다. 서보모터는 안에 여러개의 크고 작은 기어들로 구성되어 있어서 힘(토크)이 세고, PWM 신호를 통해서 각도를 제어할 수 있다. -서보모터의 원리를 이해하고, 아두이노에서는 어떻게 사용할 수 있는지 알아보자. - 아두이노(나노, 우노, 메가), 시리얼 통신 케이블, 점퍼선(M-M) 서보모터를 사용하다보면 항상 헷갈리곤 하는게 GND가 뭐고, SIGNAL 선이 어떤 것인지이다. 신호선에 ▼ 삼각형 표시가 있으니, 앞으로는 헷갈려하지 말자! 아니면 주황색 선이 신호선이라는 것을 기억하자! 서보모터는 PWM 신호를 통해서 제어할 수 있다. 아두이노 우노에는 PWM 신호를 보낼.. 2020. 9. 14.
아두이노에서 적외선 근접센서 TCRT5000 사용하는 방법 아두이노를 사용함에 있어서 적외선 근접센서는 정말 손쉽게 접할 수 있는 센서이다. 쉽게 접할 수 있지만, 사용방법을 모르면 문제가 많은 센서이기도 하다. LED 이므로 +극과 -극을 정확하게 이해하고 사용해야 하며, LED 이고 적외선이기에 전압이 많이 흘러버리면 한순간에 타버려 고장나기 일수다. - 적외선 근접센서 TCRT5000 사용법을 정확하게 이해하고 사용하자. 원리는 정말 간단하다. 적외선 LED에서는 항상 적외선 신호를 발사해주고, 물체가 가깝다면 그 적외선 불빛의 반사량을 측정해서 가까운 정도를 측정하는 것이다. 약간 다른 식으로 사용한다면 검은색을 구분하는 센서로 사용하기도 한다. 검은색은 하약색에 비해서 빛을 반사하는 정도가 적기 때문이다. 예를 들면, 라인 트레이싱에 사용되는 것이 대표.. 2020. 8. 19.
[C++ opencv] 허프변환 원 검출하는 방법, HoughCircles 본문 목표 영상처리에 있어서 원을 검출할 상황이 종종 발생한다. 이런 경우에 허프변환을 이용하여 원을 검출해낼 수 있다. OpenCV에서 어떻게 허프변환을 이용하여 원을 검출할 수 있는지 알아보자. 키워드 : HoughCircles 알아볼 함수 원형 - 허프변환 원 검출 ( HoughCircles ) vector circles; HoughCircles(img_houghC, circles, HOUGH_GRADIENT, 1, 100, 50, 35, 0, 0); HoughCircles( src, dst, method, dp, min_dist, parameter1, parameter2, min_Radius, max_Radius) ○ src : 입력할 이미지 변수, grayscale 의 이미지를 입력해야 함 ○ .. 2020. 7. 29.
[C++ opencv] 허프변환과 확률을 이용한 직선 검출하기, HoughLinesP 본문 목표 영상처리에 있어서 직선 검출이 필요한 상황이 있다. 이런 경우에 허프변환을 통해서 직선을 검출할 수 있는데, 여기에 확률을 더해서 계산할 수 있다. 기존의 허프변환 방식은 하나하나 다 해보느라 시간이 오래 걸리는 방식이었다면 확률을 이용하여 직선인 것들만 구하므로 보다 빠르다. 허프변환에 확률을 적용한 직선검출을 OpenCV 에서는 어떻게 사용하는지 알아보자. 키워드 : Hough transform line, HoughLinesP 알아볼 함수 원형 - 확률적용 허프변환 직선검출 ( HoughLinesP ) vector linesP; HoughLinesP(img_canny, linesP, 1, (CV_PI / 180), 50, 50, 10); HoughLines( src, dst, rho, th.. 2020. 7. 29.
[C++ opencv] 허프변환을 이용하여 직선 검출하기, HoughLines 본문 목표 영상처리에 있어서 직선 검출이 필요한 상황이 있다. 이런 경우에 허프변환을 통해서 직선을 검출할 수 있는데, OpenCV 에서는 어떻게 사용하는지 알아보자. 키워드 : Hough transform Line 알아볼 함수 원형 - 허프변환 직선 검출 ( HoughLines ) Mat img = imread("lane.png"); Mat img_gray; cvtColor(img, img_gray, COLOR_BGR2GRAY); Mat img_canny; Canny(img_gray, img_canny, 150, 255); vector lines; HoughLines(img_canny, lines, 1, CV_PI / 180, 150); Mat img_hough; img.copyTo(img_hough).. 2020. 7. 29.
[C++ opencv] 이미지의 pixel 데이터 접근하기, 색상 정보 확인하기 본문 목표 영상처리를 하다보면 영상의 pixel 데이터를 확인해봐야 할 때가 생기기 마련이다. OpenCV에서는 어떻게 pixel 데이터를 확인할 수 있는지 알아보자. 키워드 : at, ptr, data 알아볼 함수 원형 Mat::at - 행렬 좌표로 픽셀 데이터 접근 ( img.at(row, col) ) for (int row = 0; row < img.rows; row++) { for (int col = 0; col < img.cols; col++) { uchar b = img.at(row, col)[0]; uchar g = img.at(row, col)[1]; uchar r = img.at(row, col)[2]; printf("\t (%d, %d, %d)", r, g, b); } cout 2020. 7. 28.
[C++ opencv] HSV 색상 검출하기 본문 목표 영상처리를 하다보면 특정 물체의 색을 인식해야할 상황이 주어진다. 컴퓨터에서 다룰 수 있는 색 영역은 크게 RGB 와 HSV 가 있는데, RGB는 컴퓨터에 최적화 되어있고, HSV는 사람의 눈과 비슷하다. 물체의 색을 인식한다면 사람과 같은 방식인 HSV 색 영역을 사용해야 하는데, Opencv 에서 어떻게 HSV 색채널을 다룰 수 있는지 알아보자. 키워드 : inRange( ) , bitwise_and( ), HSV 알아볼 함수 원형 - 이중 임계값 처리 ( inRange ) Mat img = imread("balls.jpg"); Mat img_hsv; cvtColor(img, img_hsv, COLOR_BGR2HSV); Mat yellow_mask, yellow_image; Scalar l.. 2020. 7. 27.