이미지의 픽셀에 대하여 공부를 하였으니


이번에는 간단하게 이미지를 가지고 조작을 해보겠습니다.


먼저 이미지 하나하나가 픽셀로 이루어져 있고, 지난번 gray_image로 만드는 방법과 복사하는 방법을 보면


각각의 픽셀을 opencv를 통해 원하는대로 조종할 수 있다고 배웠습니다.


어떤 이미지가 있다면, 이 이미지 속의 랜덤한 픽셀들의 화소값을 바꾸면서 실험을 해 보겠습니다.


먼저 픽셀의 값은 흑백의 경우 0~255(0:black, 255:white) 라고 하였고, color image의 경우에는 각각의 RGB값이 0~255(8bit)를 나타내서 합쳐진다고 하였습니다.


첫번째는 먼저 랜덤한 픽셀들의 화소값을 255(white)로 바꾸도록 하겠습니다.


color 이미지의 경우에는 당연히 channels인 R, G, B가 모두 255여야지 white가 된답니다.



#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void whitespace(cv::Mat &image, int num);

void main()
{        
     cv::Mat image = cv::imread("6.jpg");
     whitespace(image, 5000);
     cv::namedWindow("output");
     cv::imshow("output", image);
     cv::waitKey(0);
}


void whitespace(cv::Mat &image, int num)
{
     for (int k = 0; k < num; k++)
     {
           int i = rand() % image.cols;
           int j = rand() % image.rows;

           if (image.channels() == 1){
               image.at<uchar>(j, i) = 255;
          }
          else if (image.channels() == 3){
               image.at<cv::Vec3b>(j, i)[0] = 255;
               image.at<cv::Vec3b>(j, i)[1] = 255;              

               image.at<cv::Vec3b>(j, i)[2] = 255;         

          }
     }
}

 



위의 소스는 불러온 이미지가 흑백사진인지(channels ==1 ) 아니면 컬러사진인지(channels == 3) 를 확인 한 후에


각각의 이미지의 행과 열에서 랜덤으로 받은 값 i,j를 통해 픽셀의 위치를 찾고, 벡터값을 이용하여 255라는 픽셀값을 넣어주었습니다.


이미지에서 보는 것과 같이 랜덤한 곳에 whitespace가 나타난 것을 알 수 있습니다.


이번에는 반대로 0의 값을 줘보겠습니다.


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void blackspace(cv::Mat &image, int num);

      

void main()
{
      cv::Mat image = cv::imread("6.jpg");
      blackspace(image, 5000);
      cv::namedWindow("output");
      cv::imshow("output", image);
      cv::waitKey(0);
}


void blackspace(cv::Mat &image, int num)
{
      for (int k = 0; k < num; k++)
      {
            int i = rand() % image.cols;
            int j = rand() % image.rows;      

            if (image.channels() == 1){
                  image.at<uchar>(j, i) = 0;
            }
            else if (image.channels() == 3){
                  image.at<cv::Vec3b>(j, i)[0] = 0;
                  image.at<cv::Vec3b>(j, i)[1] = 0;
                  image.at<cv::Vec3b>(j, i)[2] = 0;
            }
      }
}

 



다음과 같이 픽셀 조작을 해보았습니다.


by 아발로온v 2014.04.09 18:54

저번에는 단순히 이미지를 복사해서 붙여 넣거나 flip을 통해서 상하 좌우 를 바꾸는 것에 대하여 보았습니다.


이제는 진정한 opencv로 입문하게 되는 pixel 조작에 대해서 글을 써보겠습니다.


pixel은 컴퓨터 디스플레이 또는 컴퓨터 이미지를 구성하고 있는 최소 단위의 점입니다. 우리나라에서는 화소로 쓰이기도 합니다.


컴퓨터 사양중에 해상도를 보면 1600X900 같은 것을 볼 수 있는데요. 이 숫자들이 가로 세로 표현할 수 있는 최대 픽셀수를 나타내는 것 입니다.


자 그러면 이미지의 픽셀을 이용해 조작해 보도록 하겠습니다.






보통 우리가 RGB값이라고 많이 이야기를 하는 RGB는 red green blue 3원색을 나타내는 표현입니다.


