OpenCV 3.0이 공개되었다.

http://opencv.org/

http://docs.opencv.org/3.0.0/

https://github.com/itseez/opencv


튜토리얼

http://docs.opencv.org/3.0.0/d9/df8/tutorial_root.html

http://docs.opencv.org/3.0.0/d9/d97/tutorial_table_of_content_features2d.html


기존 버젼의 경우 주로 이미 빌드된 binary를 사용하고,

OpenCV 내부 소스 변경이 필요한 경우 가끔 빌드했었는데,

아래 2가지 이유 때문에, 내 입장에선 이번엔 직접 빌드하는 것이 필수가 됨.


1) OpenCV 3.0의 경우 Visual Studio 2012, 2013 용으로 바이너리 제공

 => 나의 주력 개발 플랫폼인 Visual Studio 2010 용은 제공되지 않음


2) 기존 OpenCV에 포함되었던 모듈이 일부 별도 외부 모듈로 분리

https://github.com/Itseez/opencv_contrib

xfeatures2d (SURF, SIFT) , OCR, DNN 등의 모듈이 이곳에 있다



우선, build용 Tutorial을 보자.

http://docs.opencv.org/doc/tutorials/introduction/windows_install/windows_install.html#installation-by-making-your-own-libraries-from-the-source-files


대체 언제 작성한건가... 설명이 부실하다.

기본적인 컨셉만 이해하고.. 알아서 해보기로..


1. 소스 다운로드


아래 링크에서 바이너리와 함께 제공되는 소스는 직접 빌드하기에는 너무 에러가 많아서,

http://sourceforge.net/projects/opencvlibrary/files/opencv-win/3.0.0/opencv-3.0.0.exe/download


github에서 최신 버젼을 받아 (Download ZIP) 설치 경로에 압축 해제  

(D:\OpenCV_3\opencv-master)

https://github.com/itseez/opencv


2. 추가 모듈 다운로드


surf, sift, ocr 등등 (상세 정보는 https://github.com/Itseez/opencv_contrib/tree/master/modules)

추가 모듈을 활용하기 위해, 아래 링크에서 다운로드 및 설치 경로에 압축해제 

(D:\OpenCV_3\opencv_contrib-master)

https://github.com/Itseez/opencv_contrib


설치법 : https://github.com/Itseez/opencv_contrib/blob/master/README.md


3. CMAKE 다운로드 및 설치

http://www.cmake.org/download/



4. CMAKE로 configure & generate


a) 소스 경로와 모듈을 빌드할 솔루션이 생성될 경로 설정



b) Configure 버튼을 누르면, Compiler를 고르는 옵션이 뜬다.

   이 포스트에서는 Visual Studio 12 2013 Win64 기준


c) Configure가 되면, 빨간 창들과 함께 설정 창이 뜬다.

     extra로 검색하여

     OPENCV_EXTRA_MODULES_PATH에 2번에서 다운받은 파일을 압축해제한 경로 입력

     D:\OpenCV_3\opencv_contrib-master\modules



d) 기본설정에서는 BUILD_opencv_world가 체크해제되어 있음.

     하지만 대부분의 주요 함수가 opencv_world에 다 들어있으므로

   BUILD_opencv_world -> 체크

      

    추가적으로 필자가 기본 셋팅에서 변경한 부분은 아래와 같다.

    예제와 테스트 코드를 보고 싶어서 체크한 것이니, 

    빠른 컴파일을 위해서는 체크하지 않는 것이 좋음.


  WITH_OPENMP -> 체크

   ENABLE_POPCNT -> 체크

   BUILD_TESTS -> 체크

   INSTALL_TESTS -> 체크

   BUILD_EXAMPLES -> 체크

   INSTALL_C_EXAMPLES -> 체크


e) cuda 관련 체크해제

cuda가 설치된 경우

BUILD_opencv_cuda 로 시작하는 옵션들이 등장


opencv_world와 cuda가 충돌이 있는 것 같다. cuda 관련된 모든 옵션 -> 체크해제

* WITH_CUDA는 체크 유지해도 정상 컴파일되는 것으로 보임. (확인 필요)



(cuda가 설치되지 않은 PC에서는 나오지 않았다. 

 그 PC에 정상 컴파일되던 것이 cuda 깔린 PC에서는 컴파일 되지 않아 고생했음)


