<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>增强视觉 &#124; 计算机视觉 增强现实 &#187; 练习</title>
	<atom:link href="http://www.cvchina.info/category/selftrain/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cvchina.info</link>
	<description>计算机视觉，增强现实最新资讯</description>
	<lastBuildDate>Mon, 06 Feb 2012 06:34:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>ORB Test</title>
		<link>http://www.cvchina.info/2011/09/25/orb-test/</link>
		<comments>http://www.cvchina.info/2011/09/25/orb-test/#comments</comments>
		<pubDate>Sun, 25 Sep 2011 07:00:25 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[练习]]></category>
		<category><![CDATA[hamming]]></category>
		<category><![CDATA[homography]]></category>
		<category><![CDATA[lsh]]></category>
		<category><![CDATA[opencv2.3]]></category>
		<category><![CDATA[orb]]></category>
		<category><![CDATA[单应矩阵]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=3036</guid>
		<description><![CDATA[之前介绍了ORB，一种具备旋转不变形的局部特征描述子。OpenCV2.3中提供了实现，但是缺少使用例程。下面是一个简单的样例程序。 随便拍了两张图片作为测试图像。 下面上下两图分别为模板图像和查询图像： 提取左右图特征： [cpp toolbar="true"] Mat img1 = imread(image_filename1, 0); Mat img2 = imread(image_filename2, 0); //GaussianBlur(img1, img1, Size(5, 5), 0); //GaussianBlur(img2, img2, Size(5, 5), 0); ORB orb1(3000, ORB::CommonParams(1.2, 8)); ORB orb2(100, ORB::CommonParams(1.2, 1)); vector keys1, keys2; Mat descriptors1, descriptors2; orb1(img1, Mat(), keys1, descriptors1, false); printf(&#8220;tem feat num: %d\n&#8221;, keys1.size()); int64 st, et; st = [...]]]></description>
			<content:encoded><![CDATA[<p>之前介绍了<a href="http://www.cvchina.info/2011/07/04/whats-orb/" target="_blank">ORB</a>，一种具备旋转不变形的局部特征描述子。OpenCV2.3中提供了实现，但是缺少使用例程。下面是一个简单的样例程序。</p>
<p>随便拍了两张图片作为测试图像。</p>
<p>下面上下两图分别为模板图像和查询图像：</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_1.png"><img class="aligncenter size-full wp-image-3040" title="apple_vinegar_1" src="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_1.png" alt="" width="240" height="320" /></a></p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_1.png"></a><span id="more-3036"></span><br />
<a href="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_2.png"><img class="aligncenter size-full wp-image-3040" title="apple_vinegar_2" src="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_2.png" alt="" width="240" height="320" /></a></p>
<h3>提取左右图特征：</h3>
<p>[cpp toolbar="true"]<br />
Mat img1 = imread(image_filename1, 0);<br />
Mat img2 = imread(image_filename2, 0);<br />
//GaussianBlur(img1, img1, Size(5, 5), 0);<br />
//GaussianBlur(img2, img2, Size(5, 5), 0);</p>
<p><a href="http://www.cvchina.info/tag/orb/" class="st_tag internal_tag" rel="tag" title="标签 orb 下的日志">ORB</a> orb1(3000, <a href="http://www.cvchina.info/tag/orb/" class="st_tag internal_tag" rel="tag" title="标签 orb 下的日志">ORB</a>::CommonParams(1.2, 8));<br />
ORB orb2(100, ORB::CommonParams(1.2, 1));</p>
<p>vector keys1, keys2;<br />
Mat descriptors1, descriptors2;</p>
<p>orb1(img1, Mat(), keys1, descriptors1, false);<br />
printf(&#8220;tem feat num: %d\n&#8221;, keys1.size());</p>
<p>int64 st, et;<br />
st = cvGetTickCount();<br />
orb2(img2, Mat(), keys2, descriptors2, false);<br />
et = cvGetTickCount();<br />
printf(&#8220;orb2 extraction time: %f\n&#8221;, (et-st)/(double)cvGetTickFrequency()/1000.);<br />
printf(&#8220;query feat num: %d\n&#8221;, keys2.size());<br />
[/cpp]</p>
<p>注：模板图像在多尺度提取特征，查询图像只在提取原始尺度上的特征。</p>
<h3>
做穷举式的最近邻检索：</h3>
<p>[cpp toolbar="true"]<br />
// find matches<br />
vector matches;</p>
<p>st = cvGetTickCount();<br />
//for(int i = 0; i &lt; 10; i++){<br />
naive_nn_search2(keys1, descriptors1, keys2, descriptors2, matches);<br />
//}<br />
et = cvGetTickCount();</p>
<p>printf(&#8220;match time: %f\n&#8221;, (et-st)/(double)cvGetTickFrequency()/1000.);<br />
printf(&#8220;matchs num: %d\n&#8221;, matches.size());<br />
[/cpp]<br />
hamming距离测算通过查找表实现：<br />
[cpp toolbar="true"]<br />
unsigned int hamdist2(unsigned char* a, unsigned char* b, size_t size)<br />
{<br />
HammingLUT lut;</p>
<p>unsigned int result;<br />
result = lut((a), (b), size);<br />
return result;<br />
}<br />
[/cpp]</p>
<h3>
绘图：</h3>
<p>[cpp toolbar="true"]<br />
Mat showImg;<br />
drawMatches(img2, keys2, img1, keys1, matches, showImg, CV_RGB(0, 255, 0), CV_RGB(0, 0, 255));<br />
string winName = &#8220;Matches&#8221;;<br />
namedWindow( winName, WINDOW_AUTOSIZE );<br />
imshow( winName, showImg );<br />
waitKey();<br />
[/cpp]</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_matches.png"><img class="aligncenter size-full wp-image-3039" title="apple_vinegar_matches" src="http://www.cvchina.info/wp-content/uploads/2011/09/apple_vinegar_matches.png" alt="" width="499" height="366" /></a></p>
<h3>估计单应矩阵，计算重投影误差：</h3>
<p>[cpp toolbar="true"]<br />
Mat homo;</p>
<p>st = cvGetTickCount();<br />
homo = findHomography(pt1, pt2, Mat(), CV_RANSAC, 5);<br />
et = cvGetTickCount();<br />
printf(&#8220;ransac time: %f\n&#8221;, (et-st)/(double)cvGetTickFrequency()/1000.);</p>
<p>printf(&#8220;homo\n&#8221;<br />
&#8220;%f %f %f\n&#8221;<br />
&#8220;%f %f %f\n&#8221;<br />
&#8220;%f %f %f\n&#8221;,<br />
homo.at(0,0), homo.at(0,1), homo.at(0,2),<br />
homo.at(1,0), homo.at(1,1), homo.at(1,2),<br />
homo.at(2,0),homo.at(2,1),homo.at(2,2));</p>
<p>vector<br />
reproj;<br />
reproj.resize(pt1.size());</p>
<p>perspectiveTransform(pt1, reproj, homo);</p>
<p>Mat diff;<br />
diff = Mat(reproj) &#8211; Mat(pt2);</p>
<p>int inlier = 0;<br />
double err_sum = 0;<br />
for(int i = 0; i &lt; diff.rows; i++){<br />
float* ptr = diff.ptr(i);<br />
float err = ptr[0]*ptr[0] + ptr[1]*ptr[1];<br />
if(err &lt; 25.f){<br />
inlier++;<br />
err_sum += sqrt(err);<br />
}<br />
}<br />
printf(&#8220;inlier num: %d\n&#8221;, inlier);<br />
printf(&#8220;ratio %f\n&#8221;, inlier / (float)(diff.rows));<br />
printf(&#8220;mean reprojection error: %f\n&#8221;, err_sum / inlier);<br />
[/cpp]</p>
<h3>
结果分析：</h3>
<blockquote><p>tem feat num: 743<br />
orb2 extraction time: 1.672435<br />
query feat num: 100<br />
match time: 3.698276<br />
matchs num: 8<br />
ransac time: 143.570586<br />
homo<br />
0.974942 0.410833 4.426035<br />
-0.182418 0.828115 52.742661<br />
0.001191 0.000144 1.000000<br />
inlier num: 8<br />
ratio 1.000000<br />
mean reprojection error: 0.976777</p></blockquote>
<p>可见最近邻检索是系统的瓶颈，（进行了743*100次hamming距离（32bytes）计算。）一个简单的优化如下，分段计算hamming距离，先计算前16byte的hamming距离，如超过某一阈值，则直接认为非候选，如小于某阈值，则继续进行后一半16bytes的距离计算。（粗略估计可以减少30%+的最近邻查询时间）。更复杂的办法是使用LSH，此处按下不提，有空再续。</p>
<h3>完整代码如下：</h3>
<p>[cpp toolbar="true"]<br />
#include &#8220;opencv2/objdetect/objdetect.hpp&#8221;<br />
#include &#8220;opencv2/features2d/features2d.hpp&#8221;<br />
#include &#8220;opencv2/highgui/highgui.hpp&#8221;<br />
#include &#8220;opencv2/calib3d/calib3d.hpp&#8221;<br />
#include &#8220;opencv2/imgproc/imgproc_c.h&#8221;<br />
#include &#8220;opencv2/imgproc/imgproc.hpp&#8221;</p>
<p>#include<br />
#include<br />
#include</p>
<p>using namespace std;<br />
using namespace cv;</p>
<p>char* image_filename1 = &#8220;apple_vinegar_0.png&#8221;;<br />
char* image_filename2 = &#8220;apple_vinegar_2.png&#8221;;</p>
<p>unsigned int hamdist(unsigned int x, unsigned int y)<br />
{<br />
unsigned int dist = 0, val = x ^ y;</p>
<p>// Count the number of set bits<br />
while(val)<br />
{<br />
++dist;<br />
val &amp;= val &#8211; 1;<br />
}</p>
<p>return dist;<br />
}</p>
<p>unsigned int hamdist2(unsigned char* a, unsigned char* b, size_t size)<br />
{<br />
HammingLUT lut;</p>
<p>unsigned int result;<br />
result = lut((a), (b), size);<br />
return result;<br />
}</p>
<p>void naive_nn_search(vector&amp; keys1, Mat&amp; descp1,<br />
vector&amp; keys2, Mat&amp; descp2,<br />
vector&amp; matches)<br />
{<br />
for( int i = 0; i &lt; (int)keys2.size(); i++){<br />
unsigned int min_dist = INT_MAX;<br />
int min_idx = -1;<br />
unsigned char* query_feat = descp2.ptr(i);<br />
for( int j = 0; j &lt; (int)keys1.size(); j++){<br />
unsigned char* train_feat = descp1.ptr(j);<br />
unsigned int dist =  hamdist2(query_feat, train_feat, 32);</p>
<p>if(dist &lt; min_dist){<br />
min_dist = dist;<br />
min_idx = j;<br />
}<br />
}</p>
<p>//if(min_dist &lt;= (unsigned int)(second_dist * 0.8)){<br />
if(min_dist &lt;= 50){<br />
matches.push_back(DMatch(i, min_idx, 0, (float)min_dist));<br />
}<br />
}<br />
}</p>
<p>void naive_nn_search2(vector&amp; keys1, Mat&amp; descp1,<br />
vector&amp; keys2, Mat&amp; descp2,<br />
vector&amp; matches)<br />
{<br />
for( int i = 0; i &lt; (int)keys2.size(); i++){<br />
unsigned int min_dist = INT_MAX;<br />
unsigned int sec_dist = INT_MAX;<br />
int min_idx = -1, sec_idx = -1;<br />
unsigned char* query_feat = descp2.ptr(i);<br />
for( int j = 0; j &lt; (int)keys1.size(); j++){<br />
unsigned char* train_feat = descp1.ptr(j);<br />
unsigned int dist =  hamdist2(query_feat, train_feat, 32);</p>
<p>if(dist &lt; min_dist){<br />
sec_dist = min_dist;<br />
sec_idx = min_idx;<br />
min_dist = dist;<br />
min_idx = j;<br />
}else if(dist &lt; sec_dist){<br />
sec_dist = dist;<br />
sec_idx = j;<br />
}<br />
}</p>
<p>if(min_dist &lt;= (unsigned int)(sec_dist * 0.8) &amp;&amp; min_dist &lt;=50){<br />
//if(min_dist &lt;= 50){<br />
matches.push_back(DMatch(i, min_idx, 0, (float)min_dist));<br />
}<br />
}<br />
}</p>
<p>int main(int argc, char* argv[])<br />
{<br />
Mat img1 = imread(image_filename1, 0);<br />
Mat img2 = imread(image_filename2, 0);<br />
//GaussianBlur(img1, img1, Size(5, 5), 0);<br />
//GaussianBlur(img2, img2, Size(5, 5), 0);</p>
<p>ORB orb1(3000, ORB::CommonParams(1.2, 8));<br />
ORB orb2(100, ORB::CommonParams(1.2, 1));</p>
<p>vector keys1, keys2;<br />
Mat descriptors1, descriptors2;</p>
<p>orb1(img1, Mat(), keys1, descriptors1, false);<br />
printf(&#8220;tem feat num: %d\n&#8221;, keys1.size());</p>
<p>int64 st, et;<br />
st = cvGetTickCount();<br />
orb2(img2, Mat(), keys2, descriptors2, false);<br />
et = cvGetTickCount();<br />
printf(&#8220;orb2 extraction time: %f\n&#8221;, (et-st)/(double)cvGetTickFrequency()/1000.);<br />
printf(&#8220;query feat num: %d\n&#8221;, keys2.size());</p>
<p>// find matches<br />
vector matches;</p>
<p>st = cvGetTickCount();<br />
//for(int i = 0; i &lt; 10; i++){<br />
naive_nn_search2(keys1, descriptors1, keys2, descriptors2, matches);<br />
//}<br />
et = cvGetTickCount();</p>
<p>printf(&#8220;match time: %f\n&#8221;, (et-st)/(double)cvGetTickFrequency()/1000.);<br />
printf(&#8220;matchs num: %d\n&#8221;, matches.size());</p>
<p>Mat showImg;<br />
drawMatches(img2, keys2, img1, keys1, matches, showImg, CV_RGB(0, 255, 0), CV_RGB(0, 0, 255));<br />
string winName = &#8220;Matches&#8221;;<br />
namedWindow( winName, WINDOW_AUTOSIZE );<br />
imshow( winName, showImg );<br />
waitKey();</p>
<p>vector<br />
pt1;<br />
vector<br />
pt2;</p>
<p>for(int i = 0; i &lt; (int)matches.size(); i++){<br />
pt1.push_back(Point2f(keys2[matches[i].queryIdx].pt.x, keys2[matches[i].queryIdx].pt.y));</p>
<p>pt2.push_back(Point2f(keys1[matches[i].trainIdx].pt.x, keys1[matches[i].trainIdx].pt.y));<br />
}</p>
<p>Mat homo;</p>
<p>st = cvGetTickCount();<br />
homo = findHomography(pt1, pt2, Mat(), CV_RANSAC, 5);<br />
et = cvGetTickCount();<br />
printf(&#8220;ransac time: %f\n&#8221;, (et-st)/(double)cvGetTickFrequency()/1000.);</p>
<p>printf(&#8220;homo\n&#8221;<br />
&#8220;%f %f %f\n&#8221;<br />
&#8220;%f %f %f\n&#8221;<br />
&#8220;%f %f %f\n&#8221;,<br />
homo.at(0,0), homo.at(0,1), homo.at(0,2),<br />
homo.at(1,0), homo.at(1,1), homo.at(1,2),<br />
homo.at(2,0),homo.at(2,1),homo.at(2,2));</p>
<p>vector<br />
reproj;<br />
reproj.resize(pt1.size());</p>
<p>perspectiveTransform(pt1, reproj, homo);</p>
<p>Mat diff;<br />
diff = Mat(reproj) &#8211; Mat(pt2);</p>
<p>int inlier = 0;<br />
double err_sum = 0;<br />
for(int i = 0; i &lt; diff.rows; i++){<br />
float* ptr = diff.ptr(i);<br />
float err = ptr[0]*ptr[0] + ptr[1]*ptr[1];<br />
if(err &lt; 25.f){<br />
inlier++;<br />
err_sum += sqrt(err);<br />
}<br />
}<br />
printf(&#8220;inlier num: %d\n&#8221;, inlier);<br />
printf(&#8220;ratio %f\n&#8221;, inlier / (float)(diff.rows));<br />
printf(&#8220;mean reprojection error: %f\n&#8221;, err_sum / inlier);</p>
<p>return 0;<br />
}</p>
<p>[/cpp]</p>

	Tags: <a href="http://www.cvchina.info/tag/hamming/" title="hamming" rel="tag">hamming</a>, <a href="http://www.cvchina.info/tag/homography/" title="homography" rel="tag">homography</a>, <a href="http://www.cvchina.info/tag/lsh/" title="lsh" rel="tag">lsh</a>, <a href="http://www.cvchina.info/tag/opencv2-3/" title="opencv2.3" rel="tag">opencv2.3</a>, <a href="http://www.cvchina.info/tag/orb/" title="orb" rel="tag">orb</a>, <a href="http://www.cvchina.info/tag/%e5%8d%95%e5%ba%94%e7%9f%a9%e9%98%b5/" title="单应矩阵" rel="tag">单应矩阵</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2011/09/25/orb-test/feed/</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>快速双线性插值</title>
		<link>http://www.cvchina.info/2011/04/19/bilinear-interpolation/</link>
		<comments>http://www.cvchina.info/2011/04/19/bilinear-interpolation/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 08:21:00 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[bilinear interpolation]]></category>
		<category><![CDATA[双线性插值]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=2627</guid>
		<description><![CDATA[图像缩放是最常用的图像操作，最近实现了一次双线性插值，适用于单通道8位灰度图像，可以同时处理缩小，放大。 加速手段有三个： 1：使用可分离方式，先后处理行和列 2：构建缓冲区，以避免对某些行重复插值。 3：使用整形运算，避免浮点运算。 performace: 测试图像： C:\Documents and Settings\All Users\Documents\My Pictures\示例图片\Water lilies.jpg scale _ieInterpImageBilinear8UC1（ms） cvResize（ms） ratio 0.3 346 390 89% 0.5 939 1047 90% 0.8 1671 1507 110% 1.2 2885 1943 148% 1.5 3951 2678 150% 2 6119 3642 170% 上表都是执行1000次的总时间，可以看出，在缩小时速度比opencv的cvResize相当，在放大时，不幸的比cvResize慢上50%。贴出代码求解。 [cpp toolbar="true"] typedef struct _Image{ int w; int h; int c; int step; [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img class="aligncenter" src="http://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Bilinear_interpolation.png/220px-Bilinear_interpolation.png" alt="" /></p>
<p>图像缩放是最常用的图像操作，最近实现了一次<a href="http://en.wikipedia.org/wiki/Bilinear_interpolation" target="_blank">双线性插值</a>，适用于单通道8位灰度图像，可以同时处理缩小，放大。</p>
<p>加速手段有三个：</p>
<p>1：使用可分离方式，先后处理行和列</p>
<p>2：构建缓冲区，以避免对某些行重复插值。</p>
<p>3：使用整形运算，避免浮点运算。</p>
<p>performace:</p>
<p>测试图像： C:\Documents and Settings\All Users\Documents\My Pictures\示例图片\Water lilies.jpg</p>
<table class="MsoTableGrid" style="border-collapse: collapse; border: none; mso-border-alt: solid windowtext .5pt; mso-yfti-tbllook: 1184; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt;" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">scale</span></p>
</td>
<td style="width: 227.0pt; border: solid windowtext 1.0pt; border-left: none; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">_ieInterpImageBilinear8UC1</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">（</span><span lang="EN-US">ms</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">）</span></p>
</td>
<td style="width: 98.0pt; border: solid windowtext 1.0pt; border-left: none; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">cvResize</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">（</span><span lang="EN-US">ms</span><span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin;">）</span></p>
</td>
<td style="width: 98.0pt; border: solid windowtext 1.0pt; border-left: none; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">ratio</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; border-top: none; mso-border-top-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">0.3</span></p>
</td>
<td style="width: 227.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">346</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">390</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">89%</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; border-top: none; mso-border-top-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">0.5</span></p>
</td>
<td style="width: 227.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">939</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">1047</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">90%</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; border-top: none; mso-border-top-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">0.8</span></p>
</td>
<td style="width: 227.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">1671</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">1507</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">110%</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 4; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; border-top: none; mso-border-top-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">1.2</span></p>
</td>
<td style="width: 227.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">2885</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">1943</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">148%</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 5; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; border-top: none; mso-border-top-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">1.5</span></p>
</td>
<td style="width: 227.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">3951</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">2678</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">150%</span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes; height: 13.5pt;">
<td style="width: 54.0pt; border: solid windowtext 1.0pt; border-top: none; mso-border-top-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="72" valign="top">
<p class="MsoNormal"><span lang="EN-US">2</span></p>
</td>
<td style="width: 227.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="303" valign="top">
<p class="MsoNormal"><span lang="EN-US">6119</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">3642</span></p>
</td>
<td style="width: 98.0pt; border-top: none; border-left: none; border-bottom: solid windowtext 1.0pt; border-right: solid windowtext 1.0pt; mso-border-top-alt: solid windowtext .5pt; mso-border-left-alt: solid windowtext .5pt; mso-border-alt: solid windowtext .5pt; padding: 0cm 5.4pt 0cm 5.4pt; height: 13.5pt;" width="131" valign="top">
<p class="MsoNormal"><span lang="EN-US">170%</span></p>
</td>
</tr>
</tbody>
</table>
<p>上表都是执行1000次的总时间，可以看出，在缩小时速度比opencv的cvResize相当，在放大时，不幸的比cvResize慢上50%。贴出代码求解。</p>
<p><span id="more-2627"></span></p>
<p>[cpp toolbar="true"]<br />
typedef struct _Image{<br />
    int w;<br />
    int h;<br />
    int c;<br />
    int step;<br />
    int type;<br />
    void* data;<br />
} Image;</p>
<p>static void _ieInterpImageBilinear8UC1_RowFilter(unsigned char* src, long* dst, int len, int* leftIdx, int* rightIdx, long* weight, int shift)<br />
{<br />
    int i, j;<br />
    for(i = 0, j = 1; i < len - 2; i+=2, j+=2){<br />
        dst[i] = ((1<<shift) - weight[i])*src[leftIdx[i]] + weight[i]*src[rightIdx[i]];<br />
        dst[j] = ((1<<shift) - weight[j])*src[leftIdx[j]] + weight[j]*src[rightIdx[j]];</p>
<p>    }<br />
    for( ; j < len; j++){<br />
        dst[j] = ((1<<shift) - weight[j])*src[leftIdx[j]] + weight[j]*src[rightIdx[j]];<br />
    }<br />
}</p>
<p>static void _ieInterpImageBilinear8UC1(Image* src, Image* dst)<br />
{<br />
    int i, j;<br />
    int sw, sh, sstep;<br />
    int dw, dh, dstep;<br />
    unsigned char *sdata, *ddata;<br />
    float horScaleRatio, verScaleRatio;<br />
    long *rowBuf1, *rowBuf2;<br />
    long *upLinePtr, *downLinePtr, *tempPtr;<br />
    long *horWeight;<br />
    int *horLeftIdx, *horRightIdx;<br />
    int preVerUpIdx, preVerDownIdx;<br />
    int shift = 8;</p>
<p>    sw = src->w; sh = src->h; sstep = src->step; sdata = (unsigned char*)(src->data);<br />
    dw = dst->w; dh = dst->h; dstep = dst->step; ddata = (unsigned char*)(dst->data);</p>
<p>    horScaleRatio = sw / (float)(dw);<br />
    verScaleRatio = sh / (float)(dh);</p>
<p>    rowBuf1 = new long[dw];<br />
    rowBuf2 = new long[dw];<br />
    horWeight = new long[dw];<br />
    horLeftIdx = new int[dw];<br />
    horRightIdx = new int[dw];</p>
<p>    //col interpolation<br />
    //计算目标图像像素横向的左右邻居序号，和权重。<br />
    for(i = 0; i < dw; i++){<br />
        float pos = (i + 0.5f) * horScaleRatio;<br />
        horLeftIdx[i] = (int)(IET_MAX(pos - 0.5f, 0));<br />
        horRightIdx[i] = (int)(IET_MIN(pos + 0.5f, sw-1));<br />
        horWeight[i] = (long) (fabs(pos - 0.5f - horLeftIdx[i]) * (1<<shift));<br />
    }</p>
<p>    preVerUpIdx = -1;<br />
    preVerDownIdx = -1;<br />
    upLinePtr = rowBuf1;<br />
    downLinePtr = rowBuf2;<br />
    for(j = 0; j < dh; j++){<br />
        float pos = (j + 0.5f) * verScaleRatio;<br />
        int verUpIdx = (int)(IET_MAX(pos - 0.5f, 0));<br />
        int verDownIdx = (int)(IET_MIN(pos + 0.5f, sh-1));<br />
        long verWeight = (long) (fabs(pos - 0.5f - verUpIdx) * (1<<shift));</p>
<p>        if(verUpIdx == preVerUpIdx &#038;&#038; verDownIdx == preVerDownIdx){<br />
            ;//do nothing<br />
        }<br />
        else if(verUpIdx == preVerDownIdx){<br />
            IET_SWAP(upLinePtr, downLinePtr, tempPtr);<br />
            _ieInterpImageBilinear8UC1_RowFilter(sdata + sstep*verDownIdx, downLinePtr, dw, horLeftIdx, horRightIdx, horWeight, shift);<br />
        }else{<br />
            _ieInterpImageBilinear8UC1_RowFilter(sdata + sstep*verUpIdx,   upLinePtr, dw, horLeftIdx, horRightIdx, horWeight, shift);<br />
            _ieInterpImageBilinear8UC1_RowFilter(sdata + sstep*verDownIdx, downLinePtr, dw, horLeftIdx, horRightIdx, horWeight, shift);<br />
        }        </p>
<p>        for(i = 0; i < dw; i++){<br />
            ddata[dstep*j + i] = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i] + verWeight*downLinePtr[i]) >> (2*shift) );<br />
        }<br />
        preVerUpIdx = verUpIdx;<br />
        preVerDownIdx = verDownIdx;<br />
    }<br />
    delete []rowBuf1;<br />
    delete []rowBuf2;<br />
    delete []horWeight;<br />
    delete []horLeftIdx;<br />
    delete []horRightIdx;<br />
}<br />
[/cpp]</p>
<p>使用神奇的四次展开循环，速度提升15%+。<br />
code如下。<br />
[cpp toobar="true"]<br />
static void _ieInterpImageBilinear8UC1_Ver3_RowFilter(unsigned char* src, long* dst, int len, int* leftIdx, int* rightIdx, long* weight, int shift)<br />
{<br />
    int i;<br />
    for(i = 0; i < len - 4; i+=4){<br />
        *dst++ = ((1<<shift) - weight[i])*src[leftIdx[i]] + weight[i]*src[rightIdx[i]];<br />
        *dst++ = ((1<<shift) - weight[i+1])*src[leftIdx[i+1]] + weight[i+1]*src[rightIdx[i+1]];<br />
        *dst++ = ((1<<shift) - weight[i+2])*src[leftIdx[i+2]] + weight[i+2]*src[rightIdx[i+2]];<br />
        *dst++ = ((1<<shift) - weight[i+3])*src[leftIdx[i+3]] + weight[i+3]*src[rightIdx[i+3]];</p>
<p>    }<br />
    for( ; i < len; ++i){<br />
        *dst++ = ((1<<shift) - weight[i])*src[leftIdx[i]] + weight[i]*src[rightIdx[i]];<br />
    }<br />
}</p>
<p>static void _ieInterpImageBilinear8UC1_Ver3(Image* src, Image* dst)<br />
{<br />
    int i, j;<br />
    int sw, sh, sstep;<br />
    int dw, dh, dstep;<br />
    unsigned char *sdata, *ddata;<br />
    float horScaleRatio, verScaleRatio;<br />
    long *rowBuf1, *rowBuf2;<br />
    long *upLinePtr, *downLinePtr, *tempPtr;<br />
    long *horWeight;<br />
    int *horLeftIdx, *horRightIdx;<br />
    int preVerUpIdx, preVerDownIdx;<br />
    int shift = 8;</p>
<p>    sw = src->w; sh = src->h; sstep = src->step; sdata = (unsigned char*)(src->data);<br />
    dw = dst->w; dh = dst->h; dstep = dst->step; ddata = (unsigned char*)(dst->data);</p>
<p>    horScaleRatio = sw / (float)(dw);<br />
    verScaleRatio = sh / (float)(dh);</p>
<p>    rowBuf1 = new long[dw];<br />
    rowBuf2 = new long[dw];<br />
    horWeight = new long[dw];<br />
    horLeftIdx = new int[dw];<br />
    horRightIdx = new int[dw];</p>
<p>    //col interpolation<br />
    //计算目标图像像素横向的左右邻居序号，和权重。<br />
    for(i = 0; i < dw; i++){<br />
        float pos = (i + 0.5f) * horScaleRatio;<br />
        horLeftIdx[i] = (int)(IET_MAX(pos - 0.5f, 0));<br />
        horRightIdx[i] = (int)(IET_MIN(pos + 0.5f, sw-1));<br />
        horWeight[i] = (long) (fabs(pos - 0.5f - horLeftIdx[i]) * (1<<shift));<br />
    }</p>
<p>    preVerUpIdx = -1;<br />
    preVerDownIdx = -1;<br />
    upLinePtr = rowBuf1;<br />
    downLinePtr = rowBuf2;<br />
    for(j = 0; j < dh; j++){<br />
        float pos = (j + 0.5f) * verScaleRatio;<br />
        int verUpIdx = (int)(IET_MAX(pos - 0.5f, 0));<br />
        int verDownIdx = (int)(IET_MIN(pos + 0.5f, sh-1));<br />
        long verWeight = (long) (fabs(pos - 0.5f - verUpIdx) * (1<<shift));</p>
<p>        if(verUpIdx == preVerUpIdx &#038;&#038; verDownIdx == preVerDownIdx){<br />
            ;//do nothing<br />
        }<br />
        else if(verUpIdx == preVerDownIdx){<br />
            IET_SWAP(upLinePtr, downLinePtr, tempPtr);<br />
            _ieInterpImageBilinear8UC1_Ver3_RowFilter(sdata + sstep*verDownIdx, downLinePtr, dw, horLeftIdx, horRightIdx, horWeight, shift);<br />
        }else{<br />
            _ieInterpImageBilinear8UC1_Ver3_RowFilter(sdata + sstep*verUpIdx,   upLinePtr, dw, horLeftIdx, horRightIdx, horWeight, shift);<br />
            _ieInterpImageBilinear8UC1_Ver3_RowFilter(sdata + sstep*verDownIdx, downLinePtr, dw, horLeftIdx, horRightIdx, horWeight, shift);<br />
        }        </p>
<p>        unsigned char* _ptr = ddata + dstep*j;<br />
        for(i = 0; i < dw-4; i+=4){<br />
            *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i] + verWeight*downLinePtr[i]) >> (2*shift) );<br />
            *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i+1] + verWeight*downLinePtr[i+1]) >> (2*shift) );<br />
            *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i+2] + verWeight*downLinePtr[i+2]) >> (2*shift) );<br />
            *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i+3] + verWeight*downLinePtr[i+3]) >> (2*shift) );<br />
        }<br />
        for(; i < dw; i++){<br />
            *_ptr++ = (unsigned char) ( (((1<<shift) - verWeight)*upLinePtr[i] + verWeight*downLinePtr[i]) >> (2*shift) );<br />
        }<br />
        preVerUpIdx = verUpIdx;<br />
        preVerDownIdx = verDownIdx;<br />
    }<br />
    delete []rowBuf1;<br />
    delete []rowBuf2;<br />
    delete []horWeight;<br />
    delete []horLeftIdx;<br />
    delete []horRightIdx;<br />
}<br />
[/cpp]</p>

	Tags: <a href="http://www.cvchina.info/tag/bilinear-interpolation/" title="bilinear interpolation" rel="tag">bilinear interpolation</a>, <a href="http://www.cvchina.info/tag/%e5%8f%8c%e7%ba%bf%e6%80%a7%e6%8f%92%e5%80%bc/" title="双线性插值" rel="tag">双线性插值</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2011/04/19/bilinear-interpolation/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>VolksWagen logo detection</title>
		<link>http://www.cvchina.info/2011/03/24/volkswagen-logo-detection/</link>
		<comments>http://www.cvchina.info/2011/03/24/volkswagen-logo-detection/#comments</comments>
		<pubDate>Thu, 24 Mar 2011 08:50:36 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[logo detection]]></category>
		<category><![CDATA[volkswagen]]></category>
		<category><![CDATA[商标监测]]></category>
		<category><![CDATA[大众车标]]></category>
		<category><![CDATA[物体检测]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=2512</guid>
		<description><![CDATA[闲来做了下logo检测，拿大众车标测试： intel core2 2.8G，320&#215;240的图像，5ms每帧。 algorithm：类HoG Feature+SVM 更多效果图： Tags: logo detection, volkswagen, 商标监测, 大众车标, 新闻, 物体检测, 练习]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection.png"><img class="aligncenter size-full wp-image-2513" title="vw_logo_detection" src="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection.png" alt="logo detection" width="604" height="419" /></a></p>
<p>闲来做了下logo检测，拿大众车标测试：</p>
<p>intel core2 2.8G，320&#215;240的图像，<strong>5ms</strong>每帧。</p>
<p>algorithm：类HoG Feature+SVM</p>
<p>更多效果图：</p>
<p><span id="more-2512"></span></p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection2.png"><img class="aligncenter size-full wp-image-2514" title="vw_logo_detection2" src="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection2.png" alt="" width="507" height="533" /></a></p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection3.png"><img class="aligncenter size-full wp-image-2515" title="vw_logo_detection3" src="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection3.png" alt="" width="148" height="174" /></a></p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection4.png"><img class="aligncenter size-full wp-image-2516" title="vw_logo_detection4" src="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection4.png" alt="" width="607" height="813" /></a></p>
<p style="text-align: center;">
<p style="text-align: center;"><a href="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection6.png"><img class="aligncenter size-full wp-image-2518" title="vw_logo_detection6" src="http://www.cvchina.info/wp-content/uploads/2011/03/vw_logo_detection6.png" alt="" width="624" height="637" /></a></p>

	Tags: <a href="http://www.cvchina.info/tag/logo-detection/" title="logo detection" rel="tag">logo detection</a>, <a href="http://www.cvchina.info/tag/volkswagen/" title="volkswagen" rel="tag">volkswagen</a>, <a href="http://www.cvchina.info/tag/%e5%95%86%e6%a0%87%e7%9b%91%e6%b5%8b/" title="商标监测" rel="tag">商标监测</a>, <a href="http://www.cvchina.info/tag/%e5%a4%a7%e4%bc%97%e8%bd%a6%e6%a0%87/" title="大众车标" rel="tag">大众车标</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/tag/%e7%89%a9%e4%bd%93%e6%a3%80%e6%b5%8b/" title="物体检测" rel="tag">物体检测</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2011/03/24/volkswagen-logo-detection/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>pseudocolor generation</title>
		<link>http://www.cvchina.info/2010/11/22/pseudocolor/</link>
		<comments>http://www.cvchina.info/2010/11/22/pseudocolor/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 07:23:36 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[pseudocolor]]></category>
		<category><![CDATA[Szeliski]]></category>
		<category><![CDATA[伪彩色]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=2153</guid>
		<description><![CDATA[做图像处理经常需要可视化中间过程，伪彩色是常用的工具。以前都是手动指定几个颜色，今天看到computer vision：algorithm and application里面提到一种伪彩色生成办法，Szeliski描述如下： For each (non-negative) label value, consider the bits as being split among the three color channels, e.g., for a nine-bit value, the bits could be labeled RGBRGBRGB. After collecting each of the three color values, reverse the bits so that the low-order bits vary the most quickly. For each (non-negative) label [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cvchina.info/wp-content/uploads/2010/11/pseudocolor.png"><img class="aligncenter size-full wp-image-2155" title="pseudocolor" src="http://www.cvchina.info/wp-content/uploads/2010/11/pseudocolor.png" alt="" width="648" height="547" /></a></p>
<p>做图像处理经常需要可视化中间过程，伪彩色是常用的工具。以前都是手动指定几个颜色，今天看到computer vision：algorithm and application里面提到一种伪彩色生成办法，Szeliski描述如下：</p>
<blockquote>
<div id="_mcePaste">For each (non-negative) label value, consider the bits as being split among the three color</div>
<div id="_mcePaste">channels, e.g., for a nine-bit value, the bits could be labeled RGBRGBRGB. After collecting</div>
<div id="_mcePaste">each of the three color values, reverse the bits so that the low-order bits vary the most quickly.</div>
<p>For each (non-negative) label value, consider the bits as being split among the three colorchannels, e.g., for a nine-bit value, the bits could be labeled RGBRGBRGB. After collectingeach of the three color values, reverse the bits so that the low-order bits vary the most quickly.</p></blockquote>
<p>尝试实现了一下，code:</p>
<p><span id="more-2153"></span><br />
[cpp toolbar="true"]// <a href="http://www.cvchina.info/tag/pseudocolor/" class="st_tag internal_tag" rel="tag" title="标签 pseudocolor 下的日志">PseudoColor</a>.cpp : Defines the entry point for the console application.<br />
//</p>
<p>#include &#8220;stdafx.h&#8221;<br />
#include <stdio.h><br />
#include <stdlib.h><br />
#include <assert.h></p>
<p>#include &#8220;cxcore.h&#8221;<br />
#include &#8220;cv.h&#8221;<br />
#include &#8220;highgui.h&#8221;</p>
<p>#define DEFAULT_BITS_PER_CHANNLE 4<br />
#define BITS_TOTAL (3*BITS_PER_CHANNLE)</p>
<p>unsigned char* gen_pseudo_color_lut(int bit_per_channle)<br />
{<br />
	int bits_total = 3*bit_per_channle;<br />
	int color_num = 1 << bits_total;<br />
	unsigned char* lut = (unsigned char*) malloc(3*color_num*sizeof(unsigned char));<br />
	assert(bit_per_channle < 8);</p>
<p>	for(int c = 0; c < color_num; c++){<br />
		int r = 0;<br />
		int g = 0;<br />
		int b = 0;<br />
		for(int k = 0; k < bits_total; ){<br />
			b = (b << 1) + ((c >> k++) &#038; 1);<br />
			g = (g << 1) + ((c >> k++) &#038; 1);<br />
			r = (r << 1) + ((c >> k++) &#038; 1);<br />
		}<br />
		r = r << (8 &#8211; bit_per_channle);<br />
		g = g << (8 &#8211; bit_per_channle);<br />
		b = b << (8 &#8211; bit_per_channle);</p>
<p>		lut[3*c] = r; lut[3*c+1] = g; lut[3*c+2] = b;<br />
	}</p>
<p>	return lut;<br />
}</p>
<p>int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
	unsigned char* lut = gen_pseudo_color_lut(DEFAULT_BITS_PER_CHANNLE);<br />
	int color_num = 1 << (3*DEFAULT_BITS_PER_CHANNLE);</p>
<p>	FILE* fp = fopen(&#8220;lut.txt&#8221;, &#8220;wt&#8221;);<br />
	fprintf(fp, &#8220;static unsigned char[%d] = {&#8220;, color_num);<br />
	for(int c = 0; c < color_num; c++){<br />
		printf(&#8220;c = %d, (r,g,b) = (%d, %d, %d)\n&#8221;, c, lut[3*c], lut[3*c+1], lut[3*c+2]);</p>
<p>		if(c != color_num-1)<br />
			fprintf(fp, &#8220;%d, %d, %d, &#8220;, lut[3*c], lut[3*c+1], lut[3*c+2]);<br />
		else<br />
			fprintf(fp, &#8220;%d, %d, %d};\n&#8221;, lut[3*c], lut[3*c+1], lut[3*c+2]);<br />
	}<br />
	fclose(fp);</p>
<p>	//stripe show case.<br />
	int w = 640;<br />
	int h = 240;<br />
	IplImage* gray = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 1);<br />
	for(int y = 0; y < h; y++){<br />
		for(int x =0; x < w; x++){<br />
			CV_IMAGE_ELEM(gray, unsigned char, y, x) = x / 4;<br />
		}<br />
	}</p>
<p>	IplImage* color = cvCreateImage(cvSize(w, h), IPL_DEPTH_8U, 3);<br />
	for(int y = 0; y < h; y++){<br />
		for(int x = 0; x < w; x++){<br />
			int c = CV_IMAGE_ELEM(gray, unsigned char, y, x);<br />
			CV_IMAGE_ELEM(color, unsigned char, y, 3*x) = lut[3*c+2];//b<br />
			CV_IMAGE_ELEM(color, unsigned char, y, 3*x+1) = lut[3*c+1];//g<br />
			CV_IMAGE_ELEM(color, unsigned char, y, 3*x+2) = lut[3*c];//r<br />
		}<br />
	}</p>
<p>	cvNamedWindow(&#8220;gray&#8221;);<br />
	cvNamedWindow(&#8220;color&#8221;);<br />
	cvShowImage(&#8220;gray&#8221;, gray);<br />
	cvShowImage(&#8220;color&#8221;, color);<br />
	cvWaitKey(0);</p>
<p>	free(lut);<br />
	cvReleaseImage(&#038;gray);<br />
	cvReleaseImage(&#038;color);<br />
	return 0;<br />
}[/cpp]</p>

	Tags: <a href="http://www.cvchina.info/tag/pseudocolor/" title="pseudocolor" rel="tag">pseudocolor</a>, <a href="http://www.cvchina.info/tag/szeliski/" title="Szeliski" rel="tag">Szeliski</a>, <a href="http://www.cvchina.info/tag/%e4%bc%aa%e5%bd%a9%e8%89%b2/" title="伪彩色" rel="tag">伪彩色</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/11/22/pseudocolor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>无题</title>
		<link>http://www.cvchina.info/2010/06/20/make-it-fast/</link>
		<comments>http://www.cvchina.info/2010/06/20/make-it-fast/#comments</comments>
		<pubDate>Sun, 20 Jun 2010 14:33:46 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[illustrator]]></category>
		<category><![CDATA[make it fast]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=1295</guid>
		<description><![CDATA[读论文有感。 工具adobe illustrator CS5。 Tags: illustrator, make it fast, 新闻, 练习]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.cvchina.info/wp-content/uploads/2010/06/MakeItFast.png"><img class="aligncenter size-full wp-image-1296" title="MakeItFast" src="http://www.cvchina.info/wp-content/uploads/2010/06/MakeItFast.png" alt="" width="348" height="417" /></a><br />
读论文有感。<br />
工具adobe <a href="http://www.cvchina.info/tag/illustrator/" class="st_tag internal_tag" rel="tag" title="标签 illustrator 下的日志">illustrator</a> CS5。</p>

	Tags: <a href="http://www.cvchina.info/tag/illustrator/" title="illustrator" rel="tag">illustrator</a>, <a href="http://www.cvchina.info/tag/make-it-fast/" title="make it fast" rel="tag">make it fast</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/06/20/make-it-fast/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>莫干山M50</title>
		<link>http://www.cvchina.info/2010/06/16/moganshan-m50/</link>
		<comments>http://www.cvchina.info/2010/06/16/moganshan-m50/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 13:29:55 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[autostitch]]></category>
		<category><![CDATA[hugin]]></category>
		<category><![CDATA[万重浪]]></category>
		<category><![CDATA[全景拼接]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=1250</guid>
		<description><![CDATA[端午没事，去莫干山50号，晃了一圈。拍了几张图回来拼全景。工具是入门级的autostitch。。。哈哈。重装系统了，hugin不见了，就用autostitch随便拼一下。速度快，效果也不错。 下面一张不是全景图。照的是一个9屏的电影，万重浪（ten thousand waves)，9个屏，分别显示不同的视角，注意上面的白色投影仪。我去晚了，只看到了尾巴，没搞清楚放的什么玩意。。不过，号称艺术嘛，估计我就算看完整了，也一样搞不清楚放的什么玩意。额。。。 Tags: autostitch, hugin, 万重浪, 全景拼接, 新闻, 练习]]></description>
			<content:encoded><![CDATA[<p>端午没事，去莫干山50号，晃了一圈。拍了几张图回来拼全景。工具是入门级的<a href="http://cvlab.epfl.ch/~brown/autostitch/autostitch.html">autostitch</a>。。。哈哈。重装系统了，hugin不见了，就用<a href="http://cvlab.epfl.ch/~brown/autostitch/autostitch.html">autostitch</a>随便拼一下。速度快，效果也不错。</p>
<p style="text-align: center;"><a href="http://www.cvchina.info/wp-content/uploads/2010/06/M50_pano1.jpg"><img class="aligncenter size-full wp-image-1251" title="M50_pano1" src="http://www.cvchina.info/wp-content/uploads/2010/06/M50_pano1.jpg" alt="莫干山" width="824" height="196" /></a></p>
<p style="text-align: center;"><span id="more-1250"></span><a href="http://www.cvchina.info/wp-content/uploads/2010/06/M50_pano2.jpg"><img class="aligncenter size-full wp-image-1252" title="M50_pano2" src="http://www.cvchina.info/wp-content/uploads/2010/06/M50_pano2.jpg" alt="莫干山" width="835" height="227" /></a></p>
<p style="text-align: center;"><a href="http://www.cvchina.info/wp-content/uploads/2010/06/M50_pano3.jpg"><img class="aligncenter size-full wp-image-1254" title="M50_pano3" src="http://www.cvchina.info/wp-content/uploads/2010/06/M50_pano3.jpg" alt="莫干山" width="839" height="166" /></a></p>
<p>下面一张不是全景图。照的是一个9屏的电影，<a href="http://www.cvchina.info/tag/%e4%b8%87%e9%87%8d%e6%b5%aa/" class="st_tag internal_tag" rel="tag" title="标签 万重浪 下的日志">万重浪</a>（ten thousand waves)，9个屏，分别显示不同的视角，注意上面的白色投影仪。我去晚了，只看到了尾巴，没搞清楚放的什么玩意。。不过，号称艺术嘛，估计我就算看完整了，也一样搞不清楚放的什么玩意。额。。。</p>
<p style="text-align: center;"><a href="http://www.cvchina.info/wp-content/uploads/2010/06/M50_ten_thousand_waves.jpg"><img class="aligncenter size-full wp-image-1253" title="M50_ten_thousand_waves" src="http://www.cvchina.info/wp-content/uploads/2010/06/M50_ten_thousand_waves.jpg" alt="莫干山 万重浪" width="649" height="219" /></a></p>

	Tags: <a href="http://www.cvchina.info/tag/autostitch/" title="autostitch" rel="tag">autostitch</a>, <a href="http://www.cvchina.info/tag/hugin/" title="hugin" rel="tag">hugin</a>, <a href="http://www.cvchina.info/tag/%e4%b8%87%e9%87%8d%e6%b5%aa/" title="万重浪" rel="tag">万重浪</a>, <a href="http://www.cvchina.info/tag/%e5%85%a8%e6%99%af%e6%8b%bc%e6%8e%a5/" title="全景拼接" rel="tag">全景拼接</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/06/16/moganshan-m50/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>图像增强demo</title>
		<link>http://www.cvchina.info/2010/04/28/image-enhancement-demo/</link>
		<comments>http://www.cvchina.info/2010/04/28/image-enhancement-demo/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 13:49:51 +0000</pubDate>
		<dc:creator>terri</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[image enhancement]]></category>
		<category><![CDATA[国产原创]]></category>
		<category><![CDATA[图像增强]]></category>
		<category><![CDATA[图像处理]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=542</guid>
		<description><![CDATA[图像较大，请耐心等待图片下载。建议点击右上角的图标全屏观看。 亲爱的读者，这个算法效果如何？ 请写下您的看法哈。用阅读器的朋友请点这里。 喜爱这个图像处理demo展示flash的读者，请不要吝啬对terri的赞美。 对这个flash相册感兴趣的朋友可以直接拿源码了： http://code.google.com/p/demoforimageprocess/ Tags: demo, image enhancement, 国产原创, 图像增强, 图像处理, 新闻, 练习]]></description>
			<content:encoded><![CDATA[<p><object width="600" height="450" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.cvchina.info/wp-content/flash/image_enhancement/demo_zxj.swf" /><param name="quality" value="high" /><param name="allowfullscreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="allowscriptaccess" value="always" /><embed width="600" height="450" type="application/x-shockwave-flash" src="http://www.cvchina.info/wp-content/flash/image_enhancement/demo_zxj.swf" quality="high" allowfullscreen="true" allowScriptAccess="always" allowscriptaccess="always" /></object></p>
<p><span style="color: #008000;"><strong>图像较大，请耐心等待图片下载。</strong><strong><span style="color: #ff0000;">建议点击右上角的图标全屏观看。</span></strong></span></p>
<p><span style="color: #008000;"><strong>亲爱的读者，这个算法效果如何？ 请写下您的看法哈。用阅读器的朋友请点<a href="http://www.cvchina.info/2010/04/28/image-enhancement-demo/">这里</a></strong><strong>。</strong></span></p>
<p><span style="color: #008000;"><strong>喜爱这个图像处理demo展示flash的读者，请不要吝啬对terri的赞美。</strong></span></p>
<p><span style="color: #008000;"><strong>对这个flash相册感兴趣的朋友可以直接拿源码了：</strong></span></p>
<p><span style="color: #008000;"><strong><a href="http://code.google.com/p/demoforimageprocess/">http://code.google.com/p/demoforimageprocess/</a></strong></span><br />
<!-- 请将以下代码放在您希望呈现 +1 按钮的位置。 --></p>

	Tags: <a href="http://www.cvchina.info/tag/demo/" title="demo" rel="tag">demo</a>, <a href="http://www.cvchina.info/tag/image-enhancement/" title="image enhancement" rel="tag">image enhancement</a>, <a href="http://www.cvchina.info/tag/%e5%9b%bd%e4%ba%a7%e5%8e%9f%e5%88%9b/" title="国产原创" rel="tag">国产原创</a>, <a href="http://www.cvchina.info/tag/%e5%9b%be%e5%83%8f%e5%a2%9e%e5%bc%ba/" title="图像增强" rel="tag">图像增强</a>, <a href="http://www.cvchina.info/tag/%e5%9b%be%e5%83%8f%e5%a4%84%e7%90%86/" title="图像处理" rel="tag">图像处理</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/04/28/image-enhancement-demo/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>计算机视觉基础练习（二）Compute the Fundamental Matrix from two simulated cameras</title>
		<link>http://www.cvchina.info/2010/04/10/cvexercise2/</link>
		<comments>http://www.cvchina.info/2010/04/10/cvexercise2/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 13:26:50 +0000</pubDate>
		<dc:creator>powerlee</dc:creator>
				<category><![CDATA[练习]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[cameras]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[epipolar]]></category>
		<category><![CDATA[epipolar geometry]]></category>
		<category><![CDATA[Erasmus Mundus]]></category>
		<category><![CDATA[essential matrix]]></category>
		<category><![CDATA[Fundamental Matrix]]></category>
		<category><![CDATA[Gaussian noise]]></category>
		<category><![CDATA[Least Square]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[stereo vision]]></category>
		<category><![CDATA[SVD]]></category>
		<category><![CDATA[VIBOT]]></category>
		<category><![CDATA[visual perception]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=609</guid>
		<description><![CDATA[基于计算机视觉基础练习（一）的进一步练习（练习仍然来自于Erasmus Mundus Vision and Robotics (VIBOT) program） 参考资料可以仍然用Computer vision: algorithm and applications，draft March 24 2010, chapter 2.1.5   由于练习描述比较长，就不直接贴在帖子里了。请下载练习： cvexercise2questions 参考report： cvexercise2 report 参考matlab code （因为仍然是贴在pdf中的，所以同样注意换行错误）： cvexercise2code enjoy!!!! Tags: 2D, 3D, cameras, computer vision, epipolar, epipolar geometry, Erasmus Mundus, essential matrix, Fundamental Matrix, Gaussian noise, Least Square, matlab, stereo vision, SVD, VIBOT, visual perception, 练习]]></description>
			<content:encoded><![CDATA[<p>基于计算机视觉基础练习（一）的进一步练习（练习仍然来自于Erasmus Mundus Vision and Robotics (<a href="http://www.cvchina.info/tag/vibot/" class="st_tag internal_tag" rel="tag" title="标签 VIBOT 下的日志">VIBOT</a>) program）</p>
<p>参考资料可以仍然用<a href="http://research.microsoft.com/en-us/um/people/szeliski/Book/">Computer vision: algorithm and applications</a>，draft March 24 2010, chapter 2.1.5</p>
<p style="text-align: center"><img class="aligncenter" src="http://i780.photobucket.com/albums/yy90/powerlee918/cvchina/cameras.png" alt="stereo vision system" width="499" height="391" /></p>
<p> </p>
<p style="text-align: center"><img class="aligncenter" src="http://i780.photobucket.com/albums/yy90/powerlee918/cvchina/epipolar.png" alt="epipolar geometry" width="563" height="341" /></p>
<p>由于练习描述比较长，就不直接贴在帖子里了。请下载练习：</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2010/04/cvexercise2questions.pdf">cvexercise2questions</a><a href="http://www.cvchina.info/wp-content/uploads/2010/04/cvexercise2"></a></p>
<p>参考report：</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2010/04/cvexercise2-report.pdf">cvexercise2 report</a></p>
<p>参考matlab code （因为仍然是贴在pdf中的，所以同样注意换行错误）：</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2010/04/cvexercise2code.pdf">cvexercise2code</a></p>
<p>enjoy!!!!</p>

	Tags: <a href="http://www.cvchina.info/tag/2d/" title="2D" rel="tag">2D</a>, <a href="http://www.cvchina.info/tag/3d/" title="3D" rel="tag">3D</a>, <a href="http://www.cvchina.info/tag/cameras/" title="cameras" rel="tag">cameras</a>, <a href="http://www.cvchina.info/tag/computer-vision/" title="computer vision" rel="tag">computer vision</a>, <a href="http://www.cvchina.info/tag/epipolar/" title="epipolar" rel="tag">epipolar</a>, <a href="http://www.cvchina.info/tag/epipolar-geometry/" title="epipolar geometry" rel="tag">epipolar geometry</a>, <a href="http://www.cvchina.info/tag/erasmus-mundus/" title="Erasmus Mundus" rel="tag">Erasmus Mundus</a>, <a href="http://www.cvchina.info/tag/essential-matrix/" title="essential matrix" rel="tag">essential matrix</a>, <a href="http://www.cvchina.info/tag/fundamental-matrix/" title="Fundamental Matrix" rel="tag">Fundamental Matrix</a>, <a href="http://www.cvchina.info/tag/gaussian-noise/" title="Gaussian noise" rel="tag">Gaussian noise</a>, <a href="http://www.cvchina.info/tag/least-square/" title="Least Square" rel="tag">Least Square</a>, <a href="http://www.cvchina.info/tag/matlab/" title="matlab" rel="tag">matlab</a>, <a href="http://www.cvchina.info/tag/stereo-vision/" title="stereo vision" rel="tag">stereo vision</a>, <a href="http://www.cvchina.info/tag/svd/" title="SVD" rel="tag">SVD</a>, <a href="http://www.cvchina.info/tag/vibot/" title="VIBOT" rel="tag">VIBOT</a>, <a href="http://www.cvchina.info/tag/visual-perception/" title="visual perception" rel="tag">visual perception</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/04/10/cvexercise2/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>计算机视觉基础练习（一）camera calibration</title>
		<link>http://www.cvchina.info/2010/04/07/cvexercise1/</link>
		<comments>http://www.cvchina.info/2010/04/07/cvexercise1/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 22:12:40 +0000</pubDate>
		<dc:creator>powerlee</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[2D]]></category>
		<category><![CDATA[3D]]></category>
		<category><![CDATA[camera calibration]]></category>
		<category><![CDATA[computer vision]]></category>
		<category><![CDATA[Erasmus Mundus]]></category>
		<category><![CDATA[Faugeras]]></category>
		<category><![CDATA[Gaussian noise]]></category>
		<category><![CDATA[Hall]]></category>
		<category><![CDATA[Least Square]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[optical rays]]></category>
		<category><![CDATA[SVD]]></category>
		<category><![CDATA[VIBOT]]></category>
		<category><![CDATA[visual perception]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=577</guid>
		<description><![CDATA[决定发几个原来上课时候做的一些小练习，感觉对计算机视觉入门挺有帮助的，希望感兴趣的童鞋可以自己试一试。（练习来源于Erasmus Mundus vision and robotics (VIBOT) program) 参考书籍可以用前些天发的一个帖子推荐的那本书，Computer vision: algorithm and applications，draft March 24 2010, chapter 2.1.5。自己稍微翻看了一下这本书，相当相当不错，非常非常与时俱进。。。同推荐一下。。。 Calibrate a simulated camera Description: Calibrate a simulated camera. Construct the transformation matrix from a set of parameters. Get 3D and 2D points. Calibrate by using the method of Hall. Check the accuracy against the increase of noise [...]]]></description>
			<content:encoded><![CDATA[<p>决定发几个原来上课时候做的一些小练习，感觉对计算机视觉入门挺有帮助的，希望感兴趣的童鞋可以自己试一试。（练习来源于Erasmus Mundus vision and robotics (<a href="http://www.cvchina.info/tag/vibot/" class="st_tag internal_tag" rel="tag" title="标签 VIBOT 下的日志">VIBOT</a>) program)</p>
<p>参考书籍可以用前些天发的一个帖子推荐的那本书，<a href="http://research.microsoft.com/en-us/um/people/szeliski/Book/">Computer vision: algorithm and applications</a>，draft March 24 2010, chapter 2.1.5。自己稍微翻看了一下这本书，相当相当不错，非常非常与时俱进。。。同推荐一下。。。</p>
<p>Calibrate a simulated camera</p>
<p>Description: Calibrate a simulated camera. Construct the transformation matrix from a set of<br />
parameters. Get <a href="http://www.cvchina.info/tag/3d/" class="st_tag internal_tag" rel="tag" title="标签 3D 下的日志">3D</a> and 2D points. Calibrate by using the method of <a href="http://www.cvchina.info/tag/hall/" class="st_tag internal_tag" rel="tag" title="标签 Hall 下的日志">Hall</a>. Check the accuracy<br />
against the increase of noise in the image points.<br />
Programming platform: <a href="http://www.cvchina.info/tag/matlab/" class="st_tag internal_tag" rel="tag" title="标签 matlab 下的日志">Matlab</a><br />
Part 1<br />
Step 1. Define the intrinsic parameters and extrinsic parameters with the following values:<br />
au=557.0943; av=712.9824; u0=326.3819; v0=298.6679;<br />
f=80 mm.;<br />
Tx=100 mm.; Ty=0 mm.; Tz=1500 mm.;<br />
Phix=0.8*pi/2; Phiy=-1.8*pi/2; Phix1=pi/5; Euler XYX1<br />
Image size:640&#215;480<br />
Step 2. Get the intrinsic and extrinsic transformation matrices<br />
Step 3. Define a set of 3D points in the rang [-480:480;-480:480;-480:480]. Note the points<br />
should be non-linear and non-coplanar. At least you need to define a set of 6 points. It’s not<br />
necessary to demonstrate mathematically the non-linearity/non-coplanarity, just define 6 points<br />
randomly in the 3D space.<br />
Step 4. Compute the projection on the image plane by using the camera transformation matrix.<br />
Do not remove the subpixel precision of the obtained points.<br />
Step 5. Open a window in matlab which will be used as the image plane and draw the 2D<br />
points. Are the points well spread in the image plane? Will the distribution of points in the image<br />
affect the accuracy in the computation?<br />
Step 6. By using the points of Step 3 and their projection obtained in Step 5, compute the 3&#215;4<br />
transformation matrix by using the method of Hall.<br />
Step 7. Compare the matrix obtained in Step 6 to the one defined in step 2.<br />
Step 8. Add some <a href="http://www.cvchina.info/tag/gaussian-noise/" class="st_tag internal_tag" rel="tag" title="标签 Gaussian noise 下的日志">Gaussian noise</a> to the 2D points producing discrepancies between the range<br />
[-1,+1] pixels for the 95% of points. Again repeat step 6 with the noisy 2D points and the ones<br />
defined in step 3. Compare the obtained matrix to the one you got in step 6 with the non-noisy<br />
points.<br />
Step 9. Increase the number of 3D points up to 10 points and then up to 50 points and repeat<br />
step 8. More the points we use more accurate is the matrix obtained.<br />
Part 2.<br />
Step 10. Define the vector X of the method of <a href="http://www.cvchina.info/tag/faugeras/" class="st_tag internal_tag" rel="tag" title="标签 Faugeras 下的日志">Faugeras</a>. Compute X by using both leastsquares<br />
(LS) and Singular Value Decomposition (SVD) by using the points of step 3 and 4,<br />
without noise. Extract the camera parameters from both computations. Compare the obtained<br />
parameters with the ones defined in Step 1.o<br />
Step 11. Add Gaussian noise to the 2D points (produce noise so that the 95% is in the rang<br />
[-1,1], then in the rang [-2,2] and finally in the rang [-3,3] ) and compute vector X (repeat step<br />
10) for each rang. Which are the parameters more influenced by noise? Which method of<br />
computation is more accurate (LS or SVD)? Which method is more accurate (Faugeras or Hall)<br />
with such noise?<br />
Part 3.<br />
Step 12. Open another window in matlab and draw the world coordinate system, the camera<br />
coordinate system, the focal point, the image plane, and both 3D points and their corresponding<br />
projections on the image plane by using the parameters of step 2 and points without noise.<br />
Check if camera position corresponds to (tx, ty, tz) defined in step 2. Check if all the optical rays<br />
cross at the focal point? Check if 2D points lie on the optical rays defined by the 3D points?</p>
<p>由于练习来自于原来上课的练习，所以有些符号，例如au,av之类是跟据当时课件定义的。如果有些童鞋对这些符号不清楚，可以参考附件中的report。</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2010/04/camera-calibration-report.pdf">camera calibration report</a>：实在找不到当时写的完整的report了，只找到了这个draft。将就用一下吧，的确是有问题的，比如step11就完全没有写，而且连图都没有，囧！不过后面我会上传全部的matlab code，不清楚话可以看code。希望之后的一些练习能找到完整的report。</p>
<p>MATLAB CODE:</p>
<p><a href="http://www.cvchina.info/wp-content/uploads/2010/04/matlab-code-for-camera-calibration.pdf">matlab code for camera calibration</a></p>
<p>尝试上传.m格式和.rar格式的文件不成功，只好把code粘到了pdf里，大家用的时候小心换行造成的错误。。。有谁知道该怎么解决这种上传的问题啊？</p>

	Tags: <a href="http://www.cvchina.info/tag/2d/" title="2D" rel="tag">2D</a>, <a href="http://www.cvchina.info/tag/3d/" title="3D" rel="tag">3D</a>, <a href="http://www.cvchina.info/tag/camera-calibration/" title="camera calibration" rel="tag">camera calibration</a>, <a href="http://www.cvchina.info/tag/computer-vision/" title="computer vision" rel="tag">computer vision</a>, <a href="http://www.cvchina.info/tag/erasmus-mundus/" title="Erasmus Mundus" rel="tag">Erasmus Mundus</a>, <a href="http://www.cvchina.info/tag/faugeras/" title="Faugeras" rel="tag">Faugeras</a>, <a href="http://www.cvchina.info/tag/gaussian-noise/" title="Gaussian noise" rel="tag">Gaussian noise</a>, <a href="http://www.cvchina.info/tag/hall/" title="Hall" rel="tag">Hall</a>, <a href="http://www.cvchina.info/tag/least-square/" title="Least Square" rel="tag">Least Square</a>, <a href="http://www.cvchina.info/tag/matlab/" title="matlab" rel="tag">matlab</a>, <a href="http://www.cvchina.info/tag/optical-rays/" title="optical rays" rel="tag">optical rays</a>, <a href="http://www.cvchina.info/tag/svd/" title="SVD" rel="tag">SVD</a>, <a href="http://www.cvchina.info/tag/vibot/" title="VIBOT" rel="tag">VIBOT</a>, <a href="http://www.cvchina.info/tag/visual-perception/" title="visual perception" rel="tag">visual perception</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/04/07/cvexercise1/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>拼接练习 外滩</title>
		<link>http://www.cvchina.info/2010/01/31/panorama-waitan/</link>
		<comments>http://www.cvchina.info/2010/01/31/panorama-waitan/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 08:24:10 +0000</pubDate>
		<dc:creator>cvchina</dc:creator>
				<category><![CDATA[新闻]]></category>
		<category><![CDATA[练习]]></category>
		<category><![CDATA[hugin]]></category>
		<category><![CDATA[外滩]]></category>
		<category><![CDATA[拼接练习]]></category>

		<guid isPermaLink="false">http://www.cvchina.info/?p=163</guid>
		<description><![CDATA[上海外滩，点击图片看大图，拼接工具hugin 另：由于专利问题，hugin的最新版本去掉了sift相关的特征点提取工具。解决办法是先安装hugin 0.7版，然后用最新版本覆盖安装。 Tags: hugin, 外滩, 拼接练习, 新闻, 练习]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 624px"><a href="http://i973.photobucket.com/albums/ae212/cvchina/1.png"><img class=" " title="上海外滩全景" src="http://i973.photobucket.com/albums/ae212/cvchina/1.png" alt="上海外滩全景" width="614" height="167" /></a><p class="wp-caption-text">上海外滩全景</p></div>
<p>上海外滩，点击图片看大图，拼接工具<a title="hugin" href="http://hugin.sourceforge.net/">hugin</a></p>
<p>另：由于专利问题，hugin的最新版本去掉了sift相关的特征点提取工具。解决办法是先安装hugin 0.7版，然后用最新版本覆盖安装。</p>

	Tags: <a href="http://www.cvchina.info/tag/hugin/" title="hugin" rel="tag">hugin</a>, <a href="http://www.cvchina.info/tag/%e5%a4%96%e6%bb%a9/" title="外滩" rel="tag">外滩</a>, <a href="http://www.cvchina.info/tag/%e6%8b%bc%e6%8e%a5%e7%bb%83%e4%b9%a0/" title="拼接练习" rel="tag">拼接练习</a>, <a href="http://www.cvchina.info/category/news/" title="新闻" rel="tag">新闻</a>, <a href="http://www.cvchina.info/category/selftrain/" title="练习" rel="tag">练习</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.cvchina.info/2010/01/31/panorama-waitan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