이 삼원색을 이용하면 디지털 적으로 거의 모든색상을 표현할 수 있습니다. 따라서 다양한 디지털 기계에서 색을 표현하는


기본 색광으로 사용한답니다.


그렇다면, gray-level-image라는것이 있는데요. 바로 흑색사진을 의미합니다. ( a black-and-whilte image )


일반적으로 흑백사진은 unsigned 8-bit values 로 구성되어있습니다.


8bit 는 표시할 수 있는 경우가 2의 8승 = 즉 256가지 ( 0 ~ 255 ) 입니다. 이 값들에 따라서 흑백의 밝기가 결정됩니다.


wherer 0 corresponds to black. and 255 corresponds to white.


0이 흑, 255가 백으로서 bit수가 올라갈수록 점점 밝아진다고 생각하면 됩니다.



컬러 이미지는 아까전에 RGB를 설명 했습니다. three primary color channels ( red , green , blue ) 를 이용하여


사람이 인지하는 대부분의 색상을 표현 가능 합니다. 각각의 값들마다 unsigned - 8bit를 가지게 되며,


컬러를 표현한는데는 총 unsigned - 24bit가 필요하게 됩니다.


gray-level-image pixels

0

255 

125 

255

50 

0

6

100


color image pixels

(0,255,0)

(0,255,255)

(255,0,0) 

(100, 0, 100) 

(24, 159, 205) 

(255, 0, 0)

(12, 52, 100) 

(12, 12, 100) 

(0, 0, 255) 






자 이제, 그렇다면 opencv를 이용해서 컬러 이미지를 흑백 이미지로 바꾸어 보도록 하겠습니다.


#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

void main()
{
      cv::Mat image = cv::imread("1204.jpg");
      cv::namedWindow("My Image");
      cv::imshow("My Image", image);
      cv::Mat gray_image;

      
      cv::cvtColor(image, gray_image, CV_BGR2GRAY);

      cv::namedWindow("Output Image");
      cv::imshow("Output Image", gray_image);

      cv::waitKey();
}


다음과같은 코드를 실행 시키면 아래 사진처럼 결과가 나오게 됩니다.






cvtColor는 imgproc.hpp에 포함되어 있습니다.


cv::cvtColor(image, gray_image, CV_BGR2GRAY) 이런 구조로 사용하게 되며


순서대로 ( 원본이미지가저장된변수 , 그레이이미지를저장할변수 , 타입(여기서는BGR2GRAY) )로 구성되어 있습니다.



by 아발로온v 2014.04.07 03:15

OPENCV를 가지고 가장 먼저 이미지 플립을 해보겠습니다.


flip은 뒤집다 라는 뜻을 가지고 있는데요~ 말 그대로 opencv를 통해서 불러온 이미지를 뒤집는 것 입니다.


flip 기능은 이미 저장이 되어있는 기능이기에 별다른 어려움 없이 사용이 가능합니다.


flip ( 원본이미지   ,    실행된flip이저장될이미지,         각종flip   ) 의 구조를 가지고 있습니다.


먼저 원본이미지 자리와 실행된flip이저장될이미지 자리에는 이미지 저장 변수가 있어야 합니다.


그리고 각종 filp에는 3가지 값이 들어갈수 있습니다.


(    positive for horizontal    ;    0 for vertical    ;    negative for both    ) 


일반적으로 positive에는 1, 0 , negative에는 -1을 사용합니다.


positive(1) 은 수평으로 이미지를 뒤집고, 0은 수직으로 이미지를 뒤집으며, negative(-1)은 이미지의 수직수평 모두를 뒤집습니다.(원점대칭)


따라서 소스를 가지고 직접 구동해 보겠습니다.



 다음과 같은 원본 이미지가 있습니다.