f) BUILD_opencv_stitching -> 체크 해제


여기에 발암물질이 들어있다. 

체크해제...

체크해놓고 솔루션이 생성되면, 

솔루션을 열어서 stitch 관련된 것을 모두 삭제할 수도 있지만, 번거롭다

( modules/opencv_world 내부의 stitching 삭제, 

  tests_accuracy, tests_performance, samples 내부 stitching 관련 삭제

  install 에러시

OpenCV3\opencv-master\build_vs2010\modules\world의 cmake_install.cmake 

OpenCV3\opencv-master\build_vs2010\modules 의 cmake_install.cmake

OpenCV3\opencv-master\build_vs2010\samples\cpp 의 cmake_install.cmake

에서 stitch 관련된것 삭제 등등등..... -> 그냥 체크해제가 답.)


  

* cyclic dependency 문제가 있어, 컴파일 에러남.

 git에 있는 것은 아래 링크의 것들이 모두 반영되어있는데도 에러 존재

https://github.com/Itseez/opencv/pull/4147

https://github.com/Itseez/opencv/issues/4917 


g) 빨간색이 없어질때까지 configure 클릭 후 generate 클릭

D:\OpenCV_3\opencv-master\build_test 내부에 OpenCV.sln 을 클릭 -> VS 2013으로 열림



5. Visual Studio로 솔루션 빌드


a)빌드-> 구성관리자에서 Release/x64로 변경


b) 소스 변경

build 폴더가 아닌 source 폴더에 있는

modules/world/src/precomp.hpp 를 열어 아래와 같이 주석처리


//#ifdef HAVE_OPENCV_XFEATURES2D

//#include "opencv2/xfeatures2d/nonfree.hpp"

//#endif




* git에서 받은 최신 버젼 소스가 아닌 경우 아래 링크 참고하여 변경 필요

 -> git에서 최신 버젼 받아서 진행하는 것이 정답..

https://github.com/alalek/opencv/commit/8184e57dd6490107211b37492a05d574bcb3d985



[ 아래 c,d는 cmake에서 tests, examples를 체크하지 않았다면 발생하지 않는 문제 ]


c) solution의 application에서 fcw_detect, fcw_train 삭제

   존재하지 않는 opencv_core.lib을 로드하려하여, error 발생

https://github.com/Itseez/opencv/issues/4820


d) (TUTORIAL) LATCH_match 프로젝트 -> 속성 -> 링커 입력에 

..\..\lib\Release\opencv_xfeatures2d300.lib 추가



e) 솔루션 중 ALL_BUILD -> 우클릭 -> 다시 빌드

: 모두 정상 빌드 되어야 함


f) 솔루션 중 CMakeTargets -> install 프로젝트 -> 우클릭 -> 프로젝트만 -> INSTALL만 다시 빌드

: D:\OpenCV_3\opencv\build_test\install 폴더에 아래 파일들이 모두 모임

include 폴더

x64/vc12/lib : library 파일들

x64/vc12/bin : dll 들 


g) 라이브러리 활용 시

솔루션을 생성하고 

->속성 -> c/c++ -> 일반의 추가 포함 디렉토리에 f)의 install/include 경로 입력

           -> 링커 -> 추가 라이브러리 디렉터리에  f)의 install/x64/vc12/lib 경로 입력

           -> 입력 -> 추가 종속성에 필요한 라이브러리 입력

opencv_ts300.lib

      opencv_world300.lib

opencv_xfeatures2d300.lib


소스 코드 작성하고 -> 컴파일 -> exe가 있는 경로에, 

install/x64/vc12/bin 내부에서 필요한 dll 복사

opencv_world300.dll, opencv_xfeatures2d300.dll 등


* 타인에게 솔루션을 배포해야 한다면,

   절대 경로와 무관하게 빌드 가능하도록 

   솔루션 폴더 내부에, libraries\opencv 폴더 등을 만들어서

   이 곳에 include 폴더와 lib 폴더 복사, 필요한 dll도 복사



끝.


VS 2010은 또다른 스토리...............................................

가능하면..최신 버젼 Visual Studio를 쓰는 것이 정신건강에 좋음.




