1. 빅데이터

 

ᆞ일반적인 DB SW로 관리하기 어려운 정도의 큰 규모의 데이터

ᆞ의사결정 도와주기 위해서 비용효과적으로, 혁신적으로 정보 처리가 필요한 빠른 속도로 생성되는 다양한 형태의 대용량     정보 자산

 

2. 분석적 CRM과 데이터마이닝 정의

 

ᆞ고객관계관리 시스템의 유형

 - 운영 CRM(Operational CRM) : 영업 자동화

 - 협업 CRM(Collaborative CRM) : 콜센터 자동화, 웹사이트 등 고객 접점 관리

 - 분석 CRM(Analytic CRM) : 고객 데이터 분석과 활용

ᆞ데이터마이닝은 분석 CRM의 도구

ᆞ데이터마이닝의 정의

 - 대용량의 데이터로부터 자동적이거나, 반자동적인 방법을 통해서 이들 데이터 내에 존재하는 관계, 패턴, 규칙 등을 탐색하고 찾아내어 유용한 지식을 추출하는 일련의 과정들

 

3. 데이터마이닝으로 할 수 있는 것들

 

분류(Classification)

- 사전에 정의된 범주들에 개체를 할당할 수 있는 모형(Model)을 만드는 것

- 데이터마이닝 작업에서 가장 보편적이라 할 수 있다. 우리는 생물을 문, , 속으로 분류를 하고 사물을 원소에 따라 구분하고, 개를 혈통에 따라, 사람을 인종으로 분류하는 것처럼 세상을 이해하고 교류하면서 살아가기 위해 꾸준히 분류를 시도하여 왔다. 사실, 점수를 매기고 등급으로 나누는 것도 분류에 속할 수 있다. 이런 맥락에서 보면 분류라는 것은 이미 인간생활과 오래 전부터 밀접한 관계를 맺어 왔다고 볼 수 있다. 분류라는 것은 어떤 새로운 사물이나 대상의 특징을 파악하여 미리 정의되어 있는 분류코드에 따라 어느 한 범주에 할당하거나 나누는 것을 의미한다. 이러한 목적을 위하여 대부분의 분류 대상들은 이미 데이터베이스에 레코드 형태로 입력되어 있기 때문에 이를 분류한다는 것은 각각의 레코드를 이미 정의되어 있는 분류 기준에 따라 한 범주로 할당하고 이를 나타내기 위하여 하나의 분류변수를 만들어 각각의 레코드에 추가하는 것을 말한다. 분류업무는 잘 정의된 분류코드나 이미 분류가 끝난 사례들로 이루어진 분석용 자료에 따라 특징지어 진다. 바로 이러한 업무는 아직 분류하지 않은 자료에 적용하여 분류할 수 있는 어떤 종류의 모형을 구축하는 것을 말한다.

- 의사결정나무, 최근접 이웃기봅, 인공신경망, 연결분석 등의 도구를 이용한다.

 

추정(Estimation)

- 분류는 이산형 출력, 추정은 연속형 값을 가지는 결과를 다룸

- 분류는 목표변수가 이산형인 것을 주로 다룬다. 예를 들면, 어떤 결과가 '' 혹은 '아니오' 라든가, 종교를 묻는 질문에서 '기독교', '불교' 혹은 '천주교' 처럼 목표변수가 범주형으로 주어진다. 그런데 추정은 결과가 연속형 값을 갖는 경우를 주로 다룬다. 어떤 주어진 입력변수로부터 수입, 키 혹은 은행잔고와 같은 미지의 연속형 변수에 대한 값을 알아내기 위하여 추정(Estimation)을 이용한다. 실제로 추정은 분류작업을 하는데 자주 이용된다.

 

- 예를 들어 카드요금 청구서 봉투에 스키부츠 광고를 싣고자 할 때 고객의 성향을 알면 더 좋은 결과를 얻을 수 있다. 이때 카드소지 고객이 스키를 타는지 타지 않는지 혹은 스키에 대한 성향 점수를 추정하여 부츠를 살 잠재 고객인지 아닌지를 분류를 하게 된다. 그리고 만약 각각의 추정값이 크기 순서로 나열되어 있다면 이용가치가 더욱더 있을 것이다.

 

- 회기분석, 생존분석, 인공신경망이 사용

 

예측(Prediction)

- 미래 행위를 분류하거나 미래 값을 추정, 입력변수와 출력 변수간의 순차적(Temporal) 관계 고려

- 대부분의 데이터마이닝 기술들은 예측 작업에 활용 가능

 

 

유사성 집단화(Affinity Grouping) 또는 연관성 규칙(Association Rules)

- 어떤 일들이 함께 발생하는 지 판단

- 장바구니 분석

 

군집화(Clustering)

- 이질적인 개체들의 모집단으로부터 다수의 동질적인 하위 집단 혹은 군집(Cluster)들로 세분화하는 작업

