현실감각 0% :: '컴퓨터 관련' 카테고리의 글 목록 (3 Page)

컴퓨터 관련 2014. 9. 19. 17:37

[Android] Back버튼에 이벤트 넣기



[Android] Back버튼에 이벤트 넣기


안드로이드 앱을 하나 만들다가 사이드메뉴가 필요해서 Simple Side Drawer 라이브러리를 사용하게 되었다. 여는건 큰 어려움 없이 해결! 그런데 문제는 이녀석을 백버튼으로 닫으려는데 자꾸 프로그램이 닫힌다...ㅠㅠ 그래서 백 버튼에 이벤트를 넣어서 사이드메뉴가 열려있을 경우에는 프로그램은 그대로있고 사이드메뉴만 닫으려 하는데 도대체 백 버튼에 이벤트를 어떻게 줘야하는건지를 몰라 또 구글링..

찾아보니까 별거없다. 그냥 onBackPressed() 사용하면 된다.


// 종료버튼 처리(최근버전용)

@Override

public void onBackPressed() {

   // 여기에 코드 입력

if(mSlidingMenu.isClosed())

{

FrmMain.this.finish();

}

else

mSlidingMenu.toggleLeftDrawer();

}

// 종료버튼 처리(구버전용)

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

   if (keyCode == KeyEvent.KEYCODE_BACK) {

     // 여기에 코드 입력

    if(mSlidingMenu.isClosed())

{

    FrmMain.this.finish();

}

else

mSlidingMenu.toggleLeftDrawer();

       return true;

   }


구버전(영어로 써있어서 자세히 보진 않았지만 버전 프로요까지인듯)은 onBackPressed가 지원되지 않는지 onKeyDown에서 백버튼인지 확인해서 백버튼이면 동작하게 코딩하라고 나와있었다. 암튼 두개 다 넣고 돌렸는데 별 이상은 없었음.

사이드메뉴가 닫혔는지 열렸는지 받아온 후 닫혀있으면 액티비티를 종료하고, 열려있으면 사이드메뉴를 닫아주게 코딩하면 끗!



컴퓨터 관련 2014. 8. 18. 17:14

[MATLAB] CT와 MCT 소스코드



[MATLAB] CT(Census Transform)와 MCT(Modified Census Transform) MATLAB 소스코드


요즘 연구하는 인식 오브젝트가 별다른 특징이 없어서 왠만한 특징검출방법으로는 특징비스므리한것조차 찾아지지도 않는 문제에 봉착..ㅠ 그래서 이런저런 특징검출 방법을 사용하다가 MCT(Modified Census Transform) 소스를 구한김에 포스팅!

MCT는 주로 얼굴탐지/인식하는데 사용하는 특징이어서 여기저기 검색하면 얼굴 검출하는 방법과 함께 나오지만 여기 올린 소스는 어디까지나 그냥 MCT 특징맵만을 생성함을 미리 알려드림(-_-);


원본 소스는 여기 : https://siddhantahuja.wordpress.com/tag/matlab-code/


소스를 무상으로 공개해주신 위 블로그의 주인은 CT를 구현해놨다. CT 소스 뿐만 아니라 각종 스테레오비전 관련 소스도 있으니까 관심있으면 클릭클릭! 

CT나 MCT나 차이점은 중점으로 픽셀값을 각각 비교하느냐, 마스크의 평균값을 가지고 픽셀값을 각각 비교하느냐의 차이일뿐이므로 내가 필요한 MCT를 위해 소스를 살짝 수정해봤다.


