본문 바로가기

분류 전체보기195

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.
[계양 컴퓨터 청소] 먼지청소부터 써멀바르기 까지 사무실에서 사용하던 컴퓨터 청소 의뢰가 들어왔다. 컴퓨터 청소를 하고 싶지만, 장비가 없고, 엄두가 나지 않는다는 의뢰인~ 컴퓨터 청소는 주기적으로 해줘야한다. 그렇지 않으면 걷잡을 수 없이 상태가 악화되고, 부품의 수명이 단축된다. 의뢰인은 쿨링이 제대로 되지 않는 것 같아서 청소의 필요성을 느끼셨다고했다... 의뢰해주신 고객님은 처음에 그냥 대충 빨리빨리 하고 가게 컴프레셔로만 해달라하셨다... 평소에 관리를 하던 컴퓨터라면 컴프레셔로 충분히 가능하지만, 관리를 하지 않았던 컴퓨터는 찌든때가 껴있기 마련이고, 찌든때가 껴있다면 컴프레셔로는 한계가 있다. 고객님께 2시간 가량 외부에 있다가 오시라고 말씀드리고 청소 작업에 들어갔다. ... 사람들이 놓치고 가는 부분인, 전면 커버 부분이다. 먼지가 이정.. 2020. 8. 6.
[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.
[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.