- 비슷한 고객끼리 묶는것

- 다른 방법을 사용하기 전에 주로 사용도니다.

- K-means, SOM

 

설명(Description)과 프로파일링(Profiling)

- 고객, 상품, 업무 프로세스 등에 무슨 일들이 일어나는 지에 대한 이해(Understanding)를 높이는 방법으로 데이터마이닝을 사용할 수 있음

- 가시화 기법

 

4. 데이터마이닝 선순환 프로세스

1단계

- 경영의 문제 또는 기회를 포착함

2단계

- 데이터마이닝을 통해 데이터를 행동 가능한 정보로 전환함

3단계

- 정보에 따라 행동함ᆞ4단계

- 결과를 측정함

 

'머신러닝' 카테고리의 다른 글

P value  (0) 2018.08.06
N-gram  (0) 2017.05.04
Sentiment Analysis  (0) 2017.05.04
의사결정트리 (1)  (0) 2017.05.01

코드

#include <opencv2/opencv.hpp>

#include <opencv2/highgui.hpp>


using namespace cv;

using namespace std;


int x_ = 0;

int y_ = 0;


Mat tImage1; Mat tImage2; Mat tImage3; Mat tImage4;

Mat dstImage; Mat srcImage;



void find() {


double minVal, maxVal;

Point minLoc, maxLoc;

Mat result;


matchTemplate(srcImage, tImage1, result, TM_CCOEFF_NORMED);

minMaxLoc(result, NULL, &maxVal, NULL, &maxLoc);



if (maxLoc.x <= x_

&& maxLoc.y <= y_

&& maxLoc.x + tImage1.cols >= x_

&& maxLoc.y + tImage1.rows >= y_) {

printf("A \n");

}



matchTemplate(srcImage, tImage2, result, TM_CCOEFF_NORMED);

minMaxLoc(result, NULL, &maxVal, NULL, &maxLoc);


if (maxLoc.x <= x_

&& maxLoc.y <= y_

&& maxLoc.x + tImage1.cols >= x_

&& maxLoc.y + tImage1.rows >= y_) {

printf("S \n");

}



matchTemplate(srcImage, tImage3, result, TM_CCOEFF_NORMED);

minMaxLoc(result, NULL, &maxVal, NULL, &maxLoc);


if (maxLoc.x <= x_

&& maxLoc.y <= y_

&& maxLoc.x + tImage1.cols >= x_

&& maxLoc.y + tImage1.rows >= y_) {

printf("b \n");

}



matchTemplate(srcImage, tImage4, result, TM_CCOEFF_NORMED);

minMaxLoc(result, NULL, &maxVal, NULL, &maxLoc);


if (maxLoc.x <= x_

&& maxLoc.y <= y_

&& maxLoc.x + tImage1.cols >= x_

&& maxLoc.y + tImage1.rows >= y_) {

printf("m \n");

}


}


static void mouse_callback(int event, int x, int y, int, void* param) {


if (event == EVENT_LBUTTONDOWN) {

x_ = x;

y_ = y;

find();

}

}



int main()

{

srcImage = imread("image4/alphabet.bmp", CV_LOAD_IMAGE_GRAYSCALE);

if (srcImage.empty())

return -1;


tImage1 = imread("image4/A.bmp", CV_LOAD_IMAGE_GRAYSCALE);

tImage2 = imread("image4/S.bmp", CV_LOAD_IMAGE_GRAYSCALE);

tImage3 = imread("image4/b.bmp", CV_LOAD_IMAGE_GRAYSCALE);

tImage4 = imread("image4/m.bmp", CV_LOAD_IMAGE_GRAYSCALE);


cvtColor(srcImage, dstImage, COLOR_GRAY2BGR);


imshow("dstImage", dstImage);

setMouseCallback("dstImage", mouse_callback);


waitKey();

return 0;

}


코드해석

인식할 문자(A,S,b,m)와 전체 영상(alphabet)을 load하여 마우스 콜백이 일어나면 템플릿 매칭을 시킨다.

인식한 영상의 MinLoc과 MaxLoc을 알아와서 영역을 설정해준다.

그리고 마우스 좌표가 해당영역안이면 콘솔에 문자를 입력한다.



마우스의 영역을 찾는것이 이 문제의 해결 방법인것 같다.


결과화면


'Programming > openCV' 카테고리의 다른 글

polygon Detection  (0) 2017.05.03
open cv 요약  (0) 2017.04.18
BGR별 히스토그램 구하기  (0) 2017.04.11
vector에 접근하는 두가지 방법  (0) 2017.04.11
13. Hough Circles  (0) 2017.04.04

이미지 읽기 &저장

Mat img_color = imread("sample.jpg"); // color load

Mat img_gray = imread("sample.jpg", 0); // gray load