#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

     
void main(){

      cv::Mat image;
 
      image = cv::imread("sky.jpg");
 
      cv::namedWindow("Original Image");
      cv::imshow("Original Image", image);
 
      cv::Mat result1;
      cv::flip(image, result1, 1);
 
      cv::namedWindow("Output Image");
      cv::imshow("Output Image", result1);
      cv::waitKey(0);
 
      cv::imwrite("output.jpg", result1);
}

 











 

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

     
void main(){

      cv::Mat image;
 
      image = cv::imread("sky.jpg");
 
      cv::namedWindow("Original Image");
      cv::imshow("Original Image", image);
 
      cv::Mat result1;
      cv::flip(image, result1, 0);
 
      cv::namedWindow("Output Image");
      cv::imshow("Output Image", result1);
      cv::waitKey(0);
 
      cv::imwrite("output.jpg", result1);
}

 











 

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

     
void main(){

      cv::Mat image;
 
      image = cv::imread("sky.jpg");
 
      cv::namedWindow("Original Image");
      cv::imshow("Original Image", image);
 
      cv::Mat result1;
      cv::flip(image, result1, -1);
 
      cv::namedWindow("Output Image");
      cv::imshow("Output Image", result1);
      cv::waitKey(0);
 
      cv::imwrite("output.jpg", result1);
}

 




다음과 같이 flip을 통해서 쉽게 이미지를 뒤집는 방법에 대하여 알아보았습니다.


위의 소스를 살짝 확인해 보자면


image라는 저장 변수를 선언하고 거기에 sky.jpg라는 이미지를 저장하였습니다. 그 다음 result1이라는 이미지변수 선언 후


flip을 통해서 result1이라는 변수에 image변수에 실행한 flip결과 이미지를 저장하였습니다.


마지막에 imwrite를 사용하여 이미지를 저장하게 되며 파일 디렉토리에 이미지파일이 생기게 됩니다.













이번에는 이미지를 복사하는 방법에 대해서 보겠습니다.


먼저 프로그래밍을 할때 대입연산자 ( = ) 를 사용해서 넣는 경우는 어떻게 되는지 보겠습니다.


cv::Mat image;
 
image = cv::imread("sky.jpg");
 
cv::Mat result1;

result1=image;


다음과 같이 대입연산자를 사용한다면 image 변수에 저장된 sky.jpg에 할당된 이미지의 모든 내용이 똑같이 복사됩니다. 가로세로 픽셀수, 그리고 RGB인지 B인지 까지 모두 복사됩니다.


따라서 result1 과 image가 동일하게 되므로 two images refer to the same data 라고 할 수 있습니다.



다른방법으로는


copyTo가 있습니다.


copyTo는 기존이미지변수.copyTo(복사해서넣을이미지변수) 로 사용합니다.


cv::Mat image;
 
image = cv::imread("sky.jpg");
 
cv::Mat result1;

image.copyTo(result1);


이 copyTo 역시 result1 과 image가 동일해지므로 two images refer to the same data 입니다



by 아발로온v 2014.04.07 01:49

설치가 모두 완료 되었고, 경로 설정도 모두 다 되었으면, 정확히 되었는지 확인을 위해 이미지 파일을


불러와서 실행시켜 보도록 하겠습니다.



#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


void main(){

cv::Mat image;         // 이미지를 저장할 수 있는 변수를 선언합니다.


image = cv::imread("1.jpg");   // 파일디렉토리에 있는 1.jpg 라는 이미지를 변수 image에 저장합니다.


cv::namedWindow("Busan");   // 윈도우창을 정의합니다.


cv::imshow("Busan", image);     // 윈도우창의 이미지를 보여줍니다.(show)


cv::waitKey(0);     // 윈도우창을 띄우는 시간을 지정. 0은 계속해서 창이 떠있도록 합니다. ( 100, 1000 등과 같은 값을 입력하면 창이 지정한 시간 후에 사라짐)

}


다음 소스를 보면 사진 1.jpg를 어디에 놔둬야 할지 궁금할 것입니다. 파일 디렉토리가 어디인지 잘 모르실겁니다.


파일 디렉토리는 비주얼스튜디오에서 만든 프로젝트 폴더를 찾아 들어가면 또 프로젝트 파일 이름과 똑같은 폴더가 존재합니다.

 

이곳이 "파일 디렉토리" 입니다. 이곳에 저장을 하면 됩니다.








소스를 만든 .cpp 파일에다가 작성하고 컴파일 하면 같은 결과가 출력 됩니다.





이렇게 정상적으로 되었다면, 설치가 제대로 되었다는 것을 확인 할 수 있습니다.

by 아발로온v 2014.03.29 03:01

