이미지를 xml형식으로 저장하기 위한 방법은 무엇이 있는지 알아보자. 우선, 굉장히 쉬운 방법이 있다. cvSave()라는 함수를 사용하는 것이다. 저장하기 CvMat cm; cvSave( "xml_path/test.xml", &cm); 불러오기 CvMat* A1 = (CvMat*)cvLoad("xml_path/test.xml"); 하지만, 이런 방법을 사용하면, xml이 하나 만들어지는것 같다... xml에 내가 원하는 태그로 원하는 만큼 저장하기 위해서는 CvFileStorage 구조체를 사용하면 되는 것 같다. 저장하기 CvFileStorage* fs = cvOpenFileStorage("xml_path/test.xml", 0, CV_STORAGE_WRITE); cvWrite( fs, "mytag"..
C++에서 json파싱을 하기 위한 방법으로 JsonCpp를 많이 사용한다고 한다.라이브러리다. 이것을 사용해서 Json파싱을 할 수 있도록 설치 및 설정을 해보자. 우선, JsonCpp를 아래 링크로 들어가서 다운로드 받는다.http://sourceforge.net/projects/jsoncpp/ 파일을 다운받아 압축을 풀어보면, makefiles\vs71\jsoncpp.sln 을 연다. 이를 빌드하여 lib파일을 생성해야한다. 하지만, 바로 빌드하기 전에 설정할 것이 있다. 우선, sin파일을 열어보면 다음과 같이 3개의 프로젝트가 있을 것이다. (jsontest, lib_json, test_lib_json) "각각의 프로젝트 속성 -> 구성속성 -> C/C++ -> 코드 생성"에서 "런타임 라이브러..
내가 지정한 디렉터리의 파일을 가져오고 싶을 떄는 io.h에 정의 된 _finddata_t 구조체를 사용한다. _finddata_t 구조는 다음과 같은 요소가 포함 되어있다. unsigned attrib 파일의 특성 time_t time_create 파일 작성 (-1L FAT 파일 시스템에 대한) 시간 time_t time_access 마지막 파일 액세스 (–1L FAT 파일 시스템에 대 한) 시간 time_t time_write 파일에 마지막으로 쓴 시간 _fsize_t size 길이 (바이트) char name [ _MAX_PATH] 파일의 이름입니다. 위 파일을 가져올 구조체를 활용해서 다음 아래의 함수를 이용해, 쉽게 파일 목록을 받아올 수 있다. _findfirst검색 하고자하는 파일목록의 첫번..
YCbCr을 이용하면, 입을 검출할 수 있다는 논문을 보았다. 헌데.. 잘 검출이 되지 않는다. 왜지... 생각은 이렇다. 얼굴영역의 입은 다른 구역보다 색이 붉다. 그렇다면 이런 특성을 이용하면, 입을 검출할 수 있다. (아래 사진은 탤런트 김수현이다.) 원본 이미지에서 Cr성분 1채널로 변경 후, 이를 이진화 처리한다. 이진화 처리된 값은 입술 뿐만 아니라 다른 영역도 조금 잡게 된다. 이는 모폴로지 연산을 통해 처리하면 된다. 우선 침식을 통해 잡음을 제거하고, 팽창을 통해 그 위치를 확실하게 해준다. #include "cv.h" #include "highgui.h" IplImage* getCr(IplImage *image); int main() { // Load original image, Ima..
YCbCr를 이용한 손을 검출하는 방법을 포스팅하겠다. 이 방법을 알기위해서는 우선 YCbCr이 무엇인지 부터 알아야 한다. YCbCr(YCC)는 절대 색공간이 아닌 RGB정보를 인코딩하는 방식이다. Y는 휘도성분 즉, 밝기에 대한 값이며, Cb와 Cr은 색차 성분이다. RGB에서 YCbCr 색공간의 변경공식은 다음과 같다. Y = 0.29900R + 0.58700G + 0.11400B Cb = -0.16874R - 0.33126G + 0.50000B Cr = 0.50000R - 0.41869G - 0.08131B 영상을 처리하는데 있어, RGB는 세 개의 요소가 시각적으로 균일한 정보를 가지고 있는 반면에, YCbCr은 휘도성분(Y)과 색차 성분(Cb, Cr)을 가지기 때문에 피부, 눈, 입 같은 요소..
ROI는 원본 이미지에서 관심영역을 추출할 수 있도록 해준다. // for each face draw the bounding rectangle for(i = 0; i total : 0); i++) { CvRect *r = (CvRect*)cvGetSeqElem(faces, i); CvPoint pt1 = { r->x, r->y }; CvPoint pt2 = { r->x + r->width, r->y + r->height }; cvRectangle(image, pt1, pt2, CV_RGB(0, 84, 255), 3, 8, 0); cvSetImageROI(image, cvRect(pt1.x, pt1.y, r->width, r->height)); cvAddS(image, cv..
얼굴을 검출하는 방법은 많다. 지금 포스팅 된 글은 얼굴 정면을 기계학습시킨 xml을 활용해서 만든 자료이다.약간만 틀어저도 얼굴로 인식을 안한다는.....( 이 xml은 인터넷에 많이 있으니 참고하길... ) #include "cv.h" #include "highgui.h" int main() { int i; CvHaarClassifierCascade *cascade; // face sequence will reside in the storage CvMemStorage *storage; IplImage *image; CvSeq *faces; const char *classifer = "haarcascade_frontalface_alt.xml"; // load classfier cascade from X..
Checked or Unchecked Exceptions? 우선 Checked Exception은 throws를 사용해서 명시적으로 표시해주거나, try-catch-finally를 사용해서 예외를 처리하게 된다. 반면, UncheckedException은 이런 요구들을 처리하지 않아도 된다. 둘째로, Checked Exception은 java.lang.Exception을 바로 상속하며, UncheckedException은 java.lang.RuntimeException을 상속받도록 되어있다. (자바 예외 계층구조는 다음과 같이 되어있다.) RuntimeException을 상속받은 예외들(UncheckedException)은 런타임시에 확인되며, CheckedException은 컴파일시에 확인되는 예외들이다.
Code refactoring is a "disciplined technique for restructuring an existing body of code, altering its internal structure without changing its external behavior" 리팩토링은 위 정의대로 바뀌것은 없어보이지만, 소프트웨어 내부를 더 좋게 바꾸는 작업이다. 리팩토링을 하는 이유는 무엇일까? 1. 리팩토링으로 중복된 코드를 제거함으로써, 소프트웨어의 수정 및 가독성이 좋아진다.중복된 코드를 사용하게 되면, 코드의 길이가 늘어나게 된다. 이런 경우 굉장히 복잡해 보이고, 읽기 힘들어 지기 마련이다. 또한, 수정을 하더라도, 중복된 코드의 모든 내용을 수정해야하므로, 코드의 중복은 피할 수..
properties을 사용하기 위해 우선, 프로젝트에 properties파일을 생성해야한다. 자신이 원하는 이름의 properties파일을 사용하는 프로젝트에 생성하자. 확장명은 ????.properties이다. properties는 자료구조의 Map에서 key와 value로 구성되어, 사용되는 것과같이 유사한 방식으로 사용한다. properties에서 key=value로 개행하면서 글만 써주면된다. public static String getClassName(String key) { Properties properties = new Properties(); try { properties.load(new FileInputStream("project.properties")); } catch (FileNot..
- Total
- Today
- Yesterday