imwrite("fname.jpg", img);


이미지 생성, 복사, 형변환, 색상변환, roi 설정

int w = 320; // width

int h = 240; // height


// 생성

Mat img(h,w,CV_8UC1);                    //1채널 unsigned char

Mat img(h,w,CV_8UC3);                    //3채널 unsigned char

Mat img = Mat::zeros(h,w,CV_32FC1);//1채널 float

Mat img = Mat::ones(h,w,CV_64FC3);//3채널 double


unsigned char * img_buffer;            // 이미지버퍼 포인터

Mat img(h, w, CV_8UC3, img_buffer);//메모리 공유


// 원소 초기화

Mat img(h,w,CV_8UC1);

img = Scalar(3);                 // img 모든 원소값 3으로 초기화


// 참조, 복사

Mat img2 = img;                 // 메모리 공유

Mat img2 = img.clone();       // 별도 메모리

Mat img2; img.copyTo(img2);//별도 메모리


// 형변환 복사

Mat img1(h,w,CV_32FC1);

Mat img2;

img1.convertTo(img2, CV_8U);


// gray-color 변환

cvtColor(color, gray, CV_BGR2GRAY);

cvtColor(gray, color, CV_GRAY2BGR);


// roi 설정

Rect roi;

Mat sub_img = img(roi);                //메모리공유

Mat sub_img = img(roi).clone();    //별도메모리


영상 크기변경 및 상하좌우 반전

// 크기 변경

Mat dst;

resize(img, dst, Size(new_w,new_h));

resize(img, dst, Size(), 0.5, 0.5);    //scalex, scaley


// 영상 반전(flip)

flip(img, dst, 0);        // vertical flip

flip(img, dst, 1);        // horizontal flip

flip(img, dst, -1);       // vertial &horizontal flip


이미지에 그리기 (drawing)

Rect rc(x,y,w,h);

Scalar color(B,G,R);

int thickness=1;         // line thickness


line(img, Point(x1,y1), Point(x2,y2), color, thickness);


rectangle(img, rc, color, thickness);

rectangle(img, rc.tl(), rc.br(), color, thickness);

rectangle(img, rc, color, CV_FILLED);// filled rectangle


Point center(rc.x+rc.width/2, rc.y+rc.height/2);

Size radius(rc.width/2, rc.height/2);

double rot_deg = 0;     // rotation of ellipse

double s_deg = 0;     // start angle of arc

double e_deg = 360;     // end angle of arc

ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,thickness);

ellipse(img,center,radius,rot_deg,s_deg,e_deg,color,CV_FILLED);


int circle_radius = 10;

circle(img, center, circle_radius, color, thickness);

circle(img, center, circle_radius, color, CV_FILLED);


putText(img, "text", Point(x,y), FONT_HERSHEY_SIMPLEX, 1., color, thickness);

putText(img, "text", Point(x,y), FONT_HERSHEY_DUPLEX, 1., color, thickness);


이미지 디스플레이하기 (display)

namedWindow("name");                                 // auto resized

namedWindow("name",CV_WINDOW_NORMAL); // manual resize


imshow("name", img);

char ch = waitKey();     // 무한 대기

char ch = waitKey(10);    // 10 msec 대기

if(ch == 27) ...             // ESC key

if(ch == 32) ...             // SPACE key


destroyWindow("name");

destroyAllWindows();


웹캠 연결하기

VideoCapture vc(0);

if (!vc.isOpened()) return; // 연결실패

vc.set(CV_CAP_PROP_FRAME_WIDTH, 640);

vc.set(CV_CAP_PROP_FRAME_HEIGHT, 480);


Mat img;

while(1){

vc >>img;

if(img.empty()) break;

imshow("cam",img);

if(waitKey(10)==27) break; //ESC

}

destroyAllWindows();


avi 비디오 파일 읽어오기

VideoCapture vc("sample.avi");

if (!vc.isOpened()) return; // 불러오기 실패


Mat img;

while(1){

vc >>img;

if(img.emplty()) break;

imshow("video",img);

if(waitKey(10)==27) break; //ESC

}

destroyAllWindows();


avi 비디오 녹화하기

double fps = 15;

int fourcc = CV_FOURCC('X','V','I','D'); // codec

bool isColor = true;


VideoWriter *video = new VideoWriter;

if(!video->open("result.avi", fourcc, fps, Size(img_w, img_h), isColor)){

delete video;

return;

}


Mat img;

while(1){

// ...

*video << img;

// ...

}

delete video;


Mat <--> IplImage

Mat --> IplImage

Mat matimg;

IplImage* iplimh;

iplimg = &IplImage(matimg);


IplImage --> Mat

IplImage* iplimg;

Mat matimg;

matimg(iplimg);


픽셀 접근법

  Mat image;

  

  // 3 channel Image