설치(1)에서는 맨처음 딱 1번만 하면 되는 설정을 하였습니다.



이제부터 opencv를 사용하여 영상처리를 할 때 마다 (프로젝트 하나를 할 때마다) 해주어야 하는 일입니다.




1. Visul studio를 실행하고, 빈 프로젝트 하나를 만들어줍니다. 그리고 속성관리자 라는 창을 찾은 후에 DEBUG | WIN32 를 찾은 후에 마우스 오른쪽을 클릭해서


    새 프로젝트 속성 시트 추가를 눌러줍니다.







2. 속성시트를 한번 클릭하면 이름이 .props 로 되어있을 것 입니다. 이것을 DEBURG_BUILD 로 바꾸어서 추가를 눌러줍니다.





3. 방금 추가해준 DEBURG_BUILD에서 마우스 오른쪽 버튼을 누르고 속성을 눌러줍니다.





4. 속성페이지가 뜨게 되면, 먼저 C/C++에서 일반탭을 누른후에 추가 포함 디렉터리에서 편집을 눌러줍니다.





5. 위에 있는 폴더 모양 버튼을 누르고, opencv 폴더에서 build 폴더에서 include 폴더를 추가해 줍니다.





6. 그다음은, 링커에서 일반탭을 누른후에 증분 링크 사용 을 '아니요' 로 변경을 해 주시고, 추가 라이브 디렉터리를 눌러서 편집을 누른 후에,


   opencv폴더에서 build폴더에서 x86폴더에서 vc10폴더에서 lib폴더 의 경로를 추가해 줍니다. ( win8 - 64bit 기준 )





7. 마지막으로 링커에서 입력 탭을 누른 후에 추가 종속성에서 다음 내용들을 복사해서 붙여넣기 한 후에, 확인을 누르시면 됩니다.


opencv_calib3d248d.lib

opencv_contrib248d.lib

opencv_core248d.lib

opencv_features2d248d.lib

opencv_flann248d.lib

opencv_gpu248d.lib

opencv_highgui248d.lib

opencv_imgproc248d.lib

opencv_legacy248d.lib

opencv_ml248d.lib

opencv_objdetect248d.lib

opencv_ts248d.lib

opencv_video248d.lib





8. 이제 마지막으로 소스파일 -> 추가 -> 새항목을 클릭한 후에 .cpp파일을 만들면 이로써 준비는 모두 끝입니다.



by 아발로온v 2014.03.29 02:39

영상 처리를 위한 opencv 설치방법을 설명하도록 하겠습니다.


제 컴퓨터 기준입니다. window8 - 64bit.


Visual studio 2013 for Desktop.


비쥬얼 스튜디오 2013은 Microsoft 홈페이지에서 아이디 패스워드 인증을 하면 무료로 설치 가능합니다.


1. 먼저 opencv를 설치하여야 합니다. (단순한 압축파일)


2. http://opencv.org

 

를 접속합니다. 다음과같은 그림이 나오면, 오른쪽에 있는 opencv for windows 를 누릅시다.




3. 누르게 되면 다음과 같이 다운로드 창이 뜨게되고 파일을 저장하면 됩니다.




4. 파일이 설치가 완료되면 실행시킨 후에 Extract를 누릅니다.





5. 추출이 완료되면 위의 사진과 같이 opencv라는 폴더( 약 3.7GB ) 가 생겼을 것입니다.



6. 이제 디렉터리를 사용하기 위해서는 환경변수를 설정해 주어야 합니다.


    내컴퓨터(내PC) 에서 마우스 오른쪽버튼을 누른 후에 '속성'을 눌러서 들어가 줍니다.



7. 고급 시스템 설정을 누르고 - '고급' 탭에서 '환경변수'를 클릭해 줍니다.






8. 환경변수 창이 뜨게 되면, 가장먼저 아래쪽의 시스템 변수에서 새로만들기를 눌러준 다음


    변수이름 : OPENCV_BUILD 라고 설정을 해주고, 변수값에다가 아까전에 Extract 결과 나왔던 opencv 폴더의 build폴더를 지정해 줍니다.


    opencv의 경로에 따라 변수 값이 달라지므로, 자신의 컴퓨터에서 설치된 opencv 경로의 build 폴더를 적어줍니다. 그 후에 확인을 눌러 줍니다.