[에러 찾느라 주로 뒤져본 곳 ]

https://github.com/itseez/opencv/issues

https://github.com/Itseez/opencv_contrib/issues

그리고 stackoverflow....


Posted by 우주여행가
,


http://kr.mathworks.com/help/matlab/ref/strrep.html


strrep

Find and replace substring

Syntax

modifiedStr = strrep(origStroldSubstrnewSubstr)

Description

modifiedStr = strrep(origStroldSubstrnewSubstr) replaces all occurrences of the string oldSubstr within string origStr with the string newSubstr.

Examples

Replace text in a character array:

claim = 'This is a good example.';
new_claim = strrep(claim, 'good', 'great')

MATLAB® returns:

new_claim =
This is a great example.

Replace text in a cell array:

c_files = {'c:\cookies.m'; ...
           'c:\candy.m';   ...
           'c:\calories.m'};
d_files = strrep(c_files, 'c:', 'd:')

MATLAB returns:

d_files = 
    'd:\cookies.m'
    'd:\candy.m'
    'd:\calories.m'

Replace text in a cell array with values in a second cell array:

missing_info = {'Start: __'; ...
                'End: __'};

dates = {'01/01/2001'; ...
         '12/12/2002'};

complete = strrep(missing_info, '__', dates)

MATLAB returns:

complete = 
    'Start: 01/01/2001'
    'End: 12/12/2002'

Compare the use of strrep and regexprep to replace a string with a repeated pattern:

repeats = 'abc 2 def 22 ghi 222 jkl 2222';
indices = strfind(repeats, '22')

using_strrep = strrep(repeats, '22', '*')
using_regexprep = regexprep(repeats, '22', '*')

MATLAB returns:

indices =
    11    18    19    26    27    28

using_strrep =
abc 2 def * ghi ** jkl ***

using_regexprep =
abc 2 def * ghi *2 jkl **

More About

collapse all

Tips

  • strrep accepts input combinations of single strings, strings in scalar cells, and same-sized cell arrays of strings. If any inputs are cell arrays, strrep returns a cell array.

  • The strrep function does not find empty strings for replacement. That is, when origStr and oldSubstr both contain the empty string (''), strrep does not replace '' with the contents of newSubstr.

  • Before replacing strings, strrep finds all instances of oldSubstr in origStr, like the strfind function. For overlapping patterns, strrep performs multiple replacements. See the final example in the Examples section.

See Also

 | 


Posted by 우주여행가
,

* 아래 링크에서 계층 구조 cell로 되어 있는 경우

http://zacurr.tistory.com/544 


* 비계층 구조 cell data access에 비해 훨씬 직관적임


1. cell array 저장

 

data= cell(1,3);

data{1} = cell(10,1); % 계층 구조로 cell 생성

data{2} = cell(10,1);

data{3} = cell(10,1);


중략


save('data_file.mat','data');


2. cell array 로드


load('data_file.mat')

(data라는 이름으로 로드 됨)


3. cell column copy


data 는 1x3 cell 내부에 10x1 cell 이 3개 있음



이 중 2번째 column을 다른 변수로 저장하고 싶을 경우


a=data{2};   (a는 data의 2번째 column이 저장된 10x1 cell)


* cell이 아닌 array로 저장하고 싶을 경우

a=cell2mat(data{2}); % 10x1 array


4. cell column sum


sum_value = sum([a{:}]);

혹은

sum_value=sum(cell2mat(a))


column의 값들이 모두 더해짐


5. string txt 파일을 cell로 읽기


fp=fopen('test.txt','r');

data = textscan(fp,'%s'); % string일 경우 , 숫자일 경우는 그냥 a=load('test.txt');

data = data{:}; % 이걸 안해주면 data=1x1 cell이고 안으로 들어가야 다시 string 내용이 존재

                      % 이걸 해주면 바로 data에 접근 가능

fclose(fp);


6. cell data에 접근


a{n} => 내용물에 바로 접근

a(n) => cell 형태로 return -> 다시 data access 필요


7. cell data sorting 하기


ex) 숫자로 된 2번째 column을 내림차순으로 sorting 하는 경우

[p, idx] = sort(cell2mat(data{2}),'descend')

혹은

[p, idx] = sort(cell2mat(a),'descend')