for(int j=0; j < image.rows; j++)

{

        for(int i=0; i < image.cols; i++)

        {

                 image.at<Vec3b> (j,i)[0] += 30;

                 image.at<Vec3b> (j,i)[1] += 20;

                 image.at<Vec3b> (j,i)[2] += 20;

 

        }

}


이때 Vec3b 는 unsigned char 형이다 

b(unsigned char) 외에도 s(short), i(int), f(float), d(double) 형의 벡터가 존재한다.


* 추가사항 *

cv::Mat클래스의 at메소드를 사용한다면 가끔은 성가실 수 있다. 행렬 타입을 알고 있다면 cv::Mat의 템플릿 하위 클래스인 cv::Mat_ 클래스를 사용할 수 있다.

 

cv::Mat_<uchar> im2 = image;  //im2는 image를 참조

im2(50,100) = 0; // 50행 100열 화소에 접근


출처: http://jangjy.tistory.com/21 [살다보니..]

'Programming > openCV' 카테고리의 다른 글

polygon Detection  (0) 2017.05.03
사진 인식  (0) 2017.04.22
BGR별 히스토그램 구하기  (0) 2017.04.11
vector에 접근하는 두가지 방법  (0) 2017.04.11
13. Hough Circles  (0) 2017.04.04

기계가 인간은 대신한다.

공장은 모두 기계로 대체 될 것이다. 그리고 의사의 처방은 기계가 대신 내려 줄 것이며, 약도 기계가 줄 것이다. 모르는게 있으면 선생님 대신 시리에게 질문을 하고 답을 얻는다. 그런 세상이 곧 올 것이며, 얼마 남지 않았다. 이제 사람이 설 자리가 점점 줄어들고 있다. 이러한 시국에 우리는 어떻게 살아야할 것인가.

우선 기계가 대체 할 수 있는 직업이란 기계적으로 움직이는 직업을 말한다. 모든 일에는 패턴이라는게 존재한다. 예를 들어 의사가 진료를 보고 약을 지어줄 때, 환자들의 패턴을 보고 어떤 약을 처방할지 판단한다. 그리고 약사는 의사의 처방에 따라 단순하게 약을 처방한다. 이제 이러한 일은 기계가 대신할 가능성이 크다. 그러므로 우리는 이제 주어진 직업에서 인간만이 할 수 있는 일을 찾아야한다. 그렇다면 인간만이 할 수 있는 일은 무엇일까.

사람을 사람답게 대하는 것이다. 이 말의 뜻은 사람을 단순히 일을 해야 하는 대상으로 여기는 것이 아니라, 사람으로 대하는 것이다. 예를 들어서 기계적으로 환자의 상처를 치료해주는 것이 아니라 이와 더불어서 사람의 마음을 공감하는 것처럼 인간으로 대하는 것이다. 또한 설계자들은 일정한 패턴을 벗어나서 사람이 접근하기 편한 방법으로 설계한다던지 하는 방법으로 말이다. 이와 같이 기계의 관점에서 보면 최적화 되어있지 않은 아주 비효율적인 방법이겠지만, 사람의 입장에서는 더 효율적으로 보이는 방법처럼 말이다.

사람이 기계를 사용하는 이유는 안전을 위해서 또는, 시간을 줄이기 위해서 등 일 것이다. 그 중에서 가장 큰 이유는 시간을 절약하기 위해서이다. 왜냐하면 시간은 하루 24시간으로 정해져있고, 그 시간 안에서 일을 효율적으로 하기 위해 기계를 사용하는 경우가 많기 때문이다. 그래서 인간의 시간을 좀 더 벌어준다. , 기계가 가장 중요하게 생각하는 것은 일에 대한 시간의 단축이다. 따라서 기계가 가장 비효율적이라고 생각하는 것은 시간이 오래 걸리는 것이다. 하지만 사람을 때에 따라서 시간을 많이 소모하면서 일을 해야할때가 있다. 과연 그것이 무엇일까. 기계가 가장 비효율적이라고 생각하지만, 사람에게 꼭 필요한 것.

교사에게는 그런 것이 아이들에게 인성을 가르치는 것이 될 수 있을 것이다. 아이들의 인성을 교육한다는 것은 기계가 교육만 한다고 해서는 절대 될 수 없을 것이다.

 

 

기계는 사람이 지금껏 만들어온 과학의 법칙, 공학 등의 집약체이고, 따라서 기계는 사람이 정한 것들(예를 들면 시간, 숫자 등)의 제약을 받는다. 하지만 사람은 이러한 것의 제약을 받지 않는다.

 

기계로 상담을?

기계는 학습은 할 수 있지만 이해는 하지 못한다.

'Think' 카테고리의 다른 글

