<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Superkkt Blog</title>
		<link>http://superkkt.com/</link>
		<description>프로그램 개발과 관련된 지식을 정리하는 공간입니다.</description>
		<language>ko</language>
		<pubDate>Mon, 08 Mar 2010 22:44:22 +0900</pubDate>
		<generator>Textcube 1.7.8 : Con moto</generator>
		<image>
		<title>Superkkt Blog</title>
		<url>http://superkkt.com/attach/1/9636956052.gif</url>
		<link>http://superkkt.com/</link>
		<width>140</width>
		<height>120</height>
		<description>프로그램 개발과 관련된 지식을 정리하는 공간입니다.</description>
		</image>
		<item>
			<title>OpenCV로 Connected Component 추출</title>
			<link>http://superkkt.com/488</link>
			<description>출처: http://opencv.willowgarage.com/documentation/drawing_functions.html?highlight=drawcon#cvDrawContours&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;&lt;span class=&quot;cp&quot;&gt;#include &quot;cv.h&quot;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;cp&quot;&gt;#include &quot;highgui.h&quot;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kt&quot;&gt;char&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;**&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;n&quot;&gt;IplImage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;c1&quot;&gt;// the first command line parameter must be file name of binary&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;c1&quot;&gt;// (black-n-white) image&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;argc&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;cvLoadImage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;IplImage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dst&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cvCreateImage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cvGetSize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;CvMemStorage&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;storage&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;cvCreateMemStorage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;CvSeq&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvThreshold&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CV_THRESH_BINARY&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvNamedWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Source&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvShowImage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Source&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvFindContours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;storage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;sizeof&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;CvContour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;&lt;br&gt;                      &lt;span class=&quot;n&quot;&gt;CV_RETR_CCOMP&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CV_CHAIN_APPROX_SIMPLE&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvZero&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dst&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;h_next&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;n&quot;&gt;CvScalar&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CV_RGB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;255&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;cm&quot;&gt;/* replace CV_FILLED with 1 to see the outlines */&lt;/span&gt;&lt;br&gt;            &lt;span class=&quot;n&quot;&gt;cv&lt;span class=&quot;highlight&quot;&gt;DrawCon&lt;/span&gt;tours&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dst&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;contour&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;CV_FILLED&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;8&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvNamedWindow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Components&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvShowImage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot;Components&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;dst&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;        &lt;span class=&quot;n&quot;&gt;cvWaitKey&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;br&gt;    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;/pre&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>CC</category>
			<category>Connected Component</category>
			<category>OpenCV</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/488</guid>
			<comments>http://superkkt.com/488#entry488comment</comments>
			<pubDate>Mon, 08 Mar 2010 15:38:20 +0900</pubDate>
		</item>
		<item>
			<title>Convolution을 위한 경계(border) 영상 생성</title>
			<link>http://superkkt.com/487</link>
			<description>Convolution을 하기 전에 영상의 외곽 경계 부분을 확장해주는 코드이다. 영상 경계 부분에 있는 픽셀값을 그대로 사용해서 Mirroring(Replication)을 한다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; tmp = cvCreateImage(cvSize(img-&amp;gt;width + borderSize * 2,&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; img-&amp;gt;height + borderSize * 2), img-&amp;gt;depth, img-&amp;gt;nChannels);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSetZero(tmp);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvCopyMakeBorder(img, tmp, cvPoint(borderSize, borderSize),&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IPL_BORDER_REPLICATE);&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>border</category>
			<category>Convolution</category>
			<category>mirroring</category>
			<category>OpenCV</category>
			<category>replicate</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/487</guid>
			<comments>http://superkkt.com/487#entry487comment</comments>
			<pubDate>Mon, 08 Mar 2010 15:36:01 +0900</pubDate>
		</item>
		<item>
			<title>OpenCV에서 픽셀 값 정규화</title>
			<link>http://superkkt.com/486</link>
			<description>모든 픽셀 값이 0~255 사이의 값을 가지도록 정규화하는 방법이다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;cvNormalize(img, img, 0, 255, CV_MINMAX);&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>Normalize</category>
			<category>OpenCV</category>
			<category>정규화</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/486</guid>
			<comments>http://superkkt.com/486#entry486comment</comments>
			<pubDate>Mon, 08 Mar 2010 15:32:09 +0900</pubDate>
		</item>
		<item>
			<title>OpenCV Morphology 연산</title>
			<link>http://superkkt.com/485</link>
			<description>아래는 OpenCV에서 Morphology 연산을 하는 코드이다. 5-by-5 사각형 커널(Center Pixel=(2,2))을 만들고 Close, Open, Close 연산을 차례대로 수행한다. 그리고 이 함수는 in-place 연산이 가능하기 때문에 av라는 하나의 이미지 구조체만 사용하고 있다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplConvKernel *kernel = cvCreateStructuringElementEx(5, 5, 2, 2, CV_SHAPE_RECT);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvMorphologyEx(av, av, NULL, kernel, CV_MOP_CLOSE, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvMorphologyEx(av, av, NULL, kernel, CV_MOP_OPEN, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvMorphologyEx(av, av, NULL, kernel, CV_MOP_CLOSE, 1);&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>Morphology</category>
			<category>OpenCV</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/485</guid>
			<comments>http://superkkt.com/485#entry485comment</comments>
			<pubDate>Mon, 08 Mar 2010 15:30:39 +0900</pubDate>
		</item>
		<item>
			<title>cvSobel() 파라메터는 0~1로 스케일된 이미지</title>
			<link>http://superkkt.com/484</link>
			<description>OpenCV의 cvSobel() 함수로 Edge Magnitude와 Orientation을 구할 때 파라메터로 들어가는 이미지는 0~1 사이 값을 가지도록 스케일되어 있어야 한다. 예제 코드는 아래 참조~&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *img_32f = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvConvertScale(img, img_32f, 1.0 / 255.0, 0);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSmooth(img_32f, img_32f, CV_GAUSSIAN, 3);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *diff_x = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *diff_y = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSobel(img_32f, diff_x, 1, 0, 3);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSobel(img_32f, diff_y, 0, 1, 3);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *magnitude = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *orientation = cvCreateImage(cvGetSize(img), IPL_DEPTH_32F, 1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* calculate the edge magnitude and orientation */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvCartToPolar(diff_x, diff_y, magnitude, orientation, 0);&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>cvSobel</category>
			<category>Edge</category>
			<category>OpenCV</category>
			<category>Sobel</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/484</guid>
			<comments>http://superkkt.com/484#entry484comment</comments>
			<pubDate>Mon, 08 Mar 2010 15:27:27 +0900</pubDate>
		</item>
		<item>
			<title>Fixedsys font for Mac OS</title>
			<link>http://superkkt.com/480</link>
			<description>Mac에서는 Fixedsys 폰트를 터미널에서 사용할 때 Antialiasing을 켜지 않으면 폰트가 엉망으로 출력된다. Antialiasing을 켜고 크기는 15pt로 하면 리눅스에서 쓰던대로 똑같이 사용할 수 있다.</description>
			<category>컴퓨터</category>
			<category>fixedsys</category>
			<category>Mac</category>
			<category>폰트</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/480</guid>
			<comments>http://superkkt.com/480#entry480comment</comments>
			<pubDate>Sat, 27 Feb 2010 16:09:30 +0900</pubDate>
		</item>
		<item>
			<title>Document Image Perspective Correction</title>
			<link>http://superkkt.com/478</link>
			<description>촬영된 문서가 휘어져 있을때 네개의 모서리를 입력받아서 직사각형 모양으로 다시 복원시키는 코드이다. 간단하게 만드느라 모서리 좌표를 코드에 픽스했는데, 나중에 마우스로 클릭해서 입력받도록 고쳐보자.&lt;br&gt;&lt;br&gt;아래는 테스트 영상(좌)과 변환된 영상(우)이다. 변환된 영상의 크기는 대상 문서의 크기와 동일하다.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;imageblock dual&quot; style=&quot;text-align: center;&quot;&gt;&lt;table cellspacing=&quot;5&quot; cellpadding=&quot;0&quot; border=&quot;0&quot; style=&quot;margin: 0 auto;&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://superkkt.com/attach/1/1611884371.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;435&quot; width=&quot;327&quot; /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src=&quot;http://superkkt.com/attach/1/3406264202.jpg&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;402&quot; width=&quot;327&quot; /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;소스코드는 아래를 참조한다.&lt;br&gt;&lt;p id=&quot;more478_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;478_0&#039;,&#039; more.. &#039;,&#039; less.. &#039;); return false;&quot;&gt; more.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content478_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt; &lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;&lt;br&gt;#include &amp;lt;cv.h&amp;gt;&lt;br&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br&gt;&lt;br&gt;#define max(a, b) ((a) &amp;gt; (b) ? (a) : (b))&lt;br&gt;&lt;br&gt;int main(int argc, char **argv)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *in, *out;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CvPoint2D32f src[4], dst[4];&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CvMat *h = NULL;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int width, height;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (argc != 3) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; fprintf(stderr, &quot;Usage: %s in out\n&quot;, argv[0]);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(EXIT_FAILURE);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* top left */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[0].x = 194;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[0].y = 108;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* top right */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[1].x = 1386;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[1].y = 118;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* bottom right (not left!!) */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[2].x = 1508;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[2].y = 1936;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* bottom left */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[3].x = 32;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src[3].y = 1916;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; width = max(src[1].x - src[0].x, src[2].x - src[3].x);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; height = max(src[3].y - src[0].y, src[2].y - src[1].y);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* top left */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[0].x = 0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[0].y = 0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* top right */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[1].x = width;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[1].y = 0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* bottom right (not left!!) */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[2].x = width;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[2].y = height;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /* bottom left */&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[3].x = 0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; dst[3].y = height;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; in = cvLoadImage(argv[1], CV_LOAD_IMAGE_UNCHANGED);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; out = cvCreateImage(cvSize(width, height), in-&amp;gt;depth, in-&amp;gt;nChannels);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; h = cvCreateMat(3, 3, CV_32FC1);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvGetPerspectiveTransform(src, dst, h);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvWarpPerspective(in, out, h, CV_INTER_CUBIC + CV_WARP_FILL_OUTLIERS, cvScalarAll(0));&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSaveImage(argv[2], out, NULL);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvReleaseMat(&amp;amp;h);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvReleaseImage(&amp;amp;in);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvReleaseImage(&amp;amp;out);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;br&gt;}&lt;/div&gt;&lt;/div&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>OpenCV</category>
			<category>Perspective</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/478</guid>
			<comments>http://superkkt.com/478#entry478comment</comments>
			<pubDate>Sat, 20 Feb 2010 16:48:40 +0900</pubDate>
		</item>
		<item>
			<title>Xcode Documentation Error</title>
			<link>http://superkkt.com/476</link>
			<description>Xcode의 Documentation에서 iPhone OS 3.1 API 때문에 계속 파일을 찾을 수 없다는 에러 메시지가 발생하는 경우가 있다.&lt;br&gt;&lt;br&gt;이는 API Doc 버전 때문에 발생하는 문제라고 하는데 아직 애플에서 수정을 안한것 같다. 임시로 API Doc 버전을 다운그레이드해서 해결할 수 있다.&lt;br&gt;&lt;br&gt;참조: http://allens-techlog.blogspot.com/2009/11/fixing-xcode-requested-file-was-not.html&lt;br&gt;</description>
			<category>프로그래밍</category>
			<category>API</category>
			<category>Doc</category>
			<category>Xcode</category>
			<category>다운그레이드</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/476</guid>
			<comments>http://superkkt.com/476#entry476comment</comments>
			<pubDate>Thu, 18 Feb 2010 00:27:01 +0900</pubDate>
		</item>
		<item>
			<title>rsync exclude list</title>
			<link>http://superkkt.com/475</link>
			<description>rsync로 백업할 때 제외하고 싶은 파일 또는 디렉토리를 아래와 같이 등록할 수 있다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;# rsync -avz --exclude &#039;mysql&#039; /data 211.111.111.111::backup&lt;/div&gt;&lt;br&gt;위 명령은 /data 디렉토리를 211.111.111.111 서버로 백업하는데, /data/mysql 디렉토리는 제외하라는 뜻이다. 즉, exclude list는 백업 대상 디렉토리를 기준으로 하는 상대경로를 사용해야 한다.&lt;br&gt;&lt;br&gt;참고: &lt;a href=&quot;http://articles.slicehost.com/2007/10/10/rsync-exclude-files-and-folders&quot; target=&quot;_blank&quot;&gt;http://articles.slicehost.com/2007/10/10/rsync-exclude-files-and-folders&lt;/a&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>컴퓨터</category>
			<category>exclude</category>
			<category>rsync</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/475</guid>
			<comments>http://superkkt.com/475#entry475comment</comments>
			<pubDate>Wed, 17 Feb 2010 22:15:06 +0900</pubDate>
		</item>
		<item>
			<title>Sauvola Local Thresholding</title>
			<link>http://superkkt.com/471</link>
			<description>아래는 OpenCV를 사용해서 Sauvola Local Thresholding을 구현한 코드이다.&lt;br&gt;&lt;br&gt;Integral image를 사용해서 Mean과 Standard Deviation을 매번 계산하지 않도록 수정하면 속도를 대폭 향상시킬 수 있다. 이건 나중에 시간날 때 만들어보자~&lt;br&gt;&lt;br&gt;&lt;p id=&quot;more471_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;471_0&#039;,&#039; more.. &#039;,&#039; less.. &#039;); return false;&quot;&gt; more.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content471_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt; &lt;br&gt;#define THRESH_BINARY 0&lt;br&gt;#define THRESH_GRAYSCALE 1&lt;br&gt;&lt;br&gt;/* Sliding window size&amp;nbsp; (Must be an odd number) */&lt;br&gt;#define KERNEL_SIZE 15&lt;br&gt;&lt;br&gt;/* Maximum standard deviation for a grayscale document */&lt;br&gt;#define SAUVOLA_R_PARAM 128&lt;br&gt;&lt;br&gt;/* Positive parameter to control the threshold */&lt;br&gt;#define SAUVOLA_K_PARAM 0.2&lt;br&gt;&lt;br&gt;static double mean(IplImage *img, int row, int col, int border_size)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double total = 0.0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int i, j;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CvScalar g;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (i = row - border_size; i &amp;lt;= row + border_size; i++) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (j = col - border_size; j &amp;lt;= col + border_size; j++) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g = cvGet2D(img, i, j);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; total += (double) g.val[0];&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return total / (KERNEL_SIZE * KERNEL_SIZE);&lt;br&gt;}&lt;br&gt;&lt;br&gt;static double standard_deviation(IplImage *img, int row, int col,&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int border_size, double m)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double total = 0.0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double deviation;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int i, j;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CvScalar g;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (i = row - border_size; i &amp;lt;= row + border_size; i++) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (j = col - border_size; j &amp;lt;= col + border_size; j++) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g = cvGet2D(img, i, j);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; deviation = (double) g.val[0] - m;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; total += deviation * deviation;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return sqrt(total / (KERNEL_SIZE * KERNEL_SIZE));&lt;br&gt;}&lt;br&gt;&lt;br&gt;/* &lt;br&gt;&amp;nbsp;* @src and @dst images must have same size array &lt;br&gt;&amp;nbsp;* @mode: THRESH_BINARY or THRESH_GRAYSCALE&lt;br&gt;&amp;nbsp;*/&lt;br&gt;static int sauvola(const IplImage *src, IplImage *dst, int mode)&lt;br&gt;{&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IplImage *temp = NULL;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int i, j, border_size;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; border_size = floor(KERNEL_SIZE / 2.0);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp = cvCreateImage(cvSize(src-&amp;gt;width + border_size * 2,&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src-&amp;gt;height + border_size * 2),&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; src-&amp;gt;depth, src-&amp;gt;nChannels);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (!temp)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return -1;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSetZero(temp);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvCopyMakeBorder(src, temp, cvPoint(border_size, border_size),&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; IPL_BORDER_REPLICATE, cvScalarAll(0));&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (i = border_size; i &amp;lt; src-&amp;gt;height + border_size; i++) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (j = border_size; j &amp;lt; src-&amp;gt;width + border_size; j++) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double m, s;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; unsigned char t;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CvScalar g, b;&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m = mean(temp, i, j, border_size);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; s = standard_deviation(temp, i, j, border_size, m);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; t = (unsigned char) (m * (1 + SAUVOLA_K_PARAM *&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; (s / SAUVOLA_R_PARAM - 1)));&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; g = cvGet2D(temp, i, j);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (g.val[0] &amp;lt;= t) {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (mode == THRESH_BINARY)&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b.val[0] = 0;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b.val[0] = g.val[0];&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } else {&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; b.val[0] = 255;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvSet2D(dst, i - border_size, j - border_size, b);&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; cvReleaseImage(&amp;amp;temp);&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return 0;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>Integral Image</category>
			<category>Sauvola</category>
			<category>Thresholding</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/471</guid>
			<comments>http://superkkt.com/471#entry471comment</comments>
			<pubDate>Sat, 30 Jan 2010 03:19:42 +0900</pubDate>
		</item>
		<item>
			<title>Retinex 구현</title>
			<link>http://superkkt.com/469</link>
			<description>Retinex 구현이 필요해서 좀 찾아보니 GIMP에 플러그인으로 구현이 되어있었다. GIMP에 구현된 버전은 MSRCR(Multi-Scale Retinex with Color Restoration)이다.&lt;br&gt;&lt;br&gt;GIMP 소소트리의 plug-ins/common/contrast-retinex.c 파일에 구현되어 있다.&lt;br&gt;</description>
			<category>영상처리</category>
			<category>GIMP</category>
			<category>MSRCR</category>
			<category>Retinex</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/469</guid>
			<comments>http://superkkt.com/469#entry469comment</comments>
			<pubDate>Wed, 20 Jan 2010 10:43:04 +0900</pubDate>
		</item>
		<item>
			<title>iMac 무선 키보드 설정</title>
			<link>http://superkkt.com/464</link>
			<description>iMac 무선키보드가 키를 많이 제거해서 처음엔 쓰기가 좀 불편하다. 특히 터미널에서 vi 등을 사용할 때 무지 불편하다.&lt;br&gt;&lt;br&gt;그래서 다음과 같이 설정해서 좀 더 쓰기 편하게 만들어보자.&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;1. 펑션키 전환&lt;/span&gt;&lt;br&gt;&lt;br&gt;설정 -&amp;gt; 키보드 -&amp;gt; &quot;모든 F1, F2 등의 키를 기본 기능키로 사용&quot;을 체크해줘야 펑션키가 원하는대로 작동한다. 그렇지 않으면 펑션키에 매핑된 각종 컴퓨터 컨트롤 기능(볼륨 업/다운 등)이 기본적으로 실행된다. 이걸 체크하고 나서는 컴퓨터 컨트롤 기능을 사용하려면 fn 키와 조합해서 누르면 된다.&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;2. 바람입력기 설치&lt;/span&gt;&lt;br&gt;&lt;br&gt;바람입력기를 설치하고 설정 -&amp;gt; 손쉬운 사용 -&amp;gt; &quot;보조장비에 대한 접근 활성&quot;를 키고 바람입력기 설정에서 한글/한자키를 원하는걸로 바꾼다. 나는 오른쪽 커맨드가 한글, 오른쪽 옵션키를 한자로 매핑하였다.&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;3. 터미널 키보드 설정&lt;/span&gt;&lt;br&gt;&lt;br&gt;터미널의 환경 설정 -&amp;gt; 설정 -&amp;gt; 키보드에서 pageup, pagedown 키를 각각 아래와 같이 설정해준다. 이걸 안해주면 페이지업/다운 키를 눌렀을때 버퍼의 앞뒤로 움직인다. 참고로 페이지업/다운 키가 존재하지 않기 때문에 fn과 화살표 위/아래 키를 조합해서 사용한다.&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;&lt;li&gt;Edit (or Add) the entry for Page Up
&lt;ul&gt;&lt;li&gt;Set &lt;em&gt;Action:&lt;/em&gt; to &lt;em&gt;send string to shell:&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Set the string to \033[5~ (copy and paste this in)&lt;/li&gt;&lt;/ul&gt;
&lt;/li&gt;&lt;li&gt;Edit (or Add) the entry for Page Down
&lt;ul&gt;&lt;li&gt;Set &lt;em&gt;Action:&lt;/em&gt; to &lt;em&gt;send string to shell:&lt;/em&gt;&lt;/li&gt;&lt;li&gt;Set the string to \033[6~ (copy and paste this in)&lt;/li&gt;&lt;/ul&gt;출처: http://theandystratton.com/2009/fixing-home-end-page-up-and-page-down-in-leopards-terminal&lt;br&gt;&lt;/li&gt;&lt;/div&gt;&lt;/ol&gt;&lt;br&gt;</description>
			<category>컴퓨터</category>
			<category>iMac</category>
			<category>Mac</category>
			<category>Wireless Keyboard</category>
			<category>키보드</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/464</guid>
			<comments>http://superkkt.com/464#entry464comment</comments>
			<pubDate>Wed, 13 Jan 2010 11:30:49 +0900</pubDate>
		</item>
		<item>
			<title>Sauvola/Niblack Binarization</title>
			<link>http://superkkt.com/463</link>
			<description>OpenCV를 사용해서 Sauvola와 Niblack 알고리즘을 구현한 코드이다. MSVC로 코딩되어 있는것 같은데 아직 사용을 안 해봐서 성능이 어떤지는 모르겠다. 적당히 포팅해서 사용해보자.&lt;br&gt;&lt;br&gt;코드는 일본인이 작성한것 같고 라이센스는 LGPL로 배포되었다.&lt;br&gt;&lt;br&gt;(추가) 자세히 살펴보니 논문이랑 다른 부분도 있는것 같다. 그냥 참고용으로만 사용하자.&lt;br&gt;&lt;br&gt;&lt;p id=&quot;more463_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;463_0&#039;,&#039; more.. &#039;,&#039; less.. &#039;); return false;&quot;&gt; more.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content463_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt; &lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;/**
&lt;br&gt;&amp;nbsp;* (C) 2008 Schima
&lt;br&gt;&amp;nbsp;* This code is licenced under the LGPL.
&lt;br&gt;&amp;nbsp;*/
&lt;br&gt;&amp;nbsp;&lt;br&gt;#include &quot;StdAfx.h&quot;
&lt;br&gt;#include &quot;Extras.h&quot;
&lt;br&gt;&amp;nbsp;&lt;br&gt;using namespace System;
&lt;br&gt;using namespace System::Runtime::InteropServices;
&lt;br&gt;namespace N = KwsmLab::OpenCvSharp;
&lt;br&gt;&amp;nbsp;&lt;br&gt;namespace KwsmLab {
&lt;br&gt;namespace OpenCvSharp
&lt;br&gt;{
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;summary&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// Niblackの手法による二値化?理を行う。
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;/summary&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;src&quot;&amp;gt;入力?像&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;dst&quot;&amp;gt;出力?像&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;size&quot;&amp;gt;局所領域のサイズ&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;k&quot;&amp;gt;係?&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; void Extras::BinarizeNiblack(N::IplImage^ src, N::IplImage^ dst, Int32 size, Double k) &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHECK_NULL(src);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHECK_NULL(dst);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // グレ?スケ?ルのみ
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(src-&amp;gt;NChannels != 1){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;入力?像はグレ?スケ?ル?像でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(dst-&amp;gt;NChannels != 1){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;出力?像はグレ?スケ?ル?像でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // サイズのチェック
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(size &amp;gt;= 3 == 0){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;局所領域のサイズは3以上でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(size % 2 == 0){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;局所領域のサイズは奇?でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; N::IplImage^ gray = src-&amp;gt;Clone();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gray-&amp;gt;EqualizeHist();
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Byte* p = dst-&amp;gt;ImageDataPtr;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double m, s;
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int y = 0; y &amp;lt; gray-&amp;gt;Height; y++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int x = 0; x &amp;lt; gray-&amp;gt;Width; x++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MeanStddev(gray, x, y, size, &amp;amp;m, &amp;amp;s);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int offset = (dst-&amp;gt;WidthStep * y) + x;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p[offset] = (Byte)(m + k*s);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;summary&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// Sauvolaの手法による二値化?理を行う。
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;/summary&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;src&quot;&amp;gt;入力?像&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;dst&quot;&amp;gt;出力?像&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;size&quot;&amp;gt;局所領域のサイズ&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;k&quot;&amp;gt;係?&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;r&quot;&amp;gt;係?&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; void Extras::BinarizeSauvola(N::IplImage^ src, N::IplImage^ dst, Int32 size, Double k, Double r)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHECK_NULL(src);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CHECK_NULL(dst);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // グレ?スケ?ルのみ
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(src-&amp;gt;NChannels != 1){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;入力?像はグレ?スケ?ル?像でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(dst-&amp;gt;NChannels != 1){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;出力?像はグレ?スケ?ル?像でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(src-&amp;gt;Width != dst-&amp;gt;Width || src-&amp;gt;Height != dst-&amp;gt;Height){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;入力?像と出力?像のサイズが違います。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // サイズのチェック
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(size &amp;gt;= 3 == 0){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;局所領域のサイズは3以上でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(size % 2 == 0){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; throw gcnew ArgumentException(&quot;局所領域のサイズは奇?でなければなりません。&quot;);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; N::IplImage^ gray = src-&amp;gt;Clone();
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; gray-&amp;gt;EqualizeHist();
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Byte* p = dst-&amp;gt;ImageDataPtr;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double m, s;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int offset;
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int y = 0; y &amp;lt; gray-&amp;gt;Height; y++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for (int x = 0; x &amp;lt; gray-&amp;gt;Width; x++) {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; MeanStddev(gray, x, y, size, &amp;amp;m, &amp;amp;s);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; offset = (dst-&amp;gt;WidthStep * y) + x;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; p[offset] = (Byte)(m + (1 + k*(s/r - 1)));
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;summary&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// 注目?素の周??素の平均値と標準偏差を求める
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;/summary&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;img&quot;&amp;gt;?像の?素デ?タ&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;x&quot;&amp;gt;x座標&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;y&quot;&amp;gt;y座標&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;size&quot;&amp;gt;周??素の探索サイズ。奇?でなければならない&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;mean&quot;&amp;gt;出力される平均&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; /// &amp;lt;param name=&quot;stddev&quot;&amp;gt;出力される標準偏差&amp;lt;/param&amp;gt;
&lt;br&gt;&amp;nbsp; &amp;nbsp; void Extras::MeanStddev(N::IplImage^ img, Int32 x, Int32 y, Int32 size, Double* mean, Double* stddev)
&lt;br&gt;&amp;nbsp; &amp;nbsp; {
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int count = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sum = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int sum2 = 0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Byte* p = img-&amp;gt;ImageDataPtr;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int xxx, yyy;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int size2 = size / 2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; int widthStep = img-&amp;gt;Width;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Byte v;
&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(int xx = 0; xx&amp;lt;size; xx++){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for(int yy = 0; yy&amp;lt;size; yy++){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; xxx = x + xx - size2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; yyy = y + yy - size2;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(xxx &amp;lt; 0 || xxx &amp;gt;= img-&amp;gt;Width || yyy &amp;lt; 0 || yyy &amp;gt;= img-&amp;gt;Height){
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; v = p[widthStep * yyy + xxx];
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sum += v;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; sum2 += v * v;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; count++;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *mean = (double)sum / count;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; double var = (double)sum2 / count - (*mean)*(*mean);
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(var &amp;lt; 0.0) var = 0.0;
&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; *stddev = sqrt(var);
&lt;br&gt;&amp;nbsp; &amp;nbsp; }
&lt;br&gt;&amp;nbsp;&lt;br&gt;}
&lt;br&gt;}&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;br&gt;촐처: &lt;a href=&quot;http://coderepos.org/share/browser/lang/cpluspluscli/OpenCvSharp/trunk/OpenCvSharp/Extras.cpp?rev=20977&quot; target=&quot;_blank&quot;&gt;http://coderepos.org/share/browser/lang/cpluspluscli/OpenCvSharp/trunk/OpenCvSharp/Extras.cpp?rev=20977&lt;/a&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>영상처리</category>
			<category>Binarization</category>
			<category>Niblack</category>
			<category>Sauvola</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/463</guid>
			<comments>http://superkkt.com/463#entry463comment</comments>
			<pubDate>Mon, 11 Jan 2010 14:02:07 +0900</pubDate>
		</item>
		<item>
			<title>우분투에서 Objective-C 코드 컴파일</title>
			<link>http://superkkt.com/449</link>
			<description>우분투에서 Objective-C 소스파일을 컴파일하려면 build-essential, gobjc/gobjc++, gnustep, gnustep-devel 패키지를 설치해야 한다. 그 외에 또 필요한게 있었나??&lt;br&gt;&lt;br&gt;그리고나서 아래와 같은 간단한 Objective-C 소스를 컴파일해본다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;#import &amp;lt;Foundation/Foundation.h&amp;gt;&lt;br&gt;&lt;br&gt;int main (int argc, const char * argv[])&lt;br&gt;{&lt;br&gt;&amp;nbsp; &amp;nbsp; NSLog(@&quot;Test&quot;);&lt;br&gt;&amp;nbsp; &amp;nbsp; return 0;&lt;br&gt;}&lt;/div&gt;&lt;br&gt;&lt;br&gt;컴파일은 아래와 같이 한다.&lt;br&gt;&lt;br&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;# gcc -Wall -o test test.m -I /usr/include/GNUstep/ -L /usr/lib/GNUstep/ -lgnustep-base -fconstant-string-class=NSConstantString&lt;/div&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>프로그래밍</category>
			<category>gobjc</category>
			<category>Objective-C</category>
			<category>오브젝티브-C</category>
			<category>우분투</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/449</guid>
			<comments>http://superkkt.com/449#entry449comment</comments>
			<pubDate>Thu, 31 Dec 2009 15:13:46 +0900</pubDate>
		</item>
		<item>
			<title>Qt Native File Dialog</title>
			<link>http://superkkt.com/445</link>
			<description>Qt에서 Native File Dialog를 사용하는 방법은 QFileDialog 클래스의 static function을 호출하는 것이다.&lt;br&gt;&lt;br&gt;&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: separate; color: rgb(0, 0, 0); font-family: 굴림; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial,Geneva,Helvetica,sans-serif;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;div style=&quot;padding: 10px; background-color: rgb(228, 228, 228);&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;border-collapse: separate; color: rgb(0, 0, 0); font-family: 굴림; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; font-size: medium;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Arial,Geneva,Helvetica,sans-serif;&quot;&gt;&lt;p style=&quot;font-family: Arial,Geneva,Helvetica,sans-serif; margin-left: 4px; margin-top: 8px; margin-bottom: 8px;&quot;&gt;The easiest way to create a QFileDialog is to use the static functions. On Windows, Mac OS X, KDE and GNOME, these static functions will call the native file dialog when possible.&lt;/p&gt;&lt;pre style=&quot;border: 1px solid rgb(231, 231, 231); padding: 0.2em; background-color: rgb(241, 241, 241); color: black;&quot;&gt; fileName = QFileDialog::getOpenFileName(this,
     tr(&quot;Open Image&quot;), &quot;/home/jana&quot;, tr(&quot;Image Files (*.png *.jpg *.bmp)&quot;));&lt;br&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/div&gt;&lt;br&gt;&lt;br&gt;</description>
			<category>프로그래밍</category>
			<category>QFileDialog</category>
			<category>Qt</category>
			<category>파일창</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/445</guid>
			<comments>http://superkkt.com/445#entry445comment</comments>
			<pubDate>Mon, 28 Dec 2009 00:51:00 +0900</pubDate>
		</item>
		<item>
			<title>Pre-defined C/C++ Compiler Macros</title>
			<link>http://superkkt.com/441</link>
			<description>&lt;a href=&quot;http://predef.sourceforge.net/index.php&quot;&gt;http://predef.sourceforge.net/index.php&lt;/a&gt;</description>
			<category>프로그래밍</category>
			<category>C</category>
			<category>C++</category>
			<category>Macro</category>
			<category>Pre-defined</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/441</guid>
			<comments>http://superkkt.com/441#entry441comment</comments>
			<pubDate>Fri, 25 Dec 2009 15:09:55 +0900</pubDate>
		</item>
		<item>
			<title>북마크 공유</title>
			<link>http://superkkt.com/436</link>
			<description>컴퓨터를 여러 대 쓰다보니 북마크를 관리하기가 힘들었는데, &lt;a href=&quot;http://www.xmarks.com/&quot; target=&quot;_blank&quot;&gt;Xmarks&lt;/a&gt;라는 북마크 공유 사이트를 사용해서 여러 컴퓨터에서 북마크를 공유할 수 있도록 해봤다. 이 서비스는 브라우저의 확장 기능으로 제공되는데, 거의 대부분의 브라우저를 지원하고, 아직 제한적이지만 구글 크롬도 지원하고 있다.</description>
			<category>컴퓨터</category>
			<category>bookmark</category>
			<category>bookmark sync</category>
			<category>Xmarks</category>
			<category>북마크</category>
			<category>북마크 공유</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/436</guid>
			<comments>http://superkkt.com/436#entry436comment</comments>
			<pubDate>Fri, 04 Dec 2009 11:10:47 +0900</pubDate>
		</item>
		<item>
			<title>Matlab 코드를 C/C++ 공유 라이브러리로 배포</title>
			<link>http://superkkt.com/434</link>
			<description>Matlab 코드를 단일실행파일로 만들거나 C/C++ 또는 Java 라이브러리로 만들어서 배포할 수 있다.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;우선 Matlab에서 컴파일러를 설정해야 하는데, 이건 인터넷 뒤져서 하기 바란다. matlab 커맨드 윈도우에서 mbuild -setup이라고치면 뭔가 나오는데 거기서 적당한 컴파일러 선택하면 된다. 리눅스에서는 gcc를 선택하면 되겠다.&lt;span style=&quot;color: rgb(0, 0, 0); font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; font-size: 13px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; font-size: 11px; color: rgb(102, 102, 102); &quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; font-size: 13px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; font-size: 11px; color: rgb(102, 102, 102); &quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#333333&quot;&gt;그럼 컴파일러 설정이 다 되어있다는 가정하에 리눅스 환경에서 C 공유라이브러리 생성을 해보자. 우선 아래와 같이 이미지의 히스토그램을 구해서 화면에 출력하는 간단한 matlab 코드를 만들고 foo.m으로 저장한다. 입력 파라메터 filename은 이미지 파일명, 츨력 파라메터 H는 구해진 히스토그램이다.&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#333333&quot;&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;p id=&quot;more434_0&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;434_0&#039;,&#039; more.. &#039;,&#039; less.. &#039;); return false;&quot;&gt; more.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content434_0&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt; &lt;div&gt;&lt;span style=&quot;font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#333333&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(54, 35, 6); font-family: NanumGothic, 나눔고딕, &#039;Malgun Gothic&#039;, &#039;맑은 고딕&#039;, AppleGothic, 바탕, verdana, dotum, sans-serif; line-height: 21px; font-size: 13px; &quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#333333&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(54, 35, 6); font-family: NanumGothic, 나눔고딕, &#039;Malgun Gothic&#039;, &#039;맑은 고딕&#039;, AppleGothic, 바탕, verdana, dotum, sans-serif; line-height: 21px; font-size: 13px; &quot;&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;function H = foo(filename)&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;br style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;I = imread(filename);&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;G = rgb2gray(I);&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;H = imhist(G, 256);&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;br style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;end&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#333333&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(54, 35, 6); font-family: NanumGothic, 나눔고딕, &#039;Malgun Gothic&#039;, &#039;맑은 고딕&#039;, AppleGothic, 바탕, verdana, dotum, sans-serif; line-height: 21px; font-size: 13px; &quot;&gt;&lt;br&gt;&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;font-family: 굴림, 돋움, arial, sans-serif; line-height: 19px; &quot;&gt;&lt;span style=&quot;font-family: Gulim, Helvetica, AppleGothic, sans-serif; line-height: 17px; &quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-size: medium;&quot;&gt;&lt;font class=&quot;Apple-style-span&quot; color=&quot;#333333&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(54, 35, 6); font-family: NanumGothic, 나눔고딕, &#039;Malgun Gothic&#039;, &#039;맑은 고딕&#039;, AppleGothic, 바탕, verdana, dotum, sans-serif; line-height: 21px; font-size: 13px; &quot;&gt;이제 아래와 같이 순서대로 따라한다.&lt;/span&gt;&lt;/font&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;1. matlab 커맨드 윈도우에서 deploytool이라고 치면 GUI 창이 나온다. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;2. 새로운 프로젝트 생성 아이콘을 눌러서 C Shared Library를 선택&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;3. 프로젝트 이름을 libfoo.prj로 해서 생성&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;4. Exported functions를 오른쪽 클릭하고 Add를 눌러서 foo.m 파일을 등록한다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;5. Build 버튼을 눌러서 컴파일 한다. 당연 에러가 발생하면 안되고 성공적으로 끝났다는 메시지가 나와야 한다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;5. Package 버튼을 눌러서 컴파일된 파일들을 패키징한다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;6. 패키징된 파일은 ZIP 파일이다. 압축을 풀면 MCRInstaller.bin 파일과 컴파일 결과물이 있는데, MCRInstaller.bin을 실행해서 Matlab Compiler Runtime을 시스템에 설치한다. 설치 전에 bc가 미리 설치되어 있어야하고, 그래픽 환경이 아닌 경우에는 인스톨러를 실행할 때 -console 옵션을 주고 실행해야 콘솔에서 설치가 가능하다. 설치 과정은 반응도 느리고 좀 답답하니 참고하기 바란다. 그리고 X 관련 라이브러리가 설치되지 않은 시스템에서는 나중에 C 코드를 컴파일해서 실행할 때 라이브러리를 못찾는 에러가 나온다. 따라서 미리 아래 라이브러리들을 설치해준다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;$ sudo apt-get install libxt6 libxt-dev libxpm4 libxpm-dev libxmu6 libxmu-dev libxp6 libxp-dev &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;7. libfoo 라이브러리를 호출하는 C 소스코드를 만들고 컴파일 한다. 코드는 아래에 있는걸 사용하면 된다. 컴파일 과정에서 LIB_PREFIX에는 Matlab Compiler Runtime을 설치한 경로를 입력하면 된다. 참고로 현재 디렉토리는 패키지를 풀어놓은 디렉토리이다.&lt;br&gt;&lt;/div&gt;&lt;p id=&quot;more434_1&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;434_1&#039;,&#039; more.. &#039;,&#039; less.. &#039;); return false;&quot;&gt; more.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content434_1&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;&lt;div&gt;$ export LIB_PREFIX=/usr/local/matlab/runtime&lt;/div&gt;&lt;div&gt;$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB_PREFIX/v79/runtime/glnxa64:.&lt;br&gt;&lt;/div&gt;&lt;div&gt;$ gcc -Wall -o foo -I$LIB_PREFIX/v79/extern/include foo.c -L. -lfoo&lt;/div&gt;&lt;div&gt;$ ./foo /data/images/object_01.jpg&lt;/div&gt;&lt;div&gt;&lt;div&gt;11893&lt;/div&gt;&lt;div&gt;14881&lt;/div&gt;&lt;div&gt;17332&lt;/div&gt;&lt;div&gt;15898&lt;/div&gt;&lt;div&gt;13204&lt;/div&gt;&lt;div&gt;... (생략)&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;아래는 테스트용 C 소스코드이다.&lt;/div&gt;&lt;p id=&quot;more434_2&quot; class=&quot;moreless_fold&quot;&gt;&lt;span style=&quot;cursor: pointer;&quot; onclick=&quot;toggleMoreLess(this, &#039;434_2&#039;,&#039; more.. &#039;,&#039; less.. &#039;); return false;&quot;&gt; more.. &lt;/span&gt;&lt;/p&gt;&lt;div id=&quot;content434_2&quot; class=&quot;moreless_content&quot; style=&quot;display: none;&quot;&gt; &lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;&lt;div&gt;&lt;div&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;#include &quot;libfoo.h&quot; /* MATLAB-generated header file */&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;int main(int argc, char **argv)&lt;/div&gt;&lt;div&gt;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mxArray *x_ptr;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mxArray *y_ptr=NULL;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;double *y;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;size_t len;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;int i;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (argc != 2) {&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fprintf(stderr, &quot;Usage: %s filename\n&quot;, argv[0]);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exit(EXIT_FAILURE);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Call the MCR and library initialization functions */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if( !mclInitializeApplication(NULL,0) )&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fprintf(stderr, &quot;Could not initialize the application.\n&quot;);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exit(1);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!libfooInitialize())&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fprintf(stderr,&quot;Could not initialize the library.\n&quot;);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exit(1);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Create an mxArray to input into mlfFoo */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;x_ptr = mxCreateString(argv[1]);&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Call the implementation function */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Note the second input argument should be &amp;amp;y_ptr instead of y_ptr. */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;if (!mlfFoo(1,&amp;amp;y_ptr,x_ptr)) {&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;fprintf(stderr, &quot;Fail..\n&quot;);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;exit(1); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* The return value from mlfFoo is an mxArray. Use mxGetpr to get a pointer to data it contains. */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;y = mxGetPr(y_ptr);&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;len = mxGetM(y_ptr);&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;for (i = 0; i &amp;lt; len; i++)&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Display the output of the call to mlfFoo. */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;printf(&quot;%d\n&quot;, (int) y[i]);&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mxDestroyArray(x_ptr);&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mxDestroyArray(y_ptr);&lt;/div&gt;&lt;div style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/* Call the library termination function */&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;libfooTerminate();&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;mclTerminateApplication();&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;return 0;&lt;/div&gt;&lt;div&gt;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;C 코드에서 shared library function에 파라메터를 주고 받을 때 사용하는 API는 &lt;a href=&quot;http://www.mathworks.com/access/helpdesk/help/techdoc/apiref/bqoqnz0.html&quot; target=&quot;_blank&quot;&gt;여기&lt;/a&gt;를 참조한다. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;참고로 MATLAB 컴파일러가 만드는 공유라이브러리 코드는 출력과 에러를 각각 stdout, stderr로 보낸다. 만약 이걸 다르게 처리하고 싶다면 출력, 에러 핸들러를 각각 만들어서 라이브러리를 초기화를 할 때 &amp;lt;lib&amp;gt;Initializer() 함수 대신 &amp;lt;lib&amp;gt;InitializerWithHandlers() 함수를 사용해서 등록해준다. 자세한 내용은&lt;a href=&quot;http://www.mathworks.com/access/helpdesk/help/toolbox/compiler/f2-998954.html&quot; target=&quot;_blank&quot;&gt; 여기&lt;/a&gt;를 참조한다. 그리고 함수의 출력인자가 여러 개인 경우도 설명되어 있으니 참조한다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;그리고 C 코드에서 반드시 MCR과 shared library를 초기화하고 제거하는 코드가 아래와 같이 들어가야 한다. &amp;lt;lib&amp;gt;는 방금 만든 shared library의 이름으로 대체하면 된다. 참고로 matlab에서 나오는 모든 스칼라 값은 double 타입으로 넘어온다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(0, 0, 0); font-family: Verdana, Arial, Helvetica, sans-serif; line-height: normal; &quot;&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;&lt;pre class=&quot;programlisting&quot; style=&quot;margin-top: 1ex; margin-right: 0px; margin-bottom: 0.7ex; margin-left: 32px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;...&lt;i style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;tt style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; &quot;&gt;code&lt;/tt&gt;&lt;/i&gt;... 
mclInitializeApplication(); 
&amp;lt;lib&amp;gt;Initialize(); 
&lt;br&gt;&lt;/pre&gt;&lt;pre class=&quot;programlisting&quot; style=&quot;margin-top: 1ex; margin-right: 0px; margin-bottom: 0.7ex; margin-left: 32px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;...code...&lt;/pre&gt;&lt;pre class=&quot;programlisting&quot; style=&quot;margin-top: 1ex; margin-right: 0px; margin-bottom: 0.7ex; margin-left: 32px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre class=&quot;programlisting&quot; style=&quot;margin-top: 1ex; margin-right: 0px; margin-bottom: 0.7ex; margin-left: 32px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&amp;lt;lib&amp;gt;Terminate();  
mclTerminateApplication(); 
...&lt;i style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; &quot;&gt;&lt;tt style=&quot;margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; &quot;&gt;code&lt;/tt&gt;&lt;/i&gt;... &lt;/pre&gt;&lt;/div&gt;&lt;pre class=&quot;programlisting&quot; style=&quot;margin-top: 1ex; margin-right: 0px; margin-bottom: 0.7ex; margin-left: 32px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;br&gt;&lt;/pre&gt;&lt;pre class=&quot;programlisting&quot; style=&quot;margin-top: 1ex; margin-right: 0px; margin-bottom: 0.7ex; margin-left: 32px; font-family: &#039;courier new&#039;, courier, monospace; font-size: 12px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; &quot;&gt;&lt;br&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/div&gt;</description>
			<category>프로그래밍</category>
			<category>deploy</category>
			<category>deploytool</category>
			<category>공유라이브러리</category>
			<category>매틀랩</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/434</guid>
			<comments>http://superkkt.com/434#entry434comment</comments>
			<pubDate>Tue, 01 Dec 2009 17:22:12 +0900</pubDate>
		</item>
		<item>
			<title>삼성 넷북에 우분투 넷북 리믹스 설치</title>
			<link>http://superkkt.com/429</link>
			<description>N140 모델에 우분투 넷북 리믹스를 설치했는데 리얼텍 무선랜이 안잡힌다. 그래서 ndiswrapper를 설치해서 윈도우 XP용 리얼텍 드라이브를 설치해서 무선랜을 사용해야 한다.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;1. ndiswrapper 설치&lt;/div&gt;&lt;div&gt;2. 삼성 웹사이트에서 N140 윈도우 XP 리얼텍 무선랜 드라이버 다운로드&lt;/div&gt;&lt;div&gt;3. 드라이버 설치 (sudo ndiswarpper -i net819xp.inf)&lt;/div&gt;&lt;div&gt;4. wlan0 alias 생성 (sudo ndiswrapper -ma)&lt;/div&gt;&lt;div&gt;5. 모듈 로딩 (sudo depmod -a; sudo modprobe ndiswrapper) &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;참조: &lt;/div&gt;&lt;div&gt;http://forum-en.msi.com/index.php?topic=128268.0&lt;/div&gt;&lt;div&gt;https://help.ubuntu.com/community/WifiDocs/Driver/Ndiswrapper&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;</description>
			<category>컴퓨터</category>
			<category>N140</category>
			<category>ndiswrapper</category>
			<category>wireless</category>
			<category>wlan</category>
			<category>XP</category>
			<category>넷북</category>
			<category>무선랜</category>
			<category>삼성</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/429</guid>
			<comments>http://superkkt.com/429#entry429comment</comments>
			<pubDate>Mon, 23 Nov 2009 13:23:29 +0900</pubDate>
		</item>
		<item>
			<title>Unix MD5 Shadow Password</title>
			<link>http://superkkt.com/424</link>
			<description>/etc/shadow 파일에 MD5 알고리즘으로 hashing 되어 저장된 패스워드는 다음과 같이 3개의 부분으로 구성되어 있다.&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;$&lt;b&gt;&lt;i&gt;ID&lt;/i&gt;&lt;/b&gt;$&lt;b&gt;&lt;i&gt;SALT&lt;/i&gt;&lt;/b&gt;$&lt;b&gt;&lt;i&gt;PASSWORD&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;먼저 ID는 encryption method를 의미하는데 MD5는 1이다. 그리고 SALT는 패스워드를 암호화하는 데 첨가되는 내용인데, 같은 패스워드 스트링이라고 하더라도 SALT 값이 다르면 hash 결과가 다르게 나오도록 하는 용도이다. 따라서 shadow 파일을 사용해서 인증할 때는 반드시 SALT 값을 알아야 한다. 마지막 PASSWORD 부분은 암호화된 22개의 문자열이 위치한다.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;간단하게 암호를 생성해보는 방법은 다음과 같다. &lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;padding:10px; background-color:#E4E4E4&quot;&gt;# openssl passwd -1 -salt 52g0al3p yourpasswd&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;더 자세한 내용은 &amp;nbsp;crypt(3)을 참조한다.&lt;/div&gt;</description>
			<category>컴퓨터</category>
			<category>crypt</category>
			<category>encrypt</category>
			<category>Hash</category>
			<category>LINUX</category>
			<category>MD5</category>
			<category>passwd</category>
			<category>password</category>
			<category>salt</category>
			<category>shadow</category>
			<category>UNIX</category>
			<author>(김기태)</author>
			<guid>http://superkkt.com/424</guid>
			<comments>http://superkkt.com/424#entry424comment</comments>
			<pubDate>Thu, 05 Nov 2009 12:53:15 +0900</pubDate>
		</item>
	</channel>
</rss>