8. sorting 후 상위 n개 data만 선택하여 cell 로 저장


n = 3;

data2 = data{2}(idx(1:n)); 혹은 data2 = a(idx(1:n));  % 한 column만 복사


전체 column을 복사하기

data2 = {data{1}(idx(1:n)) data{2}(idx(1:n)) data{3}(idx(1:n))}

* 이 경우는 비계층 cell이 더 편함


8. cell data를 cell에 복사


a(1:3) = data{1}(1:3)


9. 숫자 array data를 cell에 복사


*num2cell을 이용

a(1:3) = num2cell([1 2 3]);



10. cell 각각의 원소에 값 복사

data{1}{1} = 1;

data{1}{2} = 'D:\images.jpg';

data{1}{3} = sum(score(1:3)) > 0;


11. logic 연산


* cell data 중 10보다 큰지 작은지 여부를 알고 싶을때 (binary로 return)

* cell2mat을 이용


score = cell2mat(data{2}) >= 5


* textscan으로 

  data= textscan(fp,'%s\t%s\t%f'); 이러한 형태로 읽을 경우

data{3} 은 %f 형태로 읽었기 때문에, cell이 아니라 double array로 저장됨

이 같은 경우에는 check = data{3} >=5 와 같이 직관적으로 사용 가능



12. 계층 구조 cell -> 비계층 구조 cell로 변환
 
 data2=[data{:,1} data{:,2} data{:,3}]

 * 계층 구조 cell 중에 위의 textscan으로 읽은 것과 같이 cell이 아닌 double, int 등 숫자 array가 포함된 경우
   => num2cell을 사용해서 cell 형태로 변환 후 처리

  data의 3번째 원소가 cell이 아닌 숫자 array라 가정
  data2=[data{:,1} data{:,2} num2cell(data{:,3})]

  숫자 array가 여러개 포함된  경우 : 2~끝열까지 숫자라 가정
data = [data{:,1} num2cell([data{:,2:end}])];




Posted by 우주여행가
,

아래 10x1 cell이 3개가 있다고 가정


d=cell(10,1); e=cell(10,1); f=cell(10,1);


.. (중략) (값입력) ..


3개 cell을 하나의 cell로 합치기


1) 계층 구조 cell로 합치기


g = {d e f};


g = 1x3 cell 이고 아래와 같이 각 원소에 계층적으로 다시 cell이 들어 있음




* 장점 : cell 분리 , logic 연산 등을 위한 접근이 편하다



2) 비계층 구조 cell로 합치기


g = {d{:}; e{:}; f{:}}  => 3x10 cell

g = {d{:}; e{:}; f{:}}'  => 10x3 cell


* 10x3 cell 일 때


* 장점 : data를 눈으로 바로 확인 가능

Posted by 우주여행가
,

* 참고 : textscan 파일에 쓰여진 문자열 읽기

http://zacurr.tistory.com/411


* Header 부분 skip 하여 읽기

아래와 같은 txt 파일의 내용을 읽는다고 가정했을 때,

상위 4줄 즉, header는 skip하고 , 5번째 줄의 본문부터 읽고 싶을 경우


 test.txt


Reading the database...

972 images loaded.

DB name : samples

Current Mode:6

[1/25]-(1)GS3_201845.2_445889.6_1_0.jpg A00915 1.885283

[1/25]-(2) GS3_201845.2_445889.6_1_0.jpg A00229 1.528227

[1/25]-(3) GS3_201845.2_445889.6_1_0.jpg A00754 1.493309



HeaderLines 옵션을 사용


 fp=fopen('test.txt','r');

 test_list = textscan(fp,'%s\t%s\t%s\t%f','HeaderLines',4);

 fclose(fp);




* 특정 부분 skip하여 읽기

만약 중간 부분 혹은 끝 부분의 내용을 skip하고 싶다면?


- 읽을 txt 파일을 수정 혹은 control 할 수 있다면?

=> commentStyle 명령어 사용


아래와 같은 파일을 읽을 때, 끝 2줄을 skip하고 싶다면,

실험 log 파일을 생성할 때 // 등과 같은 기호로 시작하도록 설정 (주석 스타일) (ex) printf('// Average ...\n')