기계와 인간의 경계  (4) 2017.05.13
사람답다.  (0) 2017.05.09
(10/9)말씀  (0) 2016.10.09
소프트웨어 교육의 이유  (0) 2016.10.05
믿을수 없는 믿음  (0) 2016.10.05

코드

#include<iostream>

#include<opencv2\core.hpp>

#include<opencv\cv.h>

#include<opencv2\highgui.hpp>

#include<opencv2\imgproc.hpp>


using namespace cv;

using namespace std;


int main(){


Mat inputImg = imread("image/humming_bird.jpg", CV_LOAD_IMAGE_COLOR);


MatND histogramB, histogramG, histogramR;

int channel_B[] = { 0 };  // Blue

int channel_G[] = { 1 };  // Green

int channel_R[] = { 2 };  // Red

float channel_range[2] = {0.0 , 255.0};

const float* channel_ranges[1] = { channel_range };

int histSize[1] = { 256 };


// R, G, B별로 각각 히스토그램을 계산한다.

calcHist(&inputImg, 1, channel_B, Mat(), histogramB, 1, histSize, channel_ranges);

calcHist(&inputImg, 1, channel_G, Mat(), histogramG, 1, histSize, channel_ranges);

calcHist(&inputImg, 1, channel_R, Mat(), histogramR, 1, histSize, channel_ranges);


// Plot the histogram

int hist_w = 512; int hist_h = 400;

int bin_w = cvRound((double)hist_w / histSize[0]);


Mat histImageB(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));

normalize(histogramB, histogramB, 0, histImageB.rows, NORM_MINMAX, -1, Mat());


Mat histImageG(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));

normalize(histogramG, histogramG, 0, histImageG.rows, NORM_MINMAX, -1, Mat());


Mat histImageR(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));

normalize(histogramR, histogramR, 0, histImageR.rows, NORM_MINMAX, -1, Mat());


for (int i = 1; i < histSize[0]; i++)

{


line(histImageB, Point(bin_w*(i - 1), hist_h - cvRound(histogramB.at<float>(i - 1))),

Point(bin_w*(i), hist_h - cvRound(histogramB.at<float>(i))),

Scalar(255, 0, 0), 2, 8, 0);


line(histImageG, Point(bin_w*(i - 1), hist_h - cvRound(histogramG.at<float>(i - 1))),

Point(bin_w*(i), hist_h - cvRound(histogramG.at<float>(i))),

Scalar(0, 255, 0), 2, 8, 0);


line(histImageR, Point(bin_w*(i - 1), hist_h - cvRound(histogramR.at<float>(i - 1))),

Point(bin_w*(i), hist_h - cvRound(histogramR.at<float>(i))),

Scalar(0, 0, 255), 2, 8, 0);


}



namedWindow("Original", CV_WINDOW_AUTOSIZE);

namedWindow("HistogramB", CV_WINDOW_AUTOSIZE);

namedWindow("HistogramG", CV_WINDOW_AUTOSIZE);

namedWindow("HistogramR", CV_WINDOW_AUTOSIZE);


moveWindow("Original", 100, 100);

moveWindow("HistogramB", 110, 110);

moveWindow("HistogramG", 120, 120);

moveWindow("HistogramR", 130, 130);


imshow("Original", inputImg);

imshow("HistogramB", histImageB);

imshow("HistogramG", histImageG);

imshow("HistogramR", histImageR);


waitKey(0);

return 0;

}


결과




'Programming > openCV' 카테고리의 다른 글

사진 인식  (0) 2017.04.22
open cv 요약  (0) 2017.04.18
vector에 접근하는 두가지 방법  (0) 2017.04.11
13. Hough Circles  (0) 2017.04.04
iterator의 개념  (0) 2017.04.04

vector<Vec3f> circles;

  Vec3f vec;


for (int i = 0; i < circles.size(); i++) {

vec = circles[i];

int cx = vec[0];

int cy = vec[1];

int radius = vec[2];

printf("Circles[%d]: (cx , cy)= (%d , %d), r = %d\n", k++, cx, cy, radius);

circle(image, Point(cx, cy), radius, Scalar(0, 0, 255), 2);

}




  vector<Vec3f> circles;

vector<Vec3f>::const_iterator itc = circles.begin();

while (itc != circles.end()) {

int cx = (*itc)[0];

int cy = (*itc)[1];

int radius = (*itc)[2];

printf("Circles[%d]: (cx , cy)= (%d , %d), r = %d\n", k++, cx, cy, radius);

circle(image, Point(cx, cy), radius, Scalar(0, 0, 255), 2);

++itc;

}




같은 결과 값을 가진다.

'Programming > openCV' 카테고리의 다른 글

open cv 요약  (0) 2017.04.18
BGR별 히스토그램 구하기  (0) 2017.04.11
13. Hough Circles  (0) 2017.04.04
iterator의 개념  (0) 2017.04.04
12. Templet Matching  (0) 2017.04.04