9. 이렇게 시스템 변수 OPENCV_BUILD를 만들었으면, 그 다음은 시스템 변수 중에서 Path라는 변수를 찾아서 더블클릭을 해주게 되면


   변수 이름과 변수값 창이 뜨게 됩니다. 여기서 변수값에 방금 만든 OPENCV_BUILD를 추가해 줄것입니다.


   (주의사항) Path의 변수 값에는 이미 여러가지 경로지정 있습니다. 따라서 여러가지 경로마다 ; 를 사용하여 나눠놓습니다. 그러므로 절대로!!! 다른 경로값들을 지우거나 하면 안됩니다.


   변수 값에서 커서를 제일 마지막으로 가져다 놓은 후에 ;를 한번 치고, %OPENCV_BUILD%\x86\vc10\bin;를 작성하고 그대로 확인만 눌러줍시다.





10. 이렇게 해서 설치와 내컴퓨터에 경로를 지정해주는 것 까지 했습니다.


     여기까지가 맨 처음에 딱 1번만 해주면 되는 설정입니다.


    그 뒤에는 이제 opencv를 사용할 때마다 해주어야 되는 내용에 대하여 포스팅 하겠습니다.





by 아발로온v 2014.03.29 02:08

"To establish ties?"

"관계를 맺는다고?"


"Just that," said the fox. "To me, you are still nothing more than a little boy who is just like a hundred thousand other little boys.

And I have no need of you. And you, on your part, have no need of me.

"물론이지. 내겐 넌 아직 수십 만의 아이들과 같은 어린아이일 뿐이야. 난 네가 필요하지 않고, 너 역시 내가 필요하지 않아.


To you, I am nothing more than a fox like a hundred thousand other foxes. But if you tame me, then we shall need each other.

너에게는 내가 수십만의 여우들과 같은 여우에 불과하니까. 하지만 네가 나를 길들인다면 우리는 서로를 필요로 하게 될 거야.


To me, you will be unique in all the world. To you, I shall be unique in all the world.........."

너는 나에게 이 세상에 유일한 존재가 될 거야. 나는 너한테 세상에 단 하나밖에 없는 존재가 될 거고........."










"My life is very monotonous," the fox said. " I hunt chickens; men hunt me. All the chickens are just alike, and all the men are just alike.

"내 생활은 단조로워. 나는 닭을 쫓고, 사람들은 나를 쫓지. 닭들은 모두 서로 비슷하고, 사람들도 모두 비슷해.


And, in consequence, I am a little bored.

그래서 나는 좀 권태로워.


But if you tame me, it will be as if the sun came to shine on my life. I shall know the sound of a step that will be different from all the others.

그러나 네가 날 길들인다면 내 생활은 햇빛을 받은 것처럼 밝아질 거야. 다른 발자국 소리와는 다르게 들릴 너의 발자국 소리를 나는 알게 될거야.


Other steps send me hurrying back underneath the ground. Yours will call me, like music, out of my burrow.

다른 발자국 소리가 나면 나는 땅 속으로 숨을 거야. 네 발자국 소리는 음악소리처럼 나를 굴 밖으로 불러낼 거야.


And the look: you see the grain fields down yonder? I do not eat bread. Wheat is of no use to me.

그리고 저길 봐! 밀밭이 보이니? 나는 빵을 먹지 않아. 밀은 나한테 쓸모가 없어.


The wheat fields have nothing to say to me. And that is sad.

밀밭을 보아도 아무 생각도 떠오르지 않아! 그래서 슬퍼!


But you have hair that is the color of gold. Think how wonderful that will be when you have tamed me!

그러나 네 머리칼은 금빛이야. 그래서 네가 날 길들인다면 정말 신날 거야! 


The grain, which is also golden, will bring me back the thought of you.

밀도 금빛이기 때문에 밀은 너를 기억하게 해줄 거야.


And I shall love to listen to the wind in the wheat....."

그래서 밀밭을 스치는 바람소리까지 사랑하게 될 거고......"










The little prince went away, to look again at the roses.

어린 왕자는 장미들을 다시 보러 갔어요.