그리고 아래와 같이 commentStyle 명령어와 '//' 값을 설정하여 '//'로 시작하는 값은 skip하도록 설정


test_list = textscan(fp,'%s\t%s\t%s\t%f','HeaderLines',4,'commentStyle','//');

( 첫 4줄은 skip하고, //로 시작하는 것도 skip)


Reading the database...

972 images loaded.

DB name : samples

Current Mode:6

[1/25]-(1)GS3_201845.2_445889.6_1_0.jpg A00915 1.885283

[1/25]-(2) GS3_201845.2_445889.6_1_0.jpg A00229 1.528227

[1/25]-(3) GS3_201845.2_445889.6_1_0.jpg A00754 1.493309

(중략)
[21/21]-(8) OTX2_202776.4_443369.6_10_4.jpg J00755 2.022650
[21/21]-(9) OTX2_202776.4_443369.6_10_4.jpg J00577 1.995117
[21/21]-(10) OTX2_202776.4_443369.6_10_4.jpg J02475 1.834778
// Average retrieval time: 1.50679 [s]
// Worst-case retrieval time: 1.55014 [s]



Posted by 우주여행가
,

* 아래 링크에서 비계층 구조 cell로 되어 있는 경우

http://zacurr.tistory.com/544 


1. cell array 저장


data= cell(100,5);


중략


save('data_file.mat','data');


2. cell array 로드


load('data_file.mat')

(data라는 이름으로 로드 됨)


3. cell column copy


data 는 100x5 cell

이 중 n번째 column을 다른 변수로 저장하고 싶을 경우


a=data(:,n);   (a는 data의 n번째 column이 저장된 100x1 cell)


* mat으로 저장하고 싶을 경우

a=[data{:,n}];


4. cell column sum


sum_value = sum([a{:}]);

혹은

sum_value = sum([data{:,5}]);


column의 값들이 모두 더해짐


5. string txt 파일을 cell로 읽기


fp=fopen('test.txt','r');

data = textscan(fp,'%s'); % string일 경우 , 숫자일 경우는 그냥 a=load('test.txt');

data = data{:}; % 이걸 안해주면 data=1x1 cell이고 안으로 들어가야 다시 string 내용이 존재

                      % 이걸 해주면 바로 data에 접근 가능

fclose(fp);


6. cell data에 접근


data{n} => 내용물에 바로 접근

data(n) => cell 형태로 return -> 다시 data access 필요


7. cell data sorting 하기


ex) 숫자로 된 2번째 column을 내림차순으로 sorting 하는 경우

[p, idx] = sort(cell2mat(data(:,2)),'descend');


8. sorting 후 상위 n개 data만 선택하여 cell 로 저장


n = 10;

data2 = data(idx(1:n),:); (2번째 column 상위 10개 index를 기준으로, 전체 column의 해당 idx 값이 복사됨)


8. cell data를 cell에 복사


data1 = cell(100,5,3);

data1(1,:,1:2) = data2(1:5,[1 3]);

% data2의 1~5번째 rows 중 1,3 column을 data1에 복사하는 경우


9. 숫자 array data를 cell에 복사


*num2cell을 이용

data1(1,:,3) = num2cell(data4(1:5));

% 숫자 array인 data4의 1~5번째 원소를 data1에 저장하는 경우


10. cell 각각의 원소에 값 복사

data{1,1} = 1;

data{1,2} = 'D:\images.jpg';

data{1,3} = sum(score(1:3)) > 0;


11. logic 연산


* cell data 중 10보다 큰지 작은지 여부를 알고 싶을때 (binary로 return)

* cell2mat을 이용


score = cell2mat(data(:,3)) >= 10


12. cell data 합치기


a : 100x5 cell

b : 200x5 cell


c = [a ; b]  => 300 x 5 cell







Posted by 우주여행가
,

figure(1);

imshow(img);

hold on;

h = line([xa' ; xb'], [ya' ; yb']) ;

set(h,'linewidth', 2, 'color', 'b') ;



saveas(gcf,'img_line.jpg');


참고

http://kr.mathworks.com/help/matlab/ref/savefig.html


저장 이미지 해상도를 조절하고 싶을 경우

print 함수 사용

http://kr.mathworks.com/help/matlab/ref/print.html?searchHighlight=print


* 저장된 이미지에서 white margin 을 없애고 싶은 경우

http://tipstrickshowtos.blogspot.kr/2010/08/how-to-get-rid-of-white-margin-in.html


saveThightFigure 함수 사용

사용법 saveTightFigure(h,'output.pdf');

(matching_distrat_ransac_zacurr.m 파일 참고)

코드

-----------------------------------------------------------------------------------------------

function saveTightFigure(h,outfilename)

% SAVETIGHTFIGURE(H,OUTFILENAME) Saves figure H in file OUTFILENAME without

%   the white space around it. 

%

% by ``a grad student"

% http://tipstrickshowtos.blogspot.com/2010/08/how-to-get-rid-of-white-margin-in.html


% get the current axes

ax = get(h, 'CurrentAxes');


% make it tight

ti = get(ax,'TightInset');

set(ax,'Position',[ti(1) ti(2) 1-ti(3)-ti(1) 1-ti(4)-ti(2)]);


% adjust the papersize

set(ax,'units','centimeters');

pos = get(ax,'Position');

ti = get(ax,'TightInset');

set(h, 'PaperUnits','centimeters');

set(h, 'PaperSize', [pos(3)+ti(1)+ti(3) pos(4)+ti(2)+ti(4)]);

set(h, 'PaperPositionMode', 'manual');

set(h, 'PaperPosition',[0 0  pos(3)+ti(1)+ti(3) pos(4)+ti(2)+ti(4)]);


% save it

saveas(h,outfilename);

-----------------------------------------------------------------------------------------------


* 그외 figure 관계 없이 이미지를 저장할 때

imwrite 함수

ex) imwrite(img_crop,crop_img_name,'Quality',100);

http://kr.mathworks.com/help/images/writing-image-data-to-a-file.html

http://kr.mathworks.com/help/matlab/ref/imwrite.html


http://tthinking.tistory.com/29


Posted by 우주여행가
,

ismember 함수


a = 3;

b = [1, 2, 3];


ismember(a,b);


1 or 0을 return

a가 b에 속한 경우 1 return


a가 여러개일때도 가능


a= [ 2 4 6];

b= [ 1 2 3];

c = ismember(a,b);


c=[ 1 0 0];

Posted by 우주여행가
,

여러개의 vertical cell 들을 하나의 긴 vertical cell로 길게 합치기


list_all={};


for i=1:len

    fp = fopen(cell_name{i},'r');

    imfilelist = textscan(fp,'%s');

    imfilelist = imfilelist{:};

    list_all =  {list_all{:}, imfilelist{:}};

    fclose(fp);

end


 list_all = list_all'; % 이걸 주석으로 막으면 horizontal cell로 합쳐짐



- 위의 코드로 안될 경우



list_all={};


for i=1:len

    fp = fopen(cell_name{i},'r');

    imfilelist = textscan(fp,'%s');

    fclose(fp);


    list_all =  [list_all; imfilelist{:}];


end

Posted by 우주여행가
,

cell에 이러한 data가 있다고 가정




text 파일로 한 번에 쓰기


 fp= fopen('test.txt,'w');

 fprintf(fp,'%s\n',imfilelist5{:});

 fclose(fp);


* cell에 string과 숫자가 섞여 있을때



cell에 string과 숫자가 섞여 있음


[오류]

 fp= fopen('test.txt,'w');

 fprintf(fp,'%s\t%d\t%d\t%d\n',ref_gps{:});

 fclose(fp);


위와 같이 실행하면, cell의 1열부터 vertical 방향으로 

차례로 쓰기 때문에, 화면에 보이는 것과 같이 저장되지 않고 오류 발생


아래와 같이 cell을 한 번 transpose 해주고, fprintf 실행하면 해결


[정상]

ref_gps=ref_gps';

 fp= fopen('test.txt,'w');

 fprintf(fp,'%s\t%d\t%d\t%d\n',ref_gps{:});

 fclose(fp);


fprintf가 열방향으로 vertical하게 순서대로 쓰므로, 결과 text 파일은 아래와 같이 원래 원하던 폼으로 출력됨.



참고

http://stackoverflow.com/questions/13420289/matlab-creating-a-txt-file-containing-numbers-and-strings-from-a-cell

Posted by 우주여행가
,