출처 : http://www.hellot.net/new_hellot/magazine/magazine_read.html?code=202&idx=29498



임베디드 시스템, 2023년까지 가파른 성장 전망...자동차 및 의료가 수요 견인

입력 : 2016.06.02 17:06

글자크게보기 글자작게 댓글달기 좋아요 즐겨찾기

페이스북 트위터 카카오스토리 블로그

보안 문제, 여전히 해결해야 할 과제


최근 다양한 산업의 기술 혁신으로 대표되는 사물인터넷의 출현과 함께 자동차(혹은 커넥티드카), 의료 분야에서의 수요 증가로 임베디드 시스템 시장이 폭발적으로 성장할 것으로 전망된다. 한 시장조사기관은 글로벌 임베디드 시스템 시장이 2023년까지 연간 5.6%씩 성장하면서 2,587억 달러 규모를 달성할 것으로 예측했다. 그러나 기술 혁신으로 임베디드 시스템 간 연계되면서 발생할 수 있는 보안 문제는 해결해야 할 과제로 나타났다.


글로벌 임베디드 시스템 시장이 가파르게 성장할 것으로 보인다. 시장조사기관인 Radiant Insights가 발표한 보고서에 따르면, 2013년 1,403.2억 달러였던 이 시장은 연간 5.6%씩 성장하면서 2023년에는 2,587.2억 달러에 이를 전망이다(그림 1). 이러한 성장 배경에는 최근 출현한 사물인터넷에 힘입어 자동차와 의료 분야에서 임베디드 시스템에 대한 수요가 급증할 것으로 전망되기 때문이다. 보고서는 이 두 산업이 향후 임베디드 시스템 시장의 성장을 견인할 것으로 내다봤다. 


▲ 그림 1. 산업별 임베디드 시스템 시스템 시장 규모 (자료 : Radiant Insights)


임베디드 시스템은 마이크로프로세서 혹은 마이크로컨트롤러를 내장해 원래 제작자가 지정한 기능만을 수행하는 장치를 의미한다. 임베디드 하드웨어와 소프트웨어(OS, 소프트웨어)로 구성되며, 하드웨어는 프로세서/컨트롤러, 메모리, I/O, 네트워크를 포함하고, 임베디드 소프트웨어는 커널, 시스템 SW, 응용SW로 나뉜다. 보고서에 따르면, 2014년 임베디드 하드웨어는 시장 규모는 1,440억 달러로 사상 최대를 기록했다. 이 시장은 앞으로 연간 5.5%씩 성장하면서 2023년에는 2,400억 달러에 이를 것으로 예상됐다(그림 2). 특히, 러시아, 대만, 브라질, 인도, 중국과 같은 신흥 국가들이 산업 성장을 주도하는 새로운 기술들을 도입함으로써 이 기간 동안 임베디드 하드웨어의 수요 증가를 이끌 것으로 분석됐다. 


▲ 그림 2. 임베디드 하드웨어 시장 규모 (자료 : VDC Research)


이와함께 2014년 임베디드 소프트웨어 시장 규모는 95억 달러로 잠정 집계됐다. 보고서는 이 시장이 2023년에는 180억 달러 규모로 성장할 것이며, 가까운 미래에 IoT에 대한 수요가 폭발하게 될 경우, 임베디드 소프트웨어 산업 성장에 긍정적인 영향을 미칠 것으로 내다봤다.


자동차와 헬스케어, 임베디드 시장 성장 견인


이러한 임베디드 시스템은 현재 정보 가전, 정보 단말, 통신 장비, 항공/군용, 물류/금융, 차량/교통, 사무, 산업/제어, 의료, 게임, 로봇 등의 분야에서 활발하게 활용되고 있다. 그야말로 모든 산업에서 임베디드 시스템은 필수적인 요소가 됐다. 다양한 애플리케이션 중에서도 차량과 의료 분야가 임베디드 시스템의 가장 커다란 수요처가 될 것이란 전망이다.


2014년 전체 임베디드 시스템 시장 중 자동차가 22%를 차지했으며, 2013년 292.3억 달러였던 시장은 연간 6.7%씩 성장해 2020년에는 459.8억 달러에 이를 것으로 예측됐다. 가파른 성장의 배경으로 자동차와 도로의 통신과 효과적인 탐색 기능을 제공하기 위해 스마트 차량에서의 임베디드 시스템 도입이 늘어나고 있다. 또 배기 가스 규제라는 규율 준수를 위한 전기자동차 및 하이브리드 차량의 증가 역시 임베디드 시스템의 시장 성장 요인으로 지목됐다. 지금까지 동향을 보면 무선 통신 기술, 무선 통신, 디지털 처리 기술의 진보와 차량 내 전자 콘텐츠를 효율적으로 작동시키는 임베디드 시스템과 소프트웨어가 자동차 산업에서 크게 증가하고 있다. 