"You are not at all like my rose," he said. "As yet you are nothing. No one has tamed you, and you have tamed no one.

"너희들은 내 장미와 조금도 닮은 데가 없어. 너희들은 아직 아무것도 아니야. 아무도 너희들을 길들이지 않았고 너희들도 누구 하나 길들이지 않았어.


You are like my fox when I first knew him. He was only a fox like a hundred thousand other foxes.

내 여우가 꼭 너희들 같았지. 내 여우는 수많은 여우들과 같은 여우 한마리에 지나지 않았지.


But I have made him my friend, and now he is unique in all the world."

하지만 난 여우를 친구로 삼았고, 그 여우는 이젠 이 세상에서 단 하나밖에 없는 여우가 됐어."


And the roses were very much embarrassed.

그러자 장미꽃들은 몹시 당황스러워했어요.


"You are beautiful, but you are empty." he went on. 

어린왕자는 말을 계속했어요. "너희들은 아름다워. 하지만 너희들은 비어 있어. 


"One could not die for you. 

아무도 너희들을 위해 죽을 수는 없을 테니까. 


To be sure, an ordinary passerby would think that my rose looked just like you- the rose that belongs to me.

물론 나의 꽃인 내 장미도 멋모르는 행인은 너희들과 비슷하다고 생각할거야.


But in herself alone she is more important than all the hundreds of you other roses:

하지만 내겐 그 꽃 하나만으로도 너희들 전부보다 더 소중해. 


because it is she that I have watered; because it is she that I have put under the glass globe; 

내가 물을 준 것은 그 꽃이기 때문이야. 내가 유리덮개를 씌워준 건 그 꽃이기 때문이야.


because it is she that I have sheltered behind the screen; because it is for her that I have killed the caterpillars;

내가 바람막이로 바람을 막아준 건 그 꽃이기 때문이야. 내가 벌레를 잡아준건 그 꽃이기 때문이야.


because it is she that I have listened to, when she grumbled, or boasted, or even sometimes when she said nothing. 

내가 불평을 들어주고, 허풍을 들어주고, 때로는 심지어 침묵까지 들어준 내 꽃이기 때문이야. 


Because she is my rose."

나의 장미이기 때문이야.











Only the children know what they are looking for," said the little prince. " They devote their time to a rag doll and it becomes very important to them;

"어린애들만이 자기들이 뭘 찾는지 알고 있어요. 그들은 헝겊인형 때문에 시간을 허비하고, 인형은 그들에게 아주 중요한 것이니까요.


and if anybody takes it away from them, they cry......."

그걸빼앗기면 그들은 소리내어 울고 말예요......"














"What are you trying to say?"

"무슨 말을 하려는 거니?"


"All men have the stars," he answered, "but they are not the same things for different people.

"누구에게나 별은 있지요. 하지만 다 똑같은 별이 아녜요.


For some, who are travelers, the stars are guides. For others they are no more than little lights in the sky.

여행을 하는 사람에겐 별은 길잡이예요. 어떤 사람들에겐 작은 빛에 지나지 않고요.


For others, who are scholars, they are problems. For my businessman they were wealth.

학자에게 별은 문젯거리겠지요. 내가만난 상인한텐 별은 돈이고요.


But all these stars are silent. You- you alone- will have the stars as no one else has them-"

그러나 별은 말이 없어요. 아저씨는 그런 사람들하고 다른 별을 갖게 될 거예요....."


"What are you trying to say?"

"무슨 말을 하려는 거니?"


"In one of the stars I shall be living. In one of them I shall be laughing. And so it will be as if all the stars were laughing, when you look at the sky at night.... 

"아저씨가 밤에 하늘을 바라보게 되면, 내가 그 별들 중의 한 별에서 살고 있고, 그 별들 중의 한 별에서 내가 웃고 있을 거라는 말이에요. 그러면 아저씨에겐 마치 모든 별들이 웃고 있는 것처럼 보일 거예요.


you- only you- will have stars that can laugh!"

아저씨는 웃을 줄 아는 별을 가지게 될 거에요!"

'취미생활 > 도서' 카테고리의 다른 글

다시읽는 어린왕자 中......  (0) 2013.11.20
by 아발로온v 2013.11.20 02:39
| 1 2 |