% ************************************************************************* % Title: Function-Rank Transform of a given Image % Author: Siddhant Ahuja <=원작자 https://siddhantahuja.wordpress.com/ % Created: May 2008 % Copyright Siddhant Ahuja, 2008 % Inputs: Image (var: inputImage), Window size assuming square window (var: % windowSize) % Outputs: Rank Tranformed Image (var: rankTransformedImage), % Time taken (var: timeTaken) % Example Usage of Function: [a,b]=funcRankOneImage('Img.png', 3) % ************************************************************************* function [censusTransformedImage, timeTaken] = mct(inputImage, windowSize) % Grab the image information (metadata) using the function imfinfo try imageInfo=imfinfo(inputImage); % Since Census Transform is applied on a grayscale image, determine if the % input image is already in grayscale or color if(getfield(imageInfo,'ColorType')=='truecolor') % Read an image using imread function, convert from RGB color space to % grayscale using rgb2gray function and assign it to variable inputImage inputImage=rgb2gray(imread(inputImage)); else if(getfield(imageInfo,'ColorType')=='grayscale') % If the image is already in grayscale, then just read it. inputImage=imread(inputImage); else error('The Color Type of Input Image is not acceptable. Acceptable color types are truecolor or grayscale.'); end end catch inputImage=inputImage; end % Find the size (columns and rows) of the image and assign the rows to % variable nr, and columns to variable nc [nr,nc] = size(inputImage); % Check the size of window to see if it is an odd number. if (mod(windowSize,2)==0) error('The window size must be an odd number.'); end if (windowSize==3) bits=uint8(0); % Create an image of size nr and nc, fill it with zeros and assign % it to variable censusTransformedImage of type uint8 censusTransformedImage=uint8(zeros(nr,nc)); elseif (windowSize==5) bits=uint32(0); % Create an image of size nr and nc, fill it with zeros and assign % it to variable censusTransformedImage of type uint32 censusTransformedImage=uint32(zeros(nr,nc)); else error('The size of the window is not acceptable. Just 3x3 and 5x5 windows are acceptable.'); end % Initialize the timer to calculate the time consumed. tic; % Find out how many rows and columns are to the left/right/up/down of the % central pixel dImg = double(inputImage); C= (windowSize-1)/2; for(j=C+1:1:nc-C) % Go through all the columns in an image (minus C at the borders) for(i=C+1:1:nr-C) % Go through all the rows in an image (minus C at the borders) census = 0; % Initialize default census to 0 for (a=-C:1:C) % Within the square window, go through all the rows for (b=-C:1:C) % Within the square window, go through all the columns if (~(a==0 && b==0)) % Exclude the centre pixel from the calculation census=bitshift(census,1); %Shift the bits to the left by 1 % If the intensity of the neighboring pixel is less than % that of the central pixel, then add one to the bit % string % 이부분을 중심 픽셀이 아닌 평균과의 차로 변환하면 MCT %% CT 알고리즘(사용하려면 주석 제거하고, 아래 MCT소스는 주석치고 돌리면 됨) %if (inputImage(i+a,j+b) < inputImage(i,j)) % CT 알고리즘 % census=census+1; %end %% MCT 알고리즘 (귀찮아서 마스크사이즈 3만 구현. 다른 마스크 사이즈로 사용하려면 for문 넣어서 수정ㄱㄱ) sumv = dImg(i - 1,j - 1) + dImg(i - 1,j) + dImg(i - 1,j + 1) + dImg(i,j - 1) + dImg(i,j) + dImg(i,j + 1) + dImg(i + 1,j - 1) + dImg(i + 1,j) + dImg(i + 1,j + 1); avgv = sumv / 9.0; if (inputImage(i+a,j+b) < avgv) census=census+1; end end end end % Assign the census bit string value to the pixel in imgTemp censusTransformedImage(i,j) = census; end end % Stop the timer to calculate the time consumed. timeTaken=toc;


사용법은 저거 mct.m 파일로 저장한다음에 MATLAB에서 아래와 같이 엔터치면 끝 

inputImage = imread('kakaka.jpg'); 

windowSize = 3; %일단 3으로만 했는데 5로 하려면 MCT는 좀 바꿔야함(진작 for문으로 만들었어야 했는데...귀찮아서..) 

[censusTransformedImage, timeTaken] = mct(inputImage, windowSize);

figure, imshow(censusTransformedImage);


아래는 결과영상

원본영상


CT 영상

MCT 영상









컴퓨터 관련 2014. 8. 6. 16:08

[MATLAB] 에지방향(Edge Orientation)



[MATLAB] 에지방향(Edge Orientation)


간만에 논문을 한편 쓸일이 생겨서 이것저것 해보던 도중 에지 방향을 검출해서 인식에 사용하게 되었다.

예전에 암것도 모르던 시절에는 무식하게 캐니 에지 돌린담에 마스크 씌워가지고 일일이 에지의 방향을 검출했을 텐데...