자동차 한 대에는 A4 용지 400만장 분량의 임베디드SW가 내장된다고 한다. 전자제어장치(ECU)와 같은 40여대 컴퓨터가 1000여개의 반도체 칩을 작동 및 제어하며 최적의 주행이 이뤄지도록 자동적으로 조절한다. GSMA는 2018년 임베디드 시스템을 채택한 차량이 3,500만 대를 돌파해 전세계 자동차 판매량의 약 31%를 점유할 것으로 전망했다. 


헬스케어 분야는 자동차에 이어 두 번째로 큰 임베디드 시스템 시장이다. 2020년까지 연간 7.1%씩 성장할 것으로 전망되고 있다. 사회 전반적으로 수명이 연장되고, 고급 의료기기 및 휴대용 의료기기의 수요가 증가되면서 임베디드 시스템 수요 역시 자연스럽게 늘어날 것으로 분석됐다. 일례로, ECG 신호 모니터링 모바일 임베디드 시스템, 혈당 모니터, 심박수 모니터 등과 같은 의료 장비의 도입이 증가하면서 임베디드 시스템의 수요 역시 늘어나고 있다. 


북미, 점유율 1위 … 아태 지역 가파른 성장 


임베디드 시스템 시장 규모는 어느 지역이 가장 클까? 보고서에 따르면, 2013년 임베디드 시스템 시장 규모가 가장 큰 지역은 북미로 전체 시장의 34.56%를 차지하는 것으로 조사됐다. 이 지역의 2015년도 시장 규모는 490억 달러로 집계됐고, 앞으로 연간 5.7% 씩 성장해 가면서 2023년에는 840억 달러에 이를 것으로 전망됐다. 유럽의 경우, 같은 기간 동안 5.3% 씩 성장해 620억 달러를 초과할 가능성이 있다고 봤다.


임베디드 시스템 시장에서 아태 지역은 핫 플레이스다. 가장 빠르게 성장하고 있다. 2014년 460억 달러였던 임베디드 시스템 시장 규모가 2023년에는 북미 시장과 어깨를 나란히 할 수 있는 810억 달러로 성장할 것으로 예측됐다. 이러한 급성장 배경에 대해 보고서는 아태 지역에서는 임베디드 시스템 전문가를 쉽게 구할 수 있고, 제조 공장이 밀집돼 있어 제조 비용을 절감하는데 있어 임베디드 시스템의 활용이 증가할 것이기 때문으로 분석했다. 


복잡하긴 하지만 일반적으로 임베디드 시스템은 크게 마이크로컨트롤러/마이크로프로세서, 소프트웨어, 운영체제(OS)로 구분해 볼 수 있다. 


임베디드 소프트웨어 엔지니어링 팀의 가장 중요한 결정 사항 중 하나는 어떠한 프로세서를 활용하느냐다. 프로세서의 선택은 임베디드 시스템의 특정 용도에 따라 다르지만, 일반적으로 전력 소모, 속도, 소프트웨어 지원, 메모리 등을 고려한다.


임베디드 시스템이 다양한 산업 분야로 확대됨에 따라 프로세서는 더욱 중요해졌다. 이 시장에서 프로세서 공급업체 간의 경쟁도 치열하다. (그림 3)을 보면, 텍사스 인스트루먼트(TI), 프리스케일, 그리고 마이크로칩이 임베디드 시스템 프로세서 시장의 거의 50% 이상을 차지하는 것을 볼 수 있다. 왜냐하면 이들 기업들이 공급하고 있는 다양한 프로세서들 때문에 점유율이 높다는 분석이다. 일례로, TI는 약 230여 종의 프로세서를 판매하고 있는 반면, 10여종을 판매하고 있는 기업도 있다. 따라서 임베디드 프로세서 분야에서 경쟁 우위를 갖기 위해서는 구매자의 특정 요구를 충족시킬 수 있는 폭넓은 다양성을 갖춰야 한다.


▲ 그림 3. 임베디드 시스템 프로세서 시장 점유율 (자료 : Embedded Dragon

Consulting)


임베디드 시스템의 프로그래밍 언어 시장은 오픈소스 언어가 지배하고 있다. (그림 4)에서 보듯, C/C++ 언어가 여전히 임베디드 시스템 시장에서 78% 이상을 차지하고 있다. 오픈 소스가 아닌 LavBIEW, MATLAB, .NET은 임베디드 산업에서 차별화된 기능을 가지고 조금씩 영향력을 확대해 나가고 있는 언어들이다.


▲ 그림 4. 임베디드 시스템 언어 시장 (자료 : Embedded Dragon Consulting)


말할 필요도 없이 C/C++이 얼마 동안 임베디드 소프트웨어 개발자를 위한 프로그래밍 언어로써 가장 선호하는 경향이 지속될 것으로 전망되고 있다.


임베디드 시스템은 흔히 운영체제를 사용하지 않는 경우도 많으며, 사용한다 하더라도 윈도우 CE나 리눅스 등 임베디드에 맞춰진 운영체제나 실시간 운영체제(RTOS), 국방/항공용 실시간 운영체제(NEOS)를 사용해 자신의 새로운 시스템에 설정한다. 이는 대부분 임베디드 시스템의 경우 CPU나 메모리 자원 등의 구성이 일반 PC 등의 표준적인 플랫폼과는 달리 한계가 있는 시스템으로 일반 개인 컴퓨터용 운영체제를 사용할 수 없기 때문이다. 


임베디드 프로그래밍 언어 시장과 유사하게 임베디드 시스템의 운영체제 분야도 크게는 오픈 소스가 우위를 점하고 있다. (그림 5)에서 보는 바와 같이 임베디드 시스템을 구현하기 위해 기업에서 공급하고 있는 운영체제를 구매하는 경우는 아주 드물다. 그 중에서도 마이크로소프트, 윈드 리버, Micrium, TI가 상업용 시장을 선도하고 있다. 그러나 모든 상업용 운영체제는 전체 운영체제 시장의 약 35%를 차지하는 반면, 오픈 소스 실시간 운영체제가 65%를 점유하고 있다.


▲ 그림 5. 임베디드 운영체제 시장 점유율 (자료 : Embedded Dragon Consulting)


임베디드 성장 이면엔 보안 문제 도사려


모든 IT시장과 마찬가지로, 보안 문제가 임베디드 시스템 시장 성장의 발목을 잡을 수 있다는 시각이 많다. 우리 주변의 가전, 교통, 항공, 기계, 의료 장비, 자동차, 통신 장비 등이 대부분 임베디드 시스템에 의해 작동한다. 최근 모든 장비와 기계, 자동차 등은 OS, 웹서버, 리모트 콘트롤, 스마트 기기와 연결되는 추세다. 이러한 장비 중에서 의료 장비나 자동차 등은 보안 취약점을 통해 안전에 큰 영향을 미칠 수 있기 때문에 이에 대한 보안이 매우 중요하다.


허가받지 않은 소프트웨어 및 도난과 데이터 개인정보 보호와 같은 다른 취약점 문제에서 임베디드 시스템을 보호하는 것은 필수적이다. 이에 따라, 도난과 데이터 해커로부터 시스템을 보호하고, 이러한 문제들을 해결하기 위해 지속적인 노력이 이뤄지고 있다.


vector<Vec3f> circles;

HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, src_gray.rows/8, 200, 100, 0, 0 );

with the arguments:

  • src_gray : 입력 영상(Gray Scale)
  • circles : A vector that stores sets of 3 values: x_{c}, y_{c}, r for each detected circle.
  • CV_HOUGH_GRADIENT : 검출 함수 정의. Currently this is the only one available in OpenCV
  • dp = 1 : 누적기 해상도 (영상 크기 /2)
  • min_dist = src_gray.rows/8 : 검출된 원간의 최소거리
  • param_1 = 200 : 캐니 최대 경계값
  • param_2 = 100* : Threshold for center detection.
  • min_radius = 0 : Minimum radio to be detected. If unknown, put zero as default.
  • max_radius = 0 : Maximum radius to be detected. If unknown, put zero as default




코드


#include <iostream>

#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>



using namespace cv;

using namespace std;


int main()

{

Mat image;

image = imread("image4/circle2.jpg", CV_LOAD_IMAGE_COLOR);


vector<Vec3f> circles;

HoughCircles(

image, // 원본이미지 

circles, 

CV_HOUGH_GRADIENT,

1,   // 누적기 해상도(영상크기/2)

100, // 두 원 간의 최소 거리

100, // 캐니 최대 경계값

50 // 투표 최소 개수

);


cout << "circles.size()= " << circles.size() << endl;

vector<Vec3f>::const_iterator itc = circles.begin();

int k = 0;


while (itc != circles.end()) {


int cx = (*itc)[0];

int cy = (*itc)[1];

int radius = (*itc)[2];


printf("Circles[%d]: (cx , cy)= (%d , %d), r = %d\n", k++, cx, cy, radius);

circle(image, Point(cx, cy), radius, Scalar(0, 0, 255), 2);

++itc;

}


namedWindow("Detected Circles");

imshow("Detected Circles", image);


waitKey(0);


return 0;

}


결과




'Programming > openCV' 카테고리의 다른 글

BGR별 히스토그램 구하기  (0) 2017.04.11
vector에 접근하는 두가지 방법  (0) 2017.04.11
iterator의 개념  (0) 2017.04.04
12. Templet Matching  (0) 2017.04.04
11. Emboss, sketch, 수채화  (0) 2017.04.04

+ Recent posts