no image
[Object Tracking] OpenCV 객체추적 프로그램 접근법 (MeanShift and CAMShift)
OpenCV 객체추적 프로그램을 만들려면 일단 MeanShift 와 CamShift 개념을 알아야 한다. 사실 객체추적 혹은 영상추적 프로그램은 이미 OpenCV sample source에 나와있다. 2007년에 이 샘플코드를 어떻게 응용하고 다른 기술들을 접목하여 새로운 프로그램을 생성하는데 의의가 있다고 생각한다. 영상에서 객체를 추적하는 프로그램을 개발하기 위해서 반드시 알아야 하는 개념인 MeanShift와 CamShift에 대해서 알아보도록 한다. 1. Mean-Shift Algorithm Mean-Shift 알고리즘은 데이터집합에서 특짐정, 코너, 색상정보와 같은 밀도 분포를 기반으로 ROI 객체를 추적해나가는 알고리즘이다. 이는 데이터 분포에서 peak 또는 무게중심을 찾는 방법으로써 객체를..
2016.07.07
no image
[3D Reconstruction] 3D Reconstruction 접근법
목표 "3D Reconstruction" based Point Cloud using Kinect. Streo camera in OpenNI 1. 스테레오 카메라로 입력받은 이미지를(ex using Kinect) Point Cloud(or ICP)를 이용하여 3D Reconstuction. 2. Original Object를 자연마커로 설정 3. 3D Modeling 된 객체를 자연마커 위에 증강 KinectFusion - Real-time 3D Reconstruction and Interaction Using a Moving Depth Camera [28C3] 출처 : https://www.youtube.com/watch?v=bRgEdqDiOuQ&ebc=ANyPxKpzUvOzRK0XIGsFDZXDNzLC..
2016.04.12
no image
Kruskal Algorithm and Prim Algorithm (크루스칼, 프림 알고리즘)
Kruskal Algorithm과 Prim Algorithm은 Greedy Algorithm를 적용하는 알고리즘 중의 하나이다. 최소신장트리를 구성할 때, 최적의 해를 구하려면 가중치를 낮은 간선을 선택하는 것이 좋다. 그래서 고안된게 바로 크루스칼 알고리즘이다. 크루스칼 알고리즘은 각 단계에서 가중치가 작은 간선부터 선택한다.선택하는 과정에서 사이클이 만들어질 경우 그 간선은 선택하지 않는다.그리고, 신장트리는 n개의 정점을 가질 때, 반드시 n-1개의 간선을 가지게 되어있으므로 간선이 n-1개가 되면 종료하면 된다. 크루스칼 알고리즘은 다음과 같은 사항을 고려해야한다. 1. 가중치가 작은 간선을 선택하는 데는 많은 시간이 소요되므로 모든 간선을 오름차순으로 정렬2. 깊이우선탐색(DFS), 너비우선탐색..
2016.04.11
Greedy Algorithm (탐욕 알고리즘, 그리디 알고리즘)
Greedy Algorithm은 해답에 포함될 원소들을 차례로 선택하는 과정을 거치게 되는데, 각 단계에서는 전체적인 상황을 종합적으로 판단하고, 고려하여 결정하는 것이아니라 현 시점의 정보를 바탕으로 가장 이익이 되는 원소들을 선택하는 방법이라고 할 수 있다. 복잡한 과정을 거치지 않고, 상황을 종합적으로 판단하는게 아니기 때문에 매우 빠른 알고리즘이라고 할 수 있다. 이러한 Greedy Algorithm은 '최적화 문제(optimization problem)'를 해결하기 위한 방법의 일환으로서, 예를들어 최소비용신장트리를 구하는 문제를 예로 들 수 있다. 주어진 문제에 대해 최적해를 구하는데 있어서, 문제가 부문제들로 쪼개지고, 그러한 각 부문제들의 최적해로부터 효율적으로 최적해를 구하게 될 때 Gr..
2016.04.11
no image
OpenCV Sobel Mask and Prewitt Mask (소벨 마스크와 프리윗 마스크)
정말정말 오랜만에 티스토리 OpenCV 포스팅해요 영상에서 경계선을 검출하는 방법은 영상의 1차 미분 값을 이용하는 방법이 대표적이다. 미분이란 함수의 변화량을 의미한다. 미분을 적용한 그래프는 보통 y값을 고정한 상태에서 x값의 변화에 따른 함수의 변화량을 보여주게된다. (출처 :http://kylog.tistory.com) 사진에서 볼 수 있듯, 이러한 함수의 변화는 경계선 부근에서 나타나는 현상이며, 실제 영상에서는 x값이 증가함에 따라 밝기가 급격하게 증가하는 현상으로 나타나기도 한다. 그러므로 영상에서 경계선을 검출하기 위해서는 영상을 미분한 후, 미분 값이 특정 임계값(Threshold)보다 큰 부분을 찾으면 된다. 참고로, 영상처리에서는 기울기를 그레디언트라고 한다. 그래서 자료를 찾다보면 ..
2016.04.05
no image
OpenCV Adaptive thresholding(적응적 경계화)
OpenCV를 이용한 적응적 경계화 (Adaptive Thresholding) 적분 영상으로 화소 개수 세기 영상 안의 여러 관심 영역을 대상으로 히스토그램 같은 여러 가지를 계산 해야한다고 가정하자, 이런 모든 계산에 드는 비용은 급격히 늘어 날 수 있는데, 이러한 문제점을 해결해 줄 수 있는 것이 바로 적분 영상(Integral Image)이다. 적분 영상은 영상 부분 영역에 걸친 화소를 셀 때의 효율성을 극적으로 개선할 수 있는 도구이다. 또한, 적분영상은 각 화소를 해당 화소로 범위를 정해진 왼쪽 상단 사분면의 내부에 위치한 모든 화소의 합으로 바꿈으로써 적분영상을 얻을 수 있다. 현재 화소의 적분 값은 앞에 설명했던 화소의 적분 값을 더한 현재 줄의 누적 합인 값이기 때문에 한 번만 영상을 조회..
2016.01.18
no image
OpenCV 히스토그램 구현하기
히스토그램 구현하기 영상은 다양한 화소 값으로 이루어져있으며, 영상에 걸친 화소 값 분포는 영상의 중요한 특징을 구성하게된다. 예를 들어, 1채널 그레이레벨 영상에서 각 화소는 0~255 사이의 값을 갖는다. 영상 내용에 따라 영상 내부에 펼처진 그레이 음영의 양이 저마다 다르므로 여기서 히스토그램은 영상에서 특정 값을 갖는 화소 개수를 제공하게되는 단순한 테이블이다. 그레이레벨의 히스토그램은 256개 항목(빈, bin)을 갖게 되며, 빈의 합이 1이 되게끔 히스토그램을 정규화 할 수 도 있다. cv::calcHist 함수를 이용하여 OpenCV를 이용하여 히스토그램을 쉽게 계산 할 수 있다. 다음은 히스토그램을 계산하는 histogram.h 코드이다. /*--------------------------..
2016.01.18
no image
OpenCV 픽셀 값 접근하기 - cvMat 데이터 구조
OpenCV 픽셀 값 접근하기 - cvMat 데이터 구조 저번 OpenCV 픽셀 값 접근하기 - IplImage 데이터구조 포스팅 http://eehoeskrap.tistory.com/33 지난 포스팅에서는 IplImage 데이터 구조에서 픽셀 값에 어떻게 접근하는지에 대해 포스팅하였다. 이번에는 OpenCV cv::Mat 데이터 구조에서 각 픽셀에 어떻게 접근하는지에 대해 살펴보겠다. Gray 흑백 영상의 경우 Image.at(x, y); BGR 컬러 영상의 경우 (RGB 컬러 영상을 뜻함, 보통 화소값 자체에는 BGRBGR..순서로 되어있음을 유의) using namespace cv; Image.at(x, y)[0]; // Blue Image.at(x, y)[1]; // Green Image.at(x..
2016.01.06
Opencv 픽셀 값 접근하기 - IplImage 데이터 구조
OpenCV의 영상 데이터 구조체인 IplImage는 imageData라는 배열에 영상의 픽셀 정보를 저장한다. IplImage로부터 픽셀 값을 읽어오는 방법은 두가지로 분류된다. 1. 직접 imageData라는 배열에 접근해서 가져오는 방법 2. cvGet* 함수를 이용하는 방법 1. 픽셀에 직접 접근하는 방법 픽셀에 직접 접근하는 경우는 imageData에서 픽셀의 인덱스를 계산하여 값을 얻어온다. 인덱스를 계산할 때는 보통 widthStep을 이용한다. 왜냐하면 IplImage에서 row하나가 저장되는 메모리의 폭을 나타내게된다. 그러나 영상의 폭이 홀수로 끝나는 경우는 영상의 한 row가 저장되는 메모리 폭이 width와 다를 수 있기 때문에 x 좌표가 하나씩 밀리는 현상이 나타날 수 있다. 그렇..
2016.01.05
no image
OpenCV 트랙바 처리된 이진화 영상처리 in C++
트랙바 처리 1. cvCreateTrackbar(const char* trackbar_name, const char* window_name, int* value, int count, CvTrackbarCallback on_change); 이 함수는 지정된 윈도우에 트랙바를 생성해주는 함수이다. 인자 값은 왼쪽부터 차례대로 트랙바 이름, 트랙바를 붙일 윈도우 이름, 트랙바가 생성될 떄 슬라이더의 위치, 트랙바 슬라이더의 최대 위치 값(최소위치 값은 자동으로 0), 슬라이더가 변경될 때마다 자동 호출되는 핸들러 함수 로 이루어진다. 2. void on_change(int pos); 이 함수는 트랙바 슬라이더가 변경될 때 마다 자동 호출되며, pos는 트랙바의 슬라이더 위치이다. 3. int cvGetTrac..
2016.01.05
no image
OpenCV에서 IplImage와 Mat의 차이 그리고 호환
OpenCV에서 IplImage와 Mat 구조체의 차이와 호환 C++에서는 IplImage(ex Imread)를 사용하고 C에서는 Mat 구조체(ex CvLoadImage)를 사용한다. 둘의 차이가 궁금해서 구글링해보니 스택오버플로우에서는 아래와 같은 답변을 해주었다. 결론은 C++를 사용하자는 것.. 필요에 따라 C가 필요할 수 있겠지만 그때는 호환해서 사용함이 좋겠다. 스택오버플로우 답변 : http://stackoverflow.com/questions/11115272/cvmat-and-imread-vs-ipimage-and-cvloadimage 그리고 IplImage가 OpenCV1에서 부터 사용되어왔기 때문에 예제나 소스코드가 구글에 널린건 다 알려진 사실이다. IplImage는 C언어를 쓰던 시..
2016.01.05
no image
OpenCV 히스토그램 그리기 in C++
영상처리에서 히스토그램은 필수적이다. 히스토그램은 영상의 중요한 정보를 담은 자료이며, 영상의 명암값 프로필을 보여주기 위해 사용되는 도구이다. 히스토그램은 영상의 명암도 분포 상태를 나타내는 좋은 지표이다. 히스토그램은 0부터 255까지 명암값을 가로축 인덱스로 하고, 영상을 구성하고 있는 각 화소의 명암값에 해당하는 개수를 빈도수로 간주하여 세로축에 표시하는 것이다. 다음은 C++ 로 구현된 히스토그램의 예제 코드이다. #include #include #include #include #include using namespace cv; class Histogram1D{ private: int histSize[1]; // 히스토그램 빈도수 float hranges[2]; // 히스토그램 최소/최대 화소값..
2016.01.05