아는게 좀 늘었다고 다른 방법을 써봤다.(물론 내가 찾아낸건 전혀아니다. 아니라 원래 이렇게들 쓰고있고 나혼자 몰랐음ㅋ)


영상처리를 공부하면 가장 처음에 배우다시피하는 에지 검출

여기서 주로 나오는 에지검출 연산자는 소벨(Sobel), 프리윗(Prewitt) 연산자 등이 있다.(또는 유사한 2차미분연산자)

 이놈들의 특징은 바로 마스크의 형태에 따라 0도 또는 90도 방향성 에지를 검출한다는 것인데... 

이걸 이용해서 방향성 에지를 검출하면 그게 바로 에지의 방향!!ㅋ


가장 무난한 소벨 에지를 가지고 테스트하였다.

우선 각도에 따른 마스크를 생성

0º 

1

2

1

0

0

0

-1

-2

-1


-1

-2

-1

0

0

0

1

2

1

90º

-1

0

1

-2

0

2

-1

0

1 


10-1
20-2
10

-1

45º

2

1

0

1

0

1

0

-1

-2


-2

-1

0

-1

0

1

0

1

2

135º

0

-1

-2

1

0

1-

2

1

0


0

1

2

-1

0

1

-2

-1

0



그담에 이것들로 컨벌루션해서 에지를 생성한다

a = convol(bw, mask_0_0);

b = convol(bw, mask_0_1);

c = a + b;

그담에 0도 영상에서 90도 영상을 빼면 0도방향의 에지

90도에서 0도 영상을 빼면 90도 방향 에지

마찬가지로 45도영상에서 135도 영상을 빼면 45도 에지

135도 영상에서 45도를 빼면 135도 에지 영상이 나온다.


그럼 아래 영상과 같은 결과가 나옴




원본 영상


0도 에지


90도 에지


45도 에지


135도 에지

각 에지맵을 RGB 영상에 각각 R, G, B값으로 넣으면 다음과 같이 방향에 따른 에지의 색깔도 표현할 수 있다.

(135도는 R+G값으로 표현)



매트랩 소스도 별거없다.


먼저 컨벌루션 함수

function [ xxx ] = convol( img, mask )

[j i z] = size(img);

g = int16(img);

xxx(1:j, 1:i) = 0;

for y = 2:j - 1

for x = 2:i - 1

xxx(y,x) = ((g(y-1,x-1) * mask(1, 1)) + (g(y-1,x) * mask(1, 2)) + (g(y-1,x+1) * mask(1, 3)) + (g(y,x-1) * mask(2, 1)) + (g(y,x) * mask(2, 2)) + (g(y,x+1) * mask(2, 3)) + (g(y+1,x-1) * mask(3, 1)) + (g(y+1,x) * mask(3, 2)) + (g(y+1,x+1) * mask(3, 3)));

end

end

xxx = uint8(xxx);

end



두번째로 에지 방향 함수

function [ output_args ] = edgeori(img)


mask_0_0 = [1 2 1;0 0 0;-1 -2 -1];

mask_0_1 = [-1 -2 -1;0 0 0;1 2 1];

mask_90_0 = [-1 0 1;-2 0 2;-1 0 1];

mask_90_1 = [1 0 -1;2 0 -2;1 0 -1];

mask_45_0 = [2 1 0;1 0 -1;0 -1 -2];

mask_45_1 = [-2 -1 0;-1 0 1;0 1 2];

mask_135_0 = [0 1 2;-1 0 1;-2 -1 0];

mask_135_1 = [0 -1 -2;1 0 -1;2 1 0];


g = rgb2gray(img);

bw = histeq(g);


a = convol(bw, mask_0_0);

b = convol(bw, mask_0_1);

c = a + b;


a = convol(bw, mask_90_0);

b = convol(bw, mask_90_1);

d = a + b;


a = convol(bw, mask_45_0);

b = convol(bw, mask_45_1);

e = a + b;


a = convol(bw, mask_135_0);

b = convol(bw, mask_135_1);

f = a + b;


w = c - d;

x = d - c;

y = e - f;

z = f - e;

figure, imshow(w);

figure, imshow(x);

figure, imshow(y);

figure, imshow(z);

end