<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2791112373738607920</id><updated>2012-02-17T11:15:21.101+08:00</updated><category term='OpenCV'/><category term='OpenCV隨機字型與繪圖'/><category term='OpenCV資料結構操作與運算'/><category term='OpenCV介紹'/><category term='OpenCV視窗介面程式設計'/><category term='OpenCV線性代數'/><category term='OpenCV安裝'/><category term='OpenCV統計應用'/><category term='OpenCV命名規則'/><title type='text'>昨日</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>76</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-6208880127925851558</id><published>2009-02-03T18:59:00.015+08:00</published><updated>2009-02-04T05:46:11.270+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-Mahalanobis距離</title><content type='html'>Mahalanobis距離是一個可以準確找出資料分布上面極端值(Outliers)的統計方法,使用線性迴歸的概念,也就是說他使用的是共變數矩陣以及該資料分布的平均數來找尋極端值的產生,而可以讓一群資料系統具有穩健性(Robust),去除不必要的雜訊訊息,這邊拿前面共變數矩陣的資料為例,並且新增了兩個點座標向量來做Mahalanobis距離的比較&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYg7ZMDCNnI/AAAAAAAABgc/2S8otygm94c/s1600-h/mat_number_127.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 168px; height: 287px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYg7ZMDCNnI/AAAAAAAABgc/2S8otygm94c/s400/mat_number_127.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5298550265518110322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;加入兩個座標點找尋極端值&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYg7f26O39I/AAAAAAAABgk/6-k7qTFOAGM/s1600-h/mat_number_135.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 68px; height: 94px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYg7f26O39I/AAAAAAAABgk/6-k7qTFOAGM/s400/mat_number_135.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5298550380103131090" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Mahalanobis距離實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates[&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;6&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;                       &lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates2[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates3[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;200&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *CovarMatrix;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *InvertCovarMatrix;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *AvgVector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector3;&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector1,Coordinates1,Vector1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]=Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CovarMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;InvertCovarMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AvgVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector3=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector2,Coordinates2,Vector2-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector3,Coordinates3,Vector3-&amp;gt;step);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcCovarMatrix((&lt;strong&gt;const&lt;/strong&gt; CvArr **)Vector,&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CovarMatrix,AvgVector,CV_COVAR_SCALE+CV_COVAR_NORMAL+CV_COVAR_ROWS);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvInvert(CovarMatrix,InvertCovarMatrix,CV_SVD_SYM);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nVector2 Mahalanobis Distance\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%f\n"&lt;/span&gt;,cvMahalanobis(Vector2,AvgVector,InvertCovarMatrix));&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nVector3 Mahalanobis Distance\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%f\n"&lt;/span&gt;,cvMahalanobis(Vector3,AvgVector,InvertCovarMatrix));&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;由上面可以看得出來第一筆座標向量Vector2,他的座標位在(1.3,1.5)的位置,第二筆座標向量Vector2他的座標在(200,100),對於原始資料分布來說,第二筆座標向量它已經遠遠離開了這些座標分佈,因此可以從執行結果看的出來Vector3的Mahalanobis距離遠大於Vector2,而在做Mahalanobis距離的同時,也必須要將共變數矩陣做反矩陣運算,cvMahalanobis()第一個引數為目標要判斷是否是極端值的向量CvMat資料結構,第二個引數為該資料分佈的平均數向量或是該資料分佈的某筆資料的CvMat資料結構,第三個引數為該資料分佈共變數矩陣的反矩陣&lt;br /&gt;&lt;br /&gt;而Mahalanobis距離的原理如下&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYixmS3pWFI/AAAAAAAABhE/grnnF1QJc24/s1600-h/mat_number_136.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 178px; height: 128px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYixmS3pWFI/AAAAAAAABhE/grnnF1QJc24/s400/mat_number_136.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5298680233059768402" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;當資料分佈使的共變數矩陣為單位向量I的話,就會退化成歐機理得距離(Euclidean Distance)&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYix5X1Q0bI/AAAAAAAABhM/tZ4ZPBTaOPw/s1600-h/mat_number_137.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 154px; height: 65px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYix5X1Q0bI/AAAAAAAABhM/tZ4ZPBTaOPw/s400/mat_number_137.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5298680560809464242" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而他的計算方式如下&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYi1p5xoiGI/AAAAAAAABhU/syk7pEvSjbI/s1600-h/mat_number_138.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 370px; height: 76px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYi1p5xoiGI/AAAAAAAABhU/syk7pEvSjbI/s400/mat_number_138.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5298684693089650786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYi5COd_Y-I/AAAAAAAABhc/4EBQEJS-wSo/s1600-h/mat_number_139.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 386px; height: 76px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYi5COd_Y-I/AAAAAAAABhc/4EBQEJS-wSo/s400/mat_number_139.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5298688409496151010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由上面可知,在一個簡單線性迴歸的資料模型下,第二筆資料Vector3為這個線性迴歸的極端值&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-6208880127925851558?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/6208880127925851558/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=6208880127925851558' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6208880127925851558'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6208880127925851558'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2009/02/opencv-mahalanobis.html' title='OpenCV統計應用-Mahalanobis距離'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HcQD5f5sLPc/SYg7ZMDCNnI/AAAAAAAABgc/2S8otygm94c/s72-c/mat_number_127.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-6065714358292782184</id><published>2009-01-31T13:25:00.025+08:00</published><updated>2009-02-03T14:03:58.981+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-PCA主成分分析</title><content type='html'>在圖形識別方面,主成分分析(Principal Comonents Analysis,PCA)算是比較快速而且又準確的方式之一,它可以對抗圖形平移旋轉的事件發生,並且藉由主要特徵(主成分)投影過後的資料做資料的比對,在多個特徵資訊裡面,取最主要的K個,做為它的特徵依據,在這邊拿前面共變數矩陣的數據來做沿用,主成分分析使用的方法為計算共變數矩陣,在加上計算共變數矩陣的特徵值及特徵向量,將特徵值以及所對應的特徵向量排序之後,取前面主要K個特徵向量當做主要特徵,而OpenCV也可以對高維度的向量進行主成分分析的計算&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP-2ptJDGI/AAAAAAAABeU/AolCWWf17w4/s1600-h/mat_number_127.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297357801579416674" style="WIDTH: 168px; CURSOR: hand; HEIGHT: 287px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP-2ptJDGI/AAAAAAAABeU/AolCWWf17w4/s400/mat_number_127.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;數據原始的分佈情況,紅點代表著它的平均數&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP_qK-rnwI/AAAAAAAABek/flQ1-geW0lk/s1600-h/pic_number_154.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297358686684684034" style="WIDTH: 376px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP_qK-rnwI/AAAAAAAABek/flQ1-geW0lk/s400/pic_number_154.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;將座標系位移,以紅點為主要的原點&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYP_jL7BlXI/AAAAAAAABec/omysUJI7Vjc/s1600-h/pic_number_155.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297358566678697330" style="WIDTH: 379px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYP_jL7BlXI/AAAAAAAABec/omysUJI7Vjc/s400/pic_number_155.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;計算共變數矩陣以及共變數的特徵值以及特徵向量,將特徵向量排序後投影回原始資料的結果的結果,也就是說,對照上面的圖片,EigenVector的作用是找到主軸後,將原本的座標系做旋轉了&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP_4AXbOYI/AAAAAAAABes/SBniur14dLE/s1600-h/pic_number_156.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297358924353845634" style="WIDTH: 379px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP_4AXbOYI/AAAAAAAABes/SBniur14dLE/s400/pic_number_156.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來就是對它做投影,也就是降低維度的動作,將Y軸的數據全部歸零,投影在X軸上&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYYyFT7tZEI/AAAAAAAABgE/V5lciBp_ZS8/s1600-h/pic_number_160.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 375px; height: 400px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYYyFT7tZEI/AAAAAAAABgE/V5lciBp_ZS8/s400/pic_number_160.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297977078479414338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;投影完之後,在將它轉回原本的座標系&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYYyTle_0eI/AAAAAAAABgM/DJv1XeHX0P8/s1600-h/pic_number_161.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 376px; height: 400px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYYyTle_0eI/AAAAAAAABgM/DJv1XeHX0P8/s400/pic_number_161.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297977323708994018" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PCA主成分分析,與線性迴歸有異曲同工之妙,也就是說,這條投影過後的直線,可以稱做迴歸線,當它在做主軸旋轉的時候,所投影的結果為最小均方誤,在將它轉置回來的時候,就形成了一條迴歸直線了&lt;br /&gt;&lt;br /&gt;OpenCV的PCA輸入必須要是單通道32位元浮點數格式或是單通道64位元浮點數格式的,參數為CV_32FC1或是CV_64FC1,程式寫法如下&lt;br /&gt;&lt;br /&gt;PCA程式實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates[&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;6&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *AvgVector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenValue_Row;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenVector;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector1,Coordinates,Vector1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AvgVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EigenValue_Row=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EigenVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcPCA(Vector1,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Original Data:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(Vector1,&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"==========\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(AvgVector,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nEigne Value:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(EigenValue_Row,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nEigne Vector:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(EigenVector,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;void PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYWlOklxdbI/AAAAAAAABfs/zT2O3dUghdM/s1600-h/pic_number_157.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYWlOklxdbI/AAAAAAAABfs/zT2O3dUghdM/s400/pic_number_157.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297822206430115250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這部份是把平均數,共變數矩陣,以及特徵值及特徵向量都計算出來了,全部都包在cvCalcPCA()的函式裡面,因此可以不必特地的用cvCalcCovarMatrix()求得共變數矩陣,也不需要再由共變數矩陣套用cvEigenVV()求得它的EigenValue以及EigenVector了,所以說,cvCalcPCA()=cvCalcCovarMatrix()+cvEigenVV(),不僅如此,cvCalcPCA()使用上更是靈活,當向量的維度數目比輸入的資料那的時候(例如Eigenface),它的共變數矩陣就會自動轉成CV_COVAR_SCRAMBLED,而當輸入資料量比向量維度大的時候,它亦會自動轉成CV_COVAR_NORMAL的形態,而OpenCV也提供了計算投影量cvProjectPCA(),以及反向投影的函式cvBackProjectPCA(),cvCalcPCA()的計算結果如下&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYUg1SV2TZI/AAAAAAAABfk/vBBESYGXDiY/s1600-h/mat_number_132.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 332px; height: 353px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SYUg1SV2TZI/AAAAAAAABfk/vBBESYGXDiY/s400/mat_number_132.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297676636499889554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;詳細計算方法可以參考"OpenCV統計應用-共變數矩陣"以及"OpenCV線性代數-cvEigenVV實作"這兩篇,cvCalcPCA()第一個引數為輸入目標要計算的向量,整合在CvMat資料結構裡,第二個引數為空的平均數向量,第三個引數為輸出排序後的EigenValue,以列(Rows)為主的數值,第四個引數為排序後的EigenVector,第五個引數為cvCalcPCA()的參數,它的參數公式如下&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define CV_PCA_DATA_AS_ROW 0&lt;br /&gt;#define CV_PCA_DATA_AS_COL 1&lt;br /&gt;#define CV_PCA_USE_AVG 2&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;分別代表以列為主,以欄為主的參數設定,以及使用自己定義的平均數,CV_PCA_DATA_AS_ROW與CV_PCA_DATA_AS_COL的參數不可以同時使用,而對於主成分分析的EigenVector對原始資料投影的程式範例如下&lt;br /&gt;&lt;br /&gt;PCA特徵向量投影&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates[&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;6&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *AvgVector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenValue_Row;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenVector;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector1,Coordinates,Vector1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AvgVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EigenValue_Row=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EigenVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcPCA(Vector1,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvProjectPCA(Vector1,AvgVector,EigenVector,Vector1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Project Original Data:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(Vector1,&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYWlfLHEFWI/AAAAAAAABf0/mULw-l6tMjk/s1600-h/pic_number_158.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYWlfLHEFWI/AAAAAAAABf0/mULw-l6tMjk/s400/pic_number_158.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297822491648202082" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvProjectPCA(),它的公式定義如下&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYUEmyKHc2I/AAAAAAAABfE/nYxZ3IfvK3s/s1600-h/mat_number_133.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297645601017000802" style="WIDTH: 292px; CURSOR: hand; HEIGHT: 348px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYUEmyKHc2I/AAAAAAAABfE/nYxZ3IfvK3s/s400/mat_number_133.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因此,它所呈現的結果就是將座標旋轉後的特徵向量投影,cvProjectPCA()的地一個引數為輸入原始向量資料,第二個引數為輸入空的(或是以設定好的)平均數向量,第三個引數為輸入以排序好的特徵向量EigenVector,第四個引數為輸出目標投影向量,而投影之外,OpenCV還可以給他做反向投影回原始的資料&lt;br /&gt;&lt;br /&gt;PCA反向投影&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates[&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;6&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *AvgVector;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;450&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;450&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector1,Coordinates,Vector1-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AvgVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenValue_Row=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcPCA(Vector1,AvgVector,EigenValue_Row,EigenVector,CV_PCA_DATA_AS_ROW);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvProjectPCA(Vector1,AvgVector,EigenVector,Vector1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvBackProjectPCA(Vector1,AvgVector,EigenVector,Vector1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Back Project Original Data:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;;i++)&lt;br /&gt;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGetReal2D(Vector1,i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGetReal2D(Vector1,i,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCircle(Image1,cvPoint((&lt;strong&gt;int&lt;/strong&gt;)(cvGetReal2D(Vector1,i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;)*&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;),(&lt;strong&gt;int&lt;/strong&gt;)(cvGetReal2D(Vector1,i,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)*&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;)),&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CV_AA,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCircle(Image1,cvPoint((&lt;strong&gt;int&lt;/strong&gt;)((cvGetReal2D(AvgVector,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;))*&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;),(&lt;strong&gt;int&lt;/strong&gt;)((cvGetReal2D(AvgVector,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;))*&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;)),&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,CV_RGB(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CV_AA,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"==========\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGetReal2D(AvgVector,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGetReal2D(AvgVector,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Coordinates"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Coordinates"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYY3PR_AxCI/AAAAAAAABgU/2-aF0eS7vC4/s1600-h/pic_number_159.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYY3PR_AxCI/AAAAAAAABgU/2-aF0eS7vC4/s400/pic_number_159.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297982747313226786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而反向投影,只不過是將投影向量還原成原始資料罷了,可以用來做為新進資料反向投影後用來比對的步驟,以下是它的計算公式推導&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYUE1p1SVOI/AAAAAAAABfM/1uqjwk9X6ho/s1600-h/mat_number_134.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5297645856480187618" style="WIDTH: 176px; CURSOR: hand; HEIGHT: 249px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SYUE1p1SVOI/AAAAAAAABfM/1uqjwk9X6ho/s400/mat_number_134.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvBackProjectPCA()的引數輸入與cvProjectPCA()是一樣的,只不過是裡面的計算公式不同,其實也只是cvProjectPCA()的反運算&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCalcPCA()&lt;/strong&gt;&lt;br /&gt;計算多筆高維度資料的主要特徵值及特徵向量,先自動判斷維度大於資料量或維度小於資料量來選擇共變數矩陣的樣式,在由共變數矩陣求得已排序後的特徵值及特徵向量,cvCalcPCA()函式的參數為CV_PCA_DATA_AS_ROW以列為主的資料排列,CV_PCA_DATA_AS_COL以行為主的資料排列,CV_PCA_USE_AVG自行定義平均數數據,CV_PCA_DATA_AS_ROW以及CV_PCA_DATA_AS_COL不可以同時使用,cvCalcPCA()的第一個引數為輸入CvMat維度向量資料結構,第二個引數為輸入空的CvMat平均數向量資料結構(或是自行定義平均數向量),第三個引數為輸入以列為主的特徵值CvMat資料結構,第四個引數為輸入特徵向量CvMat資料結構,第四個引數為輸入cvCalcPCA()函式的參數&lt;br /&gt;cvCalcPCA(輸入目標向量資料CvMat資料結構,輸入或輸出向量平均數CvMat資料結構,輸入以列為主EigenValue的CvMat資料結構,輸入EigenVector的CvMat資料結構,目標參數或代號)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvProjectPCA()&lt;/strong&gt;&lt;br /&gt;將計算主成分分析的結果做投影的運算,主要作用是將最具意義的k個EgienVector與位移後的原始資料做矩陣乘法,投影過後的結果將會降低維度,cvProjectPCA()第一個引數為輸入CvMat資料結構原始向量資料數據,第二個引數為輸入CvMat資料結構平均數向量,第三個引數為輸入要降維的特徵向量,第四個引數為輸出CvMat資料結構原始資料投影的結果&lt;br /&gt;cvProjectPCA(輸入CvMat原始向量數據資料結構,輸入CvMat原始向量平均數資料結構,輸入CvMat降低維度的特徵向量資料結構,輸出CvMat投影向量資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvBackProjectPCA()&lt;/strong&gt;&lt;br /&gt;將投影向量轉回原始向量維度座標系,cvProjectPCA()第一個引數為輸入CvMat資料結構投影向量數據,第二個引數為輸入CvMat資料結構平均數向量,第三個引數為輸入特徵向量,第四個引數為輸出CvMat資料結構反向投影的結果&lt;br /&gt;cvProjectPCA(輸入CvMat投影向量資料結構,輸入CvMat原始向量平均數資料結構,輸入CvMat特徵向量資料結構,輸出CvMat反向投影資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-6065714358292782184?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/6065714358292782184/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=6065714358292782184' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6065714358292782184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6065714358292782184'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2009/01/opencv-pca.html' title='OpenCV統計應用-PCA主成分分析'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HcQD5f5sLPc/SYP-2ptJDGI/AAAAAAAABeU/AolCWWf17w4/s72-c/mat_number_127.JPG' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-5703677593387823456</id><published>2009-01-23T19:15:00.031+08:00</published><updated>2009-02-01T12:01:54.365+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-共變數矩陣</title><content type='html'>共變數(Covariance),為兩個隨機變數的離均差除以母體個數,可以判斷兩個事件隨機變數的相依性,而單一變數的共變數,那就是變異數(Variance)了,共變數以及變異數簡單的定義如下&lt;br /&gt;&lt;br /&gt;變異數&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SXm6KMWAy8I/AAAAAAAABcs/CNALWw_uzNs/s1600-h/mat_number_123.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294467521225739202" style="WIDTH: 122px; CURSOR: hand; HEIGHT: 78px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SXm6KMWAy8I/AAAAAAAABcs/CNALWw_uzNs/s400/mat_number_123.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;共變數&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXm6V8Y49pI/AAAAAAAABc0/BxeB0se9w0o/s1600-h/mat_number_124.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294467723101271698" style="WIDTH: 148px; CURSOR: hand; HEIGHT: 73px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXm6V8Y49pI/AAAAAAAABc0/BxeB0se9w0o/s400/mat_number_124.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而當兩隨機變數為獨立事件的時候&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SXm6hwhnPAI/AAAAAAAABc8/wMM-QQifpSU/s1600-h/mat_number_125.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294467926075063298" style="WIDTH: 198px; CURSOR: hand; HEIGHT: 54px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SXm6hwhnPAI/AAAAAAAABc8/wMM-QQifpSU/s400/mat_number_125.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來提到的是共變數矩陣(Covariance matrix),代表著隨機變數所有共變數的種類,以兩組隨機變數來說所產生的共變數矩陣如下&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SXm9t1Rx9gI/AAAAAAAABdE/OzM_huiLsLs/s1600-h/mat_number_126.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294471432044148226" style="WIDTH: 172px; CURSOR: hand; HEIGHT: 49px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SXm9t1Rx9gI/AAAAAAAABdE/OzM_huiLsLs/s400/mat_number_126.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而三組,四組以上隨機變數的共變數矩陣又是不同情形了,在這邊,隨機變數的個數代表著向量的維度,而他的數對則是同時發生的情形,下面就以座標的簡單例子來示範&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXnC8LADviI/AAAAAAAABdM/Ur35uTD_qtM/s1600-h/mat_number_127.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294477175951703586" style="WIDTH: 168px; CURSOR: hand; HEIGHT: 287px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXnC8LADviI/AAAAAAAABdM/Ur35uTD_qtM/s400/mat_number_127.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這是個維度為2的座標數組,代表的是一個座標平面的點集合,而下面就是給它跑cvCalcCovarMatrix()共變數矩陣的計算方法&lt;br /&gt;&lt;br /&gt;共變數矩陣1&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates[&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;6&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector[&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *CovarMatrix;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *AvgMatrix;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;450&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;450&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;;i++)&lt;br /&gt;&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;Vector[i]=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetReal1D(Vector[i],&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,Coordinates[i*&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetReal1D(Vector[i],&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,Coordinates[i*&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCircle(Image1,cvPoint((&lt;strong&gt;int&lt;/strong&gt;)(Coordinates[i*&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]*&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;),(&lt;strong&gt;int&lt;/strong&gt;)(Coordinates[i*&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]*&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;)),&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CV_AA,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&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;CovarMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AvgMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcCovarMatrix((&lt;strong&gt;const&lt;/strong&gt; CvArr **)Vector,&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CovarMatrix,AvgMatrix,CV_COVAR_SCALE+CV_COVAR_NORMAL);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%f "&lt;/span&gt;,cvGetReal2D(CovarMatrix,i,j));&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Coordinates"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Coordinates"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SXpL_5Piy3I/AAAAAAAABds/zVB-8MsQNu4/s1600-h/pic_number_152.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SXpL_5Piy3I/AAAAAAAABds/zVB-8MsQNu4/s400/pic_number_152.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5294627872997297010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;計算方法:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYUensL044I/AAAAAAAABfc/zlSVBeO8k6c/s1600-h/mat_number_131.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 364px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SYUensL044I/AAAAAAAABfc/zlSVBeO8k6c/s400/mat_number_131.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5297674203895751554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的方法是用個別的向量來實作,向量的維度為2,而圖片顯示的結果為它們二維座標的分佈情況,cvCalcCovarMatrix()必須給它空的平均值向量矩陣來計算,而cvCalcCovarMatrix()它的參數被定義如下&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define CV_COVAR_SCRAMBLED 0&lt;br /&gt;#define CV_COVAR_NORMAL 1&lt;br /&gt;#define CV_COVAR_USE_AVG 2&lt;br /&gt;#define CV_COVAR_SCALE 4&lt;br /&gt;#define CV_COVAR_ROWS 8&lt;br /&gt;#define CV_COVAR_COLS 16&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;由上面可以知道,它是由2的N次方所表達的,所以可以用合成參數的方式來表達cvCalcCovarMatrix()的共變數矩陣函式,也就是說,可以用CV_COVAR_SCRAMBLED+CV_COVAR_ROWS的組合,也可以用CV_COVAR_NORMAL+CV_COVAR_USE_AVG+CV_COVAR_ROWS之類的組合,而它所代表的含意分別是&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;CV_COVAR_SCRAMBLED&lt;/span&gt;&lt;br /&gt;一種共變數矩陣的計算方式,不可以與CV_COVAR_NORMAL合用,表達方式如下&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SXnQpSaETMI/AAAAAAAABdU/XmN98h_8sbU/s1600-h/mat_number_128.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294492244685114562" style="WIDTH: 348px; CURSOR: hand; HEIGHT: 102px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SXnQpSaETMI/AAAAAAAABdU/XmN98h_8sbU/s400/mat_number_128.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;這計算方式在OpenCV說明文件提到為Eigenface的計算方式&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;CV_COVAR_NORMAL&lt;/span&gt;&lt;br /&gt;共變數矩陣計算方式,不可與CV_COVAR_SCRAMBLED合用,表達方式如下&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXnRKyDwBTI/AAAAAAAABdc/aOTJMVdNvMU/s1600-h/mat_number_129.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294492820117128498" style="WIDTH: 349px; CURSOR: hand; HEIGHT: 105px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXnRKyDwBTI/AAAAAAAABdc/aOTJMVdNvMU/s400/mat_number_129.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;這個則是為一般共變數矩陣的計算方式&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;CV_COVAR_USE_AVG&lt;/span&gt;&lt;br /&gt;不用共變數矩陣內建計算平均數的函式,而是自己給予平均數值,可與任何參數共用&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;CV_COVAR_SCALE&lt;/span&gt;&lt;br /&gt;對共變數矩陣的數據做向量個數總和的純量積,用的是除法計算如下的共變數矩陣&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXnRbj7BlkI/AAAAAAAABdk/GWmThmURjDg/s1600-h/mat_number_130.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5294493108380210754" style="WIDTH: 141px; CURSOR: hand; HEIGHT: 116px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXnRbj7BlkI/AAAAAAAABdk/GWmThmURjDg/s400/mat_number_130.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;可與任何參數共用,而如果沒這參數則是無除以N的計算&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;CV_COVAR_ROWS&lt;/span&gt;&lt;br /&gt;將共變數矩陣的輸入值用矩陣的方式表達,而不是用向量的方式,矩陣表達方式以列(Rows)為主,並且參數不可與CV_COVAR_COLS合用&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;CV_COVAR_COLS&lt;/span&gt;&lt;br /&gt;將共變數矩陣的輸入值用矩陣的方式表達,而不是用向量的方式,矩陣表達方式以欄(Columns)為主,並且參數不可與CV_COVAR_ROWS共用&lt;br /&gt;&lt;br /&gt;共變數矩陣有幾個規則,也就是,輸入一定要是方陣,平均數的長度要是向量的維度,而平均數的長度也一定要是向量的大小,然後一定要是用單通道CV_32FC1或是CV_64FC1做為輸入,cvCalcCovarMatrix()函式,第一個引數則必須要用(const CvArr **)強制型別轉換,第二個引數為輸入向量的數目,第三個引數為空的或是非空平均數向量,第四個引數為cvCalcCovarMatrix()這函式要輸入的參數,而下面,則是使用矩陣方式表達共變數矩陣的範例&lt;br /&gt;&lt;br /&gt;共變數矩陣2&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Coordinates[&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;7&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;6&lt;/span&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;&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;&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *CovarMatrix;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *avg;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Vector1,Coordinates,Vector1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Vector[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]=Vector1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CovarMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;avg=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcCovarMatrix((&lt;strong&gt;const&lt;/strong&gt; CvArr **)Vector,&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CovarMatrix,avg,CV_COVAR_SCALE+CV_COVAR_NORMAL+CV_COVAR_ROWS);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%f "&lt;/span&gt;,cvGetReal2D(CovarMatrix,i,j));&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXpMZUHRZdI/AAAAAAAABd0/7DYStIf8iwY/s1600-h/pic_number_153.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SXpMZUHRZdI/AAAAAAAABd0/7DYStIf8iwY/s400/pic_number_153.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5294628309707089362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式碼,如果想用矩陣來表達向量的方式計算共變數矩陣,就必須要將第一個引數設為二維陣列當做輸入,輸入的方式就如上面程式的寫法,而其他地方則是沒什麼差異.&lt;br /&gt;&lt;br /&gt;共變數矩陣在OpenCV內,不但可以做到計算主成分分析(Principal Cmponents Analysis,PCA),以及另一個Mahalanobis距離的計算&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCalcCovarMatrix()&lt;/strong&gt;&lt;br /&gt;計算共變數矩陣,輸入可為多個IplImage或CvMat資料結構,可輸入高維度資料的向量,有多種輸入方式,在資料輸入方面,可以用單一CvMat資料結構,以列(Rows)為主或以行(Columns)為主,使用CV_COVAR_ROWS以及CV_COVAR_COLS的參數輸入,而要做多個IplImage或CvMat資料結構輸入則不需提供CV_COVAR_ROWS,CV_COVAR_COLS的參數,在計算方面,又分為以維度為主的共變數矩陣參數輸入CV_COVAR_NORMAL以及以個數為主的共變數矩陣CV_COVAR_SCRAMBLED,而他也可一自行定義平均值CV_COVAR_USE_AVG,以及除以是否除以共變數矩陣的共變數個數CV_COVAR_SCALE,而這些參數可以自行組合運算,第一個引數為輸入目標向量,第二個引數為輸出目標共變數矩陣,第三個引數為輸入或輸出平均數向量,第四個引數為cvCalcCovarMatrix()共變數計算函式的參數輸入&lt;br /&gt;cvCalcCovarMatrix(輸入多個IplImage或CvMat資料結構,輸出目標共變數矩陣,輸入/出平均數向量,共變數矩陣參數或代號)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-5703677593387823456?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/5703677593387823456/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=5703677593387823456' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/5703677593387823456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/5703677593387823456'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2009/01/opencv_23.html' title='OpenCV統計應用-共變數矩陣'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HcQD5f5sLPc/SXm6KMWAy8I/AAAAAAAABcs/CNALWw_uzNs/s72-c/mat_number_123.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-1823391002177582284</id><published>2009-01-02T21:45:00.023+08:00</published><updated>2009-01-03T14:47:21.656+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-直方圖比較</title><content type='html'>cvCompareHist(),是比較兩個統計直方圖的分布,總共有四個方法,被定義如下：&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;#define CV_COMP_CORREL 0&lt;br /&gt;#define CV_COMP_CHISQR 1&lt;br /&gt;#define CV_COMP_INTERSECT 2&lt;br /&gt;#define CV_COMP_BHATTACHARYYA 3&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;而這些方法分別為相關係數,卡方,交集法以及在做常態分布比對的Bhattacharyya距離,這些方法都是用來做統計直方圖的相似度比較的方法,而且,都是根據統計學的概念,這邊就簡單的拿來用灰階統計直方圖來比較,而這部份的比較方式,是由圖形的色彩結構來著手,下面就簡單的用三種情況來分析它們距離比較的方式&lt;br /&gt;&lt;br /&gt;直方圖比較實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"RiverBank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image2=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"DarkClouds.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1=cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram2=cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image2,Histogram2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram2,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"CV_COMP_CORREL : %.4f\n"&lt;/span&gt;,cvCompareHist(Histogram1,Histogram2,CV_COMP_CORREL));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"CV_COMP_CHISQR : %.4f\n"&lt;/span&gt;,cvCompareHist(Histogram1,Histogram2,CV_COMP_CHISQR));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"CV_COMP_INTERSECT : %.4f\n"&lt;/span&gt;,cvCompareHist(Histogram1,Histogram2,CV_COMP_INTERSECT));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"CV_COMP_BHATTACHARYYA : %.4f\n"&lt;/span&gt;,cvCompareHist(Histogram1,Histogram2,CV_COMP_BHATTACHARYYA));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Image1"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Image2"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Image1"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Image2"&lt;/span&gt;,Image2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxiWukKT9I/AAAAAAAABS4/w7q-u8Swfjs/s1600-h/Riverbank.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5259186607458242514" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxiWukKT9I/AAAAAAAABS4/w7q-u8Swfjs/s400/Riverbank.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRREY4u3rSI/AAAAAAAABVo/NGfn_M8hZ0g/s1600-h/DarkClouds.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5265909058639473954" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 300px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRREY4u3rSI/AAAAAAAABVo/NGfn_M8hZ0g/s400/DarkClouds.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SV7RfslCwmI/AAAAAAAABZ0/loewT3yOPcU/s1600-h/Black.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286893355052221026" style="WIDTH: 215px; CURSOR: hand; HEIGHT: 254px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SV7RfslCwmI/AAAAAAAABZ0/loewT3yOPcU/s400/Black.JPG" border="0" /&gt;&lt;/a&gt;&amp;nbsp&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SV7RVw3QepI/AAAAAAAABZs/QlK6-_kgs14/s1600-h/White.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286893184403667602" style="WIDTH: 215px; CURSOR: hand; HEIGHT: 254px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SV7RVw3QepI/AAAAAAAABZs/QlK6-_kgs14/s400/White.JPG" border="1" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;br /&gt;(1)RiverBank.jpg &lt;code&gt;&amp;amp;&lt;/code&gt; DarkClouds.jpg&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SV7TW7Y2tSI/AAAAAAAABZ8/fqGLR2OGs6Q/s1600-h/pic_number_149.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286895403432064290" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SV7TW7Y2tSI/AAAAAAAABZ8/fqGLR2OGs6Q/s400/pic_number_149.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Output:&lt;br /&gt;CV_COMP_CORREL : -0.1407&lt;br /&gt;CV_COMP_CHISQR : 0.6690&lt;br /&gt;CV_COMP_INTERSECT : 0.4757&lt;br /&gt;CV_COMP_BHATTACHARYYA : 0.4490&lt;br /&gt;&lt;br /&gt;(2)RiverBank.jpg &lt;code&gt;&amp;amp;&lt;/code&gt; RiverBank.jpg&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SV7T5vD4JVI/AAAAAAAABaE/o6XD4BjYr_g/s1600-h/pic_number_150.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286896001418274130" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SV7T5vD4JVI/AAAAAAAABaE/o6XD4BjYr_g/s400/pic_number_150.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Output:&lt;br /&gt;CV_COMP_CORREL : 1&lt;br /&gt;CV_COMP_CHISQR : 0&lt;br /&gt;CV_COMP_INTERSECT : 1&lt;br /&gt;CV_COMP_BHATTACHARYYA : 0&lt;br /&gt;&lt;br /&gt;(3)Black.jpg &lt;code&gt;&amp;amp;&lt;/code&gt; White.jpg&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SV7UTnxHdUI/AAAAAAAABaM/GbZzUC9SarU/s1600-h/pic_number_151.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286896446137136450" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 250px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SV7UTnxHdUI/AAAAAAAABaM/GbZzUC9SarU/s400/pic_number_151.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Output:&lt;br /&gt;CV_COMP_CORREL : 1&lt;br /&gt;CV_COMP_CHISQR : 1&lt;br /&gt;CV_COMP_INTERSECT : 0&lt;br /&gt;CV_COMP_BHATTACHARYYA : 1&lt;br /&gt;&lt;br /&gt;這邊的直方圖比較,則是將它們的統計直方圖用cvNormalizeHist()正規化成1,在由正規化的統計分佈來做直方圖的比較,從上面的輸出結果可以推測出,卡方法以及Bhattacharyya是數值越小圖形越相似,而相關係數則是看圖形的分佈程度,因此第三個Black.jpg&lt;code&gt;&amp;amp;&lt;/code&gt;White.jpg所顯示相關係數的結果才會是1,這邊的圖形比較用的是統計學的方法,而一般的比較方式還有歐幾里德距離的方式,在這個cvCompareHist()的函式,也可以實作出多通道的多維度直方圖比較,而且支援CV_HIST_ARRAY及CV_HIST_SPARSE這兩種直方圖資料結構的格式,而這些比對方法的相關公式如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;相關係數法&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SV7CZqwGqBI/AAAAAAAABY8/W8PfxV1yIF0/s1600-h/mat_number_117.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286876758808111122" style="WIDTH: 276px; CURSOR: hand; HEIGHT: 97px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SV7CZqwGqBI/AAAAAAAABY8/W8PfxV1yIF0/s400/mat_number_117.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;而它的公式推導如下&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SV7crX5Kd8I/AAAAAAAABaU/GQB-gy6ucK0/s1600-h/mat_number_118.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 261px; height: 206px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SV7crX5Kd8I/AAAAAAAABaU/GQB-gy6ucK0/s400/mat_number_118.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5286905650285803458" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;再來是卡方的方式&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SV7GdikM3xI/AAAAAAAABZM/Vd_atCs12_k/s1600-h/mat_number_119.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286881223376690962" style="WIDTH: 116px; CURSOR: hand; HEIGHT: 49px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SV7GdikM3xI/AAAAAAAABZM/Vd_atCs12_k/s400/mat_number_119.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;這邊的卡方法跟一般的卡方檢定不太一樣,下面是一般適合度檢定(Goodness of fit test)的公式&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SV7H5C8CE6I/AAAAAAAABZU/xzqVOanfYmc/s1600-h/mat_number_120.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286882795434677154" style="WIDTH: 108px; CURSOR: hand; HEIGHT: 46px" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SV7H5C8CE6I/AAAAAAAABZU/xzqVOanfYmc/s400/mat_number_120.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;o為觀察者次數,e為期望值次數&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;交集的方式就比較簡單了,兩個直方圖取最小的做累加&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SV7JG_GodGI/AAAAAAAABZc/6Di-ZywImIg/s1600-h/mat_number_121.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286884134435189858" style="WIDTH: 149px; CURSOR: hand; HEIGHT: 28px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SV7JG_GodGI/AAAAAAAABZc/6Di-ZywImIg/s400/mat_number_121.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;再來就是常態分配比對的Bhattacharyya距離&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SV7KGTDvXbI/AAAAAAAABZk/VJ3Fce4f-HA/s1600-h/mat_number_122.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5286885222123527602" style="WIDTH: 222px; CURSOR: hand; HEIGHT: 61px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SV7KGTDvXbI/AAAAAAAABZk/VJ3Fce4f-HA/s400/mat_number_122.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-1823391002177582284?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/1823391002177582284/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=1823391002177582284' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1823391002177582284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1823391002177582284'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2009/01/opencv.html' title='OpenCV統計應用-直方圖比較'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxiWukKT9I/AAAAAAAABS4/w7q-u8Swfjs/s72-c/Riverbank.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-1598724320973745273</id><published>2008-12-29T12:51:00.015+08:00</published><updated>2008-12-30T09:30:46.793+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-直方圖反向投影</title><content type='html'>影像處理的統計直方圖,可以知道一張圖片在該色彩空間的數據分布狀況,而這邊,就要介紹到直方圖反向投影的函式,直方圖反向投影,也就是將數據分布的狀況依照Look-up table的方式對應回去,實際上,這個函式是跟前面介紹到的cvLUT()是一樣的,只不過,差別是差異在cvLUT()的第三個引數改變成CvHistogram資料結構的輸入,直方圖反向投影,cvCalcBackProject()的第一個引數是輸入單通道IplImage資料結構,第二個引數是輸出單通道IplImage反向投影圖形資料結構,第三個引數是選定要被反向投影的CvHistogram直方圖資料結構,而cvCalcBackProject()把前面提到的Look-up table的計算方式包在cvCalcBackProject()函式的底層,因此,它可以整合CvHistogram這個資料結構做更多的應用,下面這個就是修改前面的範例"OpenCV統計應用-CvHistogram直方圖資料結構",來做直方圖反向投影的程式&lt;br /&gt;&lt;br /&gt;灰階直方圖反向投影&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;CvPoint Point1;&lt;br /&gt;CvPoint Point2;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *GrayImage1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *BackProjectImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image2=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GrayImage1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BackProjectImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth=&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;/HistogramBins;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;GrayImage1,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;5000&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvThreshHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcBackProject(&lt;code&gt;&amp;amp;&lt;/code&gt;GrayImage1,BackProjectImage,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCopy(Image1,Image2,BackProjectImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;printf(&lt;span style="color:#cc0000;"&gt;"%f\n"&lt;/span&gt;,cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage1,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram1"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Back Project RiverBank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Back Project RiverBank"&lt;/span&gt;,Image2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram1"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SVh42lYa75I/AAAAAAAABYk/UPqjm4n4a3M/s1600-h/pic_number_146.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SVh42lYa75I/AAAAAAAABYk/UPqjm4n4a3M/s400/pic_number_146.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5285107041862086546" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這邊就是拿前面灰階去除較小直方圖區塊的程式碼做修改,然後將前面去除最小區塊的部份,對應到彩色的圖片去了,顯示的結果會是,只要是影像裡面灰階值分佈數量比較少的數據,全部都被對應成黑色的像素,也就是全部都變成0,而cvCalcBackProject(),就跟cvLUT()一樣直接拿直方圖的數據去對應,假設一個直方圖從頭開始的數據為254,129,80,70....那麼只要是圖片內像素值為1的數據就會對應到254,1的圖片裡面像素值的數據就會直接變成254,像素值為2的就會對應到129,2的數據就會直接變成129,以此類推,因此,用cvThreshHist()去除小於50的直方圖區段,讓小於50的全部歸0,再來,對他做一個圖片的反向投影,所對應出來的結果雖然不是0或255,可是它卻可以直接拿來當做是遮罩,也就是說,直接拿來給cvCopy()來做對應,因此,反向投影的結果就出來啦,在遮罩的部份就要參考"資料結構操作與運算-圖形的Mask遮罩實作",而這段程式碼則是用到"OpenCV統計應用-CvHistogram資料結構操作"裡面的部份.&lt;br /&gt;&lt;br /&gt;在OpenCV Documentation的部份有提到cvCalcBackProject()可以對HSV色彩空間的Hue做反向投影,到底是怎麼實作出來呢？在OpenCV的Sample Code裡面有一個camshift.c的程式,就是用到這個反向投影的函式,而它的反向投影的簡單範例,原理就如下所示&lt;br /&gt;&lt;br /&gt;HSV色彩空間反向投影&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;IplImage *Image1,*Image2;&lt;br /&gt;IplImage *HSVImage;&lt;br /&gt;IplImage *HueImage;&lt;br /&gt;IplImage *BackProjectHueImage,*BackProjectImage;&lt;br /&gt;CvHistogram *Histogram1;&lt;br /&gt;IplImage *HistogramImage1;&lt;br /&gt;CvPoint Point1,Point2;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HueValue=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;180&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;180&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; onTrackbar(&lt;strong&gt;int&lt;/strong&gt; position);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1 =cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HSVImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HueImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BackProjectHueImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BackProjectImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;180&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCvtColor( Image1, HSVImage, CV_BGR2HSV );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSplit(HSVImage,HueImage,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist( &lt;code&gt;&amp;amp;&lt;/code&gt;HueImage, Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;5000&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvZero( HistogramImage1 );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNot(HistogramImage1,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth = HistogramImage1-&amp;gt;width/HistogramBins;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point1=cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%d\n"&lt;/span&gt;,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(HistogramImage1,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Hue Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCreateTrackbar(&lt;span style="color:#cc0000;"&gt;"Hue Thresh"&lt;/span&gt;,&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HueValue,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;,onTrackbar);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Hue Histogram"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; onTrackbar(&lt;strong&gt;int&lt;/strong&gt; position)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image2=cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram2= cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCopyHist(Histogram1,&lt;code&gt;&amp;amp;&lt;/code&gt;Histogram2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvThreshHist(Histogram2,position);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcBackProject(&lt;code&gt;&amp;amp;&lt;/code&gt;HueImage, BackProjectHueImage, Histogram2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCopy(Image1,Image2,BackProjectHueImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvZero( HistogramImage1 );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNot(HistogramImage1,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth = HistogramImage1-&amp;gt;width/HistogramBins;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point1=cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram2,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%d\n"&lt;/span&gt;,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram2,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(HistogramImage1,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Hue Histogram"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SVh5AbaC8fI/AAAAAAAABYs/IxJfZBppSw8/s1600-h/pic_number_147.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SVh5AbaC8fI/AAAAAAAABYs/IxJfZBppSw8/s400/pic_number_147.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5285107210983240178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在OpenCV裡面,HSV色彩空間,色調(Hue)值的範圍在0~180,飽和度(Saturation)的範圍在0~255,亮度(Value)的範圍在0~255,而這邊就只取色調(Hue)值在做反向投影,開啟了一個Track bar的功能,並且利用cvCvtColor()將BGR的色彩空間轉換成HSV,並且用cvSplit()通道分割取Hue通道的圖片,計算Hue值的直方圖,在onTrackbar()的部份,則是用Trackbar來調整去除cvThreshHist()的最小區塊的臨界值,去除之後在反向投影到原始的Hue的圖片,在由反向投影的結果當做遮罩,直接跟彩色圖片做對應.&lt;br /&gt;&lt;br /&gt;而cvCalcBackProject()不單單只有這樣的功能,它可以對多維度空間的色彩直方圖做對應,cvCalcBackProject()提供了一個當CvHistogram資料結構維度為3的時候的一個反向投影,下面的這個例子就以HSV的色彩空間為例,建構一個三維的CvHistogram資料結構&lt;br /&gt;&lt;br /&gt;HSV三維直方圖反向投影&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;IplImage *Image1,*Image2;&lt;br /&gt;IplImage *HSV;&lt;br /&gt;IplImage *HueImage,*SaturationImage,*ValueImage;&lt;br /&gt;IplImage *ImageArray[3];&lt;br /&gt;IplImage *BackProjectImage;&lt;br /&gt;CvHistogram *Histogram1;&lt;br /&gt;IplImage *HistogramImage1;&lt;br /&gt;CvPoint Point1,Point2;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HueValue=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins[&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;] ={&lt;span style="color:#cc33cc;"&gt;180&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;180&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;],&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;],&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;]};&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; onTrackbar(&lt;strong&gt;int&lt;/strong&gt; position);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1 =cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HSV = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HueImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SaturationImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ValueImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageArray[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]=HueImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageArray[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]=SaturationImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ImageArray[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]=ValueImage;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BackProjectImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt; );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,HistogramBins,CV_HIST_SPARSE,HistogramRange);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCvtColor( Image1, HSV, CV_BGR2HSV );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSplit(HSV,HueImage,SaturationImage,ValueImage,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist( ImageArray, Histogram1);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCreateTrackbar(&lt;span style="color:#cc0000;"&gt;"Hue Thresh"&lt;/span&gt;,&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HueValue,&lt;span style="color:#cc33cc;"&gt;200&lt;/span&gt;,onTrackbar);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; onTrackbar(&lt;strong&gt;int&lt;/strong&gt; position)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram2= cvCreateHist(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,HistogramBins,CV_HIST_SPARSE,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image2=cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt; );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *BackProjectImage = cvCreateImage( cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt; );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCopyHist(Histogram1,&lt;code&gt;&amp;amp;&lt;/code&gt;Histogram2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvThreshHist(Histogram2,position);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcBackProject( ImageArray, BackProjectImage, Histogram2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCopy(Image1,Image2,BackProjectImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SVh5Kj889tI/AAAAAAAABY0/Ey3WjC3RQQQ/s1600-h/pic_number_148.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SVh5Kj889tI/AAAAAAAABY0/Ey3WjC3RQQQ/s400/pic_number_148.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5285107385075824338" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在三維空間的作法上面,就要參考到前面"OpenCV統計應用-CvHistogram直方圖資料結構"關於三維空間製作的部份,除了用cvCvtColor()將色彩空間轉換,用cvSplit()將通道做分割,還要做個圖形陣列(ImageArray)來讓cvCalcHist()這個函式做運算,計算出來的結果為一個CvHistogram的三維空間稀疏矩陣直方圖,而在onTrackbar()的部份,cvCalcBackProject()直方圖反向投影亦是同樣要用ImageArray做輸入,而輸出則是一個單通道的圖形,在稀疏矩陣裡面,由於維度為三維,所以他所形成的統計直方圖數值都是極小,所以門檻值只要一點點就快要全部都分佈了,而這個三維空間的反向投影可以如此建構,是基於Look-up table的功能來實現,只不過他的缺點是,每一個維度的Look-up table範圍是0~255,因此如果是像Hue值的範圍0~180,它的數值就會被模糊化,也就是數據會被些許位移,但是仍不會影響它出來結果的精確度&lt;br /&gt;&lt;br /&gt;在這個直方圖反向投影的部份,也可以結合連通成分來做去除某一門檻值的連通分量&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCalcBackProject()&lt;/strong&gt;&lt;br /&gt;將統計直方圖的分布數據根據Look-up table對應回去,也就是說,當今天CvHistogram資料結構內的數據分佈是243,110,0,60...則使用cvCalcBackProject()函式單通道的圖片像素值會是,當遇到像素值為1的時候變243,像素值為2的時候變110,依此類推,cvCalcBackProject()直方圖反向投影可以根據多維度設計,而cvCalcBackProject()第一個引數為輸入單通道IplImage或CvMat資料結構,第二個引數為輸入單通道反向投影IplImage或CvMat資料結構,第三個引數為輸入CvHistogram資料結構&lt;br /&gt;cvCalcBackProject(輸入單通道IplImage或CvMat資料結構,輸入單通道反向投影IplImage或CvMat資料結構,輸入CvHistogram資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-1598724320973745273?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/1598724320973745273/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=1598724320973745273' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1598724320973745273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1598724320973745273'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/12/opencv.html' title='OpenCV統計應用-直方圖反向投影'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HcQD5f5sLPc/SVh42lYa75I/AAAAAAAABYk/UPqjm4n4a3M/s72-c/pic_number_146.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-7093915960202452123</id><published>2008-11-12T13:08:00.020+08:00</published><updated>2008-11-15T13:14:51.268+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-影像增強,亮度/對比實作</title><content type='html'>在一般顯示螢幕以及圖形處理的應用軟體上,都會有一個亮度/對比的色彩(Brightness/Contrast)調整,它是屬於影像增強的部份,在OpenCV裡面的Sample Code裡面就有這樣的灰階程式的實作,在這邊就修改了OpenCV的Sample Code,來做色彩增強的亮度/對比的程式,而在一般的亮度/對比來講亮度(Brightness)的範圍為0~200而對比(Contrast)亦是0~200,它們由一條線性函數的公式所定義,對比所代表的是斜率,亮度則是偏移量,這條線性公式代表的是Look-up table的對應,它的數學式定義如下&lt;br /&gt;&lt;br /&gt;原始的亮度對比數值範圍為-100~100之間,C代表對比,B代表亮度&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1nJi0E2qI/AAAAAAAABW0/X9jQbpaIlbg/s1600-h/mat_number_111.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268480552755059362" style="WIDTH: 108px; CURSOR: hand; HEIGHT: 44px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1nJi0E2qI/AAAAAAAABW0/X9jQbpaIlbg/s400/mat_number_111.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;對於對比率(Contrast ratio)來講,delta範圍應該落在0~255,這邊將對比率的公式做重新的調整&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR1ns5XVUsI/AAAAAAAABW8/vGCrS9kLSto/s1600-h/mat_number_112.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268481160103940802" style="WIDTH: 242px; CURSOR: hand; HEIGHT: 83px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR1ns5XVUsI/AAAAAAAABW8/vGCrS9kLSto/s400/mat_number_112.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SR1oxhrLoLI/AAAAAAAABXE/pMJB_GV_Qfw/s1600-h/mat_number_113.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268482339155714226" style="WIDTH: 88px; CURSOR: hand; HEIGHT: 49px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SR1oxhrLoLI/AAAAAAAABXE/pMJB_GV_Qfw/s400/mat_number_113.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;對比率代表著斜率的α值,而亮度則是決定線性公式位移的情況,也就是β值,而Y=αX+β這個線性公式它所表達的情況如下&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1pLDm2KMI/AAAAAAAABXM/QcymgNTaXsM/s1600-h/mat_number_114.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268482777761065154" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 72px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1pLDm2KMI/AAAAAAAABXM/QcymgNTaXsM/s400/mat_number_114.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;α值的範圍落在0~255之間,而它的情況如下&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR1p3jSqXQI/AAAAAAAABXU/hXK4RO6YPWs/s1600-h/mat_number_115.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268483542180584706" style="WIDTH: 218px; CURSOR: hand; HEIGHT: 73px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR1p3jSqXQI/AAAAAAAABXU/hXK4RO6YPWs/s400/mat_number_115.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來下面是用虛擬碼的方式表達亮度/對比的演算法&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1qhaih7YI/AAAAAAAABXc/Aim0Uo-eIEU/s1600-h/mat_number_116.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5268484261385727362" style="WIDTH: 120px; CURSOR: hand; HEIGHT: 400px" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1qhaih7YI/AAAAAAAABXc/Aim0Uo-eIEU/s400/mat_number_116.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;下面就是亮度/對比的程式了&lt;br /&gt;&lt;br /&gt;亮度/對比實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; BrightnessPosition = &lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; ContrastPosition = &lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;64&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;IplImage *Image1,*Image2;&lt;br /&gt;CvHistogram *Histogram1;&lt;br /&gt;IplImage *HistogramImage;&lt;br /&gt;&lt;br /&gt;uchar LookupTableData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;];&lt;br /&gt;CvMat *LookupTableMatrix;&lt;br /&gt;IplImage *LookupTableImage;&lt;br /&gt;CvPoint Point1,Point2;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; OnTrackbar(&lt;strong&gt;int&lt;/strong&gt; Position)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;int&lt;/strong&gt; Brightness=BrightnessPosition-&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;int&lt;/strong&gt; Contrast=ContrastPosition -&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; Delta;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; a,b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;int&lt;/strong&gt; y;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//Brightness/Contrast Formula&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt;(Contrast&amp;gt;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;)&lt;br /&gt;&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;Delta=&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;*Contrast/&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;/(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;-Delta*&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b=a*(Brightness-Delta);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; x=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;x&amp;lt;&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;x++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=(&lt;strong&gt;int&lt;/strong&gt;)(a*x+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;&lt;strong&gt;if&lt;/strong&gt;(y&amp;lt;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&lt;strong&gt;if&lt;/strong&gt;(y&amp;gt;&lt;span style="color:#cc33cc;"&gt;255&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;;&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;LookupTableData[x]=(uchar)y;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;&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;Delta=-&lt;span style="color:#cc33cc;"&gt;128&lt;/span&gt;*Contrast/&lt;span style="color:#cc33cc;"&gt;100&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a=(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;-Delta*&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;)/&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;b=a*Brightness+Delta;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; x=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;x&amp;lt;&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;x++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=(&lt;strong&gt;int&lt;/strong&gt;)(a*x+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;&lt;strong&gt;if&lt;/strong&gt;(y&amp;lt;&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;&lt;strong&gt;if&lt;/strong&gt;(y&amp;gt;&lt;span style="color:#cc33cc;"&gt;255&lt;/span&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;;&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;LookupTableData[x]=(uchar)y;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//Look up table sketch&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(LookupTableImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNot(LookupTableImage,LookupTableImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,LookupTableData[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;i++)&lt;br /&gt;&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;Point1=cvPoint(i,LookupTableData[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(LookupTableImage,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=Point1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLUT(Image1,Image2,LookupTableMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//Gray Level Histogram&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image2,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;3000&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(HistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNot(HistogramImage,HistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth = HistogramImage-&amp;gt;width/HistogramBins;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),CV_FILLED);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Gray Level Histogram"&lt;/span&gt;,HistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Brightness/Contrast"&lt;/span&gt;,Image2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Image Enhance"&lt;/span&gt;,LookupTableImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvZero(Image2);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"DarkClouds.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image2=cvCloneImage(Image1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1=cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;320&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;200&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LookupTableImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LookupTableMatrix=cvCreateMatHeader(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,CV_8UC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(LookupTableMatrix,LookupTableData,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LookupTableImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Brightness/Contrast"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Gray Level Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Image Enhance"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCreateTrackbar(&lt;span style="color:#cc0000;"&gt;"brightness"&lt;/span&gt;,&lt;span style="color:#cc0000;"&gt;"Brightness/Contrast"&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;BrightnessPosition,&lt;span style="color:#cc33cc;"&gt;200&lt;/span&gt;,OnTrackbar);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCreateTrackbar(&lt;span style="color:#cc0000;"&gt;"contrast"&lt;/span&gt;,&lt;span style="color:#cc0000;"&gt;"Brightness/Contrast"&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;ContrastPosition,&lt;span style="color:#cc33cc;"&gt;200&lt;/span&gt;,OnTrackbar);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;OnTrackbar(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SR17GKIv49I/AAAAAAAABXk/NzjpZcH-WwI/s1600-h/pic_number_140.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SR17GKIv49I/AAAAAAAABXk/NzjpZcH-WwI/s400/pic_number_140.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5268502484823827410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這隻程式同樣也是用到CvHistogram資料結構,使用到兩個拉軸(Trackbar),以及Look-up table的應用,在//Brightness/Contrast Formula的註解內所包的就是亮度/對比演算法虛擬碼的實作,再來就是把它的線性系統化出來,也就是Y=αX+β的函數方程式,這個方程式,當然同等於Look up table,而之後,在把他們灰階直方圖的分布畫出來,在main()裡面,當然是先讀取目標圖片轉成灰階,初始化繪製直方圖與線性系統圖片的空間,創立三個視窗介面,設立兩個拉軸,並且將拉軸的事件函式設定成同一個的副程式的名稱.而對於影像增強(Image Enhance)這個視窗介面,它所代表的含意如下&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SR4tqZDbZmI/AAAAAAAABXs/A_ZNsm3F_mk/s1600-h/pic_number_141.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 364px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SR4tqZDbZmI/AAAAAAAABXs/A_ZNsm3F_mk/s400/pic_number_141.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5268698820373079650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;X軸代表為是原始灰階的輸入值,而Y軸代表的是灰階值所對應的結果,而X軸跟Y軸的範圍都是0~255,而這條直線公式也會受到斜率(α)以及平移(β)的結果改面灰階值輸入以及輸出的對應,它是將一張原始灰階圖片的每一個像素值做線性函式的對應,使得每個灰階值對應出來的結果產生了變化,由下面可以知道它(LUT)對應的關係&lt;br /&gt;&lt;br /&gt;(a)亮度條為0因此小於100的灰階值都為0而灰階值方圖也像左偏移&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR4xVffClLI/AAAAAAAABX0/0FewdVmkgxY/s1600-h/pic_number_142.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR4xVffClLI/AAAAAAAABX0/0FewdVmkgxY/s400/pic_number_142.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5268702859368764594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(b)亮度條為100,因此大於156的灰階值都為255,而灰階值方圖也都向右偏移&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR4yp5awOyI/AAAAAAAABX8/yJrXKrWi-S4/s1600-h/pic_number_143.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR4yp5awOyI/AAAAAAAABX8/yJrXKrWi-S4/s400/pic_number_143.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5268704309439118114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(c)對比為0,這個時候斜率α為0,因此輸入的0~255的灰階值輸出都固定為128,因此整張圖片都是灰階值128的影像,而灰階直方圖則是所有數據都集中在128&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR40RLcjHDI/AAAAAAAABYE/NTWEZaG5qp4/s1600-h/pic_number_144.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR40RLcjHDI/AAAAAAAABYE/NTWEZaG5qp4/s400/pic_number_144.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5268706083805010994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;(d)對比為100,這個時候斜率為255,而這樣的圖片又可以叫做二值化圖片,因為輸出結果非黑即白,而移動亮度則是在平移二值化的門檻值,由灰階值方圖可以得知,所有數據都被分開到0跟255兩邊&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR422M6vZaI/AAAAAAAABYU/VzVi2xhMkGA/s1600-h/pic_number_145.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SR422M6vZaI/AAAAAAAABYU/VzVi2xhMkGA/s400/pic_number_145.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5268708918878496162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面所表達的其實就是一種Look-up table的表達方式,藉由一個輸入灰階值的矩陣,對應岀另一個不同的灰階值數據,因此改變了原始灰階值的數據,而整張圖片也因此產生了變化&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-7093915960202452123?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/7093915960202452123/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=7093915960202452123' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7093915960202452123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7093915960202452123'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/11/opencv_12.html' title='OpenCV統計應用-影像增強,亮度/對比實作'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SR1nJi0E2qI/AAAAAAAABW0/X9jQbpaIlbg/s72-c/mat_number_111.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-4053418721539963344</id><published>2008-11-07T17:44:00.029+08:00</published><updated>2008-11-13T10:00:27.087+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-直方圖等化</title><content type='html'>直方圖等化(Histogram Equalization)為一種使用統計方法的影像處理程式設計,它的功能為將統計直方圖的色彩分布平均的打散在直方圖裡,也就是說,讓一張圖的直方圖分布均勻化,同樣的也是使用到LUT(Look-up Table)的方法&lt;br /&gt;&lt;br /&gt;而在設計直方圖等化不可或缺的就是需要先知道統計學的機率密度函數(Probability Density Function,PDF)以及累積分配函數(Cumlative Distribution Function,CDF)相關的基本概念,在這邊會簡單的說明機率密度函數及累積分配函數的概念還有直方圖等化的程式設計實作,而OpenCV也提供了直接使用直方圖等化的函式,cvEqualizeHist(),下面就簡單的製作直方圖等化的程式設計&lt;br /&gt;&lt;br /&gt;RGB結構直方圖等化&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *RedImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *GreenImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *BlueImage;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"DarkClouds.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image2=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RedImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GreenImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BlueImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSplit(Image1,BlueImage,GreenImage,RedImage,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvEqualizeHist(BlueImage,BlueImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvEqualizeHist(GreenImage,GreenImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvEqualizeHist(RedImage,RedImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvMerge(BlueImage,GreenImage,RedImage,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,Image2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"DarkClouds"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"DarkClouds"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Equalize DarkClouds"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Equalize DarkClouds"&lt;/span&gt;,Image2);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRREY4u3rSI/AAAAAAAABVo/NGfn_M8hZ0g/s1600-h/DarkClouds.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRREY4u3rSI/AAAAAAAABVo/NGfn_M8hZ0g/s400/DarkClouds.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5265909058639473954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SRRD9tJHqfI/AAAAAAAABVg/HclJ82es0_w/s1600-h/pic_number_138.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SRRD9tJHqfI/AAAAAAAABVg/HclJ82es0_w/s400/pic_number_138.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5265908591671880178" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;當然,使用了函式之後就完全不用知道直方圖等化在跑什麼啦,cvEqualizeHist()只支援單通道uchar型別的圖片資料結構,因此,就需要用cvSplit()分割,而這裡所做的是將RGB三原色直接做直方圖等化,這個直方圖等化的結果是彩色的,將個別的RGB直分割後再用cvMerge()合併,通道分割與合併的部份就要參考"資料結構操作與運算-通道的分割,合併與混合"這個地方了.&lt;br /&gt;&lt;br /&gt;再來就是比較複雜的直方圖等化演算法,要知道直方圖等化如何計算就要知道以下的步驟&lt;br /&gt;&lt;br /&gt;1.資料結構初始化&lt;br /&gt;2.機率密度函數(PDF)的計算&lt;br /&gt;3.累積分配函數(CDF)的計算&lt;br /&gt;4.LUT對應&lt;br /&gt;&lt;br /&gt;在機率密度函數的部分,在統計直方圖來講,它的X軸範圍會落在0~255,而它的Y軸範圍代表著機率,由0~255對應的數據代表著它發生的機率,也就是說,這代表著0到255數值出現的機率分佈,0~255代表著所有的機率的範圍,那從0加到255的總和會為1!它所代表的公式如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PDF機率分佈&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRT7TLEmA3I/AAAAAAAABWE/NVrAgSFCDpc/s1600-h/pic_number_136.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 328px; height: 300px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRT7TLEmA3I/AAAAAAAABWE/NVrAgSFCDpc/s400/pic_number_136.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5266110171111097202" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRRDJ-Uj-GI/AAAAAAAABVY/0Uv4uXjbr08/s1600-h/mat_number_109.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 85px; height: 46px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRRDJ-Uj-GI/AAAAAAAABVY/0Uv4uXjbr08/s400/mat_number_109.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5265907702930077794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;而累積分配函數就更簡單了,它只是將機率密度函數做累積的計算,也就是說,當數值為255的時候它的機率會為1,而且曲線會是由下往上的成長,表達的方式就是將機率密度函數做累加,它的公式如下&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CDF機率分佈&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SRT7jzg95FI/AAAAAAAABWM/Npsl2AoPINE/s1600-h/pic_number_137.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 346px; height: 333px;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SRT7jzg95FI/AAAAAAAABWM/Npsl2AoPINE/s400/pic_number_137.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5266110456845427794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SRQxG56y0_I/AAAAAAAABU4/mMwZgmu1ylw/s1600-h/mat_number_110.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5265887858999350258" style="WIDTH: 222px; CURSOR: hand; HEIGHT: 46px" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SRQxG56y0_I/AAAAAAAABU4/mMwZgmu1ylw/s400/mat_number_110.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;再來是LUT的部份了,它只是開一個0~255的陣列做對應,將累積分配函數的數值乘以255,將它存放在0~255的陣列裡,這樣會出現許多重複的部份,因此,將Look-up table對應原來的圖形的灰階值,就可以將原本的統計直方圖分布打散掉了,而且直方圖等化的結果也會發現很多地方數值是空心的,也是因為如此,直方圖的分布就會向外推擠了&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRQ5kNxW_LI/AAAAAAAABVI/HLCJixJt7Xs/s1600-h/Look-upTable.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5265897158637714610" style="WIDTH: 400px; CURSOR: hand; HEIGHT: 123px" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SRQ5kNxW_LI/AAAAAAAABVI/HLCJixJt7Xs/s400/Look-upTable.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;累積分配直方圖乘255存在LUT陣列的情況&lt;br /&gt;&lt;br /&gt;再來,就是直方圖等化的程式了&lt;br /&gt;&lt;br /&gt;灰階直方圖等化&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;stdio.h&amp;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;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; CumulativeNumber;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; CDFArray[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;];&lt;br /&gt;uchar LookupTableData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; DrawHistogramImage(CvHistogram *Histogram,IplImage *HistogramImage,&lt;strong&gt;int&lt;/strong&gt; HistogramBins);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *LookupTableMatrix;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *GrayHistogramImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *EqualizeHistogramImage;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"DarkClouds.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image2=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram2 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LookupTableMatrix = cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,CV_8UC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GrayHistogramImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EqualizeHistogramImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GrayHistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;EqualizeHistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DrawHistogramImage(Histogram1,GrayHistogramImage,HistogramBins);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//Probability Density Function (PDF)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//Cumulative Distribution Function (CDF)&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CumulativeNumber=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;CumulativeNumber=CumulativeNumber+cvQueryHistValue_1D(Histogram1,i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CDFArray[i]=CumulativeNumber;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//Make Look-up Table&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Look-up Table Number:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;LookupTableData[i]=(uchar)(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;*CDFArray[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%f\n"&lt;/span&gt;,(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;*CDFArray[i]));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color:#219399;"&gt;//End&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(LookupTableMatrix,LookupTableData,CV_AUTOSTEP);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLUT(Image1,Image2,LookupTableMatrix);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image2,Histogram2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DrawHistogramImage(Histogram2,EqualizeHistogramImage,HistogramBins);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"DarkClouds"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Equalize DarkClouds"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Gray Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Equalize Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"DarkClouds"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Equalize DarkClouds"&lt;/span&gt;,Image2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Gray Histogram"&lt;/span&gt;,GrayHistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Equalize Histogram"&lt;/span&gt;,EqualizeHistogramImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; DrawHistogramImage(CvHistogram *Histogram,IplImage *HistogramImage,&lt;strong&gt;int&lt;/strong&gt; HistogramBins)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;Point1=cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)(cvQueryHistValue_1D(Histogram,i)/&lt;span style="color:#cc33cc;"&gt;20&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(HistogramImage,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SRRFjI5P4dI/AAAAAAAABVw/40_CbYj2PvE/s1600-h/pic_number_139.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SRRFjI5P4dI/AAAAAAAABVw/40_CbYj2PvE/s400/pic_number_139.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5265910334288290258" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;前面資料結構初始化的部份,分別製造了兩個IplImage圖形資料結構,兩個CvHistogram直方圖資料結構,一個Look-up table對應矩陣結構,兩個直方圖圖形輸出的資料結構,並且將它做基本的設定,在用cvCalcHist()放入圖形的資料,繪製出灰階直方圖的圖形,再來,利用cvNormalizeHist()計算機率密度函數(PDF),機率密度函數有一條規則,所有機率的總和為1,因此,利用cvNormalizeHist()很快的就可以把機率密度函數算出,而在做累積分配直方圖,則是用for迴圈慢慢的累加,製造Look-up Table的時候,則是讓它乘以255並且給它用uchar型別轉換,將轉換後的結果存到CvMatrix資料結構裡,在用cvLUT()函式做對應,因此均化的灰階圖片就這樣被製造出來啦.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvEqualizeHist()&lt;/strong&gt;&lt;br /&gt;將單通道8bits uchar型別的圖片做直方圖等化的演算法,輸入為單通道uchar型別的IplImage資料結構,輸出為直方圖等化後單通道uchar型別IplImage資料結構&lt;br /&gt;cvEqualizeHist(輸入單通道uchar型別IplImage資料結構,輸出單通道uchar型別資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-4053418721539963344?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/4053418721539963344/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=4053418721539963344' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/4053418721539963344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/4053418721539963344'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/11/opencv.html' title='OpenCV統計應用-直方圖等化'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HcQD5f5sLPc/SRREY4u3rSI/AAAAAAAABVo/NGfn_M8hZ0g/s72-c/DarkClouds.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-1787125089040676903</id><published>2008-11-01T16:28:00.020+08:00</published><updated>2008-11-12T13:53:06.651+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-CvHistogram資料結構操作</title><content type='html'>CvHistogram資料結構有提供一些基本的功能,有許多可以不必去直接處理CvHistogram資料結構內部資料的函數,接著就修改前面灰階直方圖的部分做簡單操作的實作&lt;br /&gt;&lt;br /&gt;不同範圍灰階直方圖&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; MinValue,MaxValue;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; MinIndex,MaxIndex;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage2 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage2-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth=&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;/HistogramBins;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;5000&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvGetMinMaxHistValue(Histogram1,&lt;code&gt;&amp;amp;&lt;/code&gt;MinValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MinIndex,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxIndex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Histogram1\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Minimum value : %f\tIndex :%d\n"&lt;/span&gt;,MinValue,MinIndex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Maximum value : %f\tIndex :%d\n"&lt;/span&gt;,MaxValue,MaxIndex);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage1,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;cvClearHist(Histogram1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]=&lt;span style="color:#cc33cc;"&gt;30&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]=&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramRange[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]=&lt;code&gt;&amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetHistBinRanges(Histogram1,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;5000&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvGetMinMaxHistValue(Histogram1,&lt;code&gt;&amp;amp;&lt;/code&gt;MinValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MinIndex,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxIndex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nHistogram2\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Minimum value : %f\tIndex :%d\n"&lt;/span&gt;,MinValue,MinIndex);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Maximum value : %f\tIndex :%d\n"&lt;/span&gt;,MaxValue,MaxIndex);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage2,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;cvReleaseHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram1"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram2"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram1"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram2"&lt;/span&gt;,HistogramImage2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SQzjswa2eYI/AAAAAAAABTY/fSPqLAyR20w/s1600-h/pic_number_133.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SQzjswa2eYI/AAAAAAAABTY/fSPqLAyR20w/s400/pic_number_133.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5263832422540540290" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這個執行出來得結果可以看得出來,直方圖的範圍改變之後,長方形的數據有向右平移的樣子,而在之前的前面的程式碼cvQueryHistValue_1D()所直接輸出的數據實在是過大了,在繪製直方圖的時候一定會超出座標軸的範圍,所以就在前面的程式碼以全部除以50來代替,這邊,改用另外一個解決的方法,cvNormalizeHist(),這個函數是將直方圖所有區塊加起來會等於5000,也就是直方圖數據的總和會等於5000,因此,用這種量化的方式可以避免直方圖因為數據過大而圖形繪不出來的問題,近而縮小直方圖所有的數據,當然,這樣的結果直方圖數據會變成相對的,而cvNormalizeHist()內部則是使用到了cvScale()這個函式來計算,cvGetMinMaxHistValue(),則是找出直方圖的最大值跟最小值的方法,跟前面的最大最小值不太一樣的地方,這邊找出了直方圖的最大值將會代表的是眾數,在統計上是很具意義的東西,cvGetMinMaxHistValue()同樣內部使用的是cvMinMaxLoc()的函式.再來的部分就是用cvClearHist()清除直方圖資料,從新設定直方圖的範圍為30~255,使用cvSetHistBinRanges()的函數,最後再用cvReleaseHist()釋放CvHistogram的記憶體&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接下來的這個的結果也是有趣,它可以將直方圖較小的區塊去除掉,這個函式在可以用來製作去除最小面積的圖形區塊,當然在這前面就必須要建立一些相關的演算法來建構直方圖,這邊就簡單介紹cvThreshHist()的操作&lt;br /&gt;&lt;br /&gt;去除較小直方圖區塊&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; MinValue,MaxValue;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; MinIndex,MaxIndex;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage2 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage2-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth=&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;/HistogramBins;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNormalizeHist(Histogram1,&lt;span style="color:#cc33cc;"&gt;5000&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+1)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage1,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;Histogram2 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCopyHist(Histogram1,&lt;code&gt;&amp;&lt;/code&gt;Histogram2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvThreshHist(Histogram2,&lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram2,i));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage2,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;cvReleaseHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Histogram1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvReleaseHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Histogram2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram1"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram2"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram1"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram2"&lt;/span&gt;,HistogramImage2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SQ0ojGN5sQI/AAAAAAAABTo/OLM5NJgvEOA/s1600-h/pic_number_134.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 400px; height: 250px;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SQ0ojGN5sQI/AAAAAAAABTo/OLM5NJgvEOA/s400/pic_number_134.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5263908122895429890" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在這邊同樣建立了一個50個區塊,範圍為0~255的直方圖,這裡開啟了兩個CvHistogram的資料結構,並且初始化用cvCopyHist()複製直方圖裡面的資料,而第二個直方圖資料結構Histogram2則是給定一個區塊門檻值,也就是當小於50的區塊數據就會被剃掉,因此圖形顯示的結果,小於50數據的直方圖都被刪除了.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvNormalizeHist()&lt;/strong&gt;&lt;br /&gt;將所有直方圖的數據標準化,也就是將所有數據總和為指定的一個數,第一個引數為輸入CvHistogram資料結構,第二個引數為輸入double型別指定總和數據,cvNormalizeHist()內部使用cvScale()函式&lt;br /&gt;cvNormalizeHist(輸入CvHistogram資料結構,輸入double型別總和數據)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvGetMinMaxHistValue()&lt;/strong&gt;&lt;br /&gt;取得直方圖的最大最小值的數據,以及它得位置(Index),對於灰階統計直方圖,可以知道是哪個色彩數據擁有最大值,第一個引數為輸入CvHistogram資料結構,第二個引數為輸出float型別最小值數據,第三個引數為輸出float型別最大值數據,第四個引數為輸出int型別最小值的陣列索引(Index),第五個引數為輸出int型別最大值的陣列索引(Index)&lt;br /&gt;cvGetMinMaxHistValue(輸入CvHistogram資料結構,輸出float最小值數據,輸出float最大值數據,輸出int最小值索引,輸出int最大值索引)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvClearHist()&lt;/strong&gt;&lt;br /&gt;清除目標CvHistogram直方圖資料結構內的資料.&lt;br /&gt;cvClearHist(目標CvHistogram資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvSetHistBinRanges()&lt;/strong&gt;&lt;br /&gt;從新設立直方圖的數據範圍,也就是要挑選的直方圖最小值下限以及最大值上限,第一個引數為輸入CvHistogram資料結構,第二個引數為輸入float型別的範圍二維陣列&lt;br /&gt;cvSetHistBinRanges(輸入CvHistogram資料結構,輸入float型別範圍二維陣列)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvReleaseHist()&lt;/strong&gt;&lt;br /&gt;釋放CvHistogram直方圖資料結構記憶體位址&lt;br /&gt;cvReleaseHist(目標CvHistogram直方圖資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCopyHist()&lt;/strong&gt;&lt;br /&gt;複製目標CvHistogram資料結構,包括設定直以及直方圖數據資料,第一個引數為輸入目標CvHistogram資料結構直方圖,第二個引數為輸出CvHistogram資料結構直方圖&lt;br /&gt;cvCopyHist(輸入CvHistogram資料結構,輸出要被複製的CvHistogram資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvThreshHist()&lt;/strong&gt;&lt;br /&gt;去除小於目標數據的直方圖區塊,第一個引數為輸入CvHistogram直方圖資料結構,第二個引數為輸入double型別要被刪除的直方圖區塊數據大小&lt;br /&gt;cvThreshHist(輸入CvHistogram資料結構,輸入小於門檻值double型別的數據)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-1787125089040676903?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/1787125089040676903/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=1787125089040676903' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1787125089040676903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1787125089040676903'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/11/opencv-cvhistogram.html' title='OpenCV統計應用-CvHistogram資料結構操作'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HcQD5f5sLPc/SQzjswa2eYI/AAAAAAAABTY/fSPqLAyR20w/s72-c/pic_number_133.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-7270980060527025236</id><published>2008-10-23T12:28:00.017+08:00</published><updated>2008-10-23T16:56:54.440+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV安裝'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV 1.1</title><content type='html'>新版的OpenCV 1.1 ,在2008年10月15號發佈,基本上只是優化前一版的內容,刪除了cvcam函式庫,並且提供了一本歐萊里的工具書&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=22870"&gt;http://sourceforge.net/project/showfiles.php?group_id=22870&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notes:&lt;br /&gt;&lt;br /&gt;This is OpenCV 1.1pre1, the first intermediate update after 1.0.It features better stereo support, SURF features, better performance of some functions, DirectShow support in highgui etc. It also includes many bug-fixes.&lt;br /&gt;&lt;br /&gt;Changes:&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; New functionality/features: &lt;&lt;&lt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- General:&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Octave bindings have been added. See interfaces/swig/octave &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(for now, Linux only)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [Windows] OpenCV is now built with VS2005 with SSE2 and OpenMP support included &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(if you want to rebuild OpenCV using Express or Standard Edition of VS, use &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_make\opencv.vs2005.no_openmp.sln).&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [Windows] Python bindings have been updated to use Python 2.6&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [Windows] cvcam has been removed (as videoInput is now supported by highgui)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- CXCORE, CV, CVAUX:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Speeded-up Robust Features (SURF), contributed by Liu Liu.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;see samples/c/find_obj.cpp and the documentation opencvref_cv.htm&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Many improvements in camera calibration:&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;- Added stereo camera calibration: cvStereoCalibrate, cvStereoRectify etc.&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;- Single camera calibration now uses Levenberg-Marquardt method and supports extra flags to&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;switch on/off optimization of individual camera parameters&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;- The optional 3rd radial distortion parameter (k3*r^6) is now supported in every calibration-related &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;function&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* 2 stereo correspondence algorithms:&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;- very fast block matching method by Kurt Konolige&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;(processes the Tsukuba stereo pair in &lt;10ms on Core2Duo laptop)&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;- slow but more accurate graph-cut based algorithm by Kolmogorov and Zabin&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Better homography estimation algorithms (RANSAC and LMEDs)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* new C++ template image classes contributed by Daniel Filip (Google inc.). see &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;opencv/cxcore/include/cvwimage.h&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Fast approximate nearest neighbor search (by Xavier Delacour)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Codebook method for background/foreground segmentation (by Gary Bradski)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Sort function (contributed by Shiqi Yu)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [OpenCV+IPP] Face Detection (cvHaarDetectObjects) now runs much faster (up to 2x faster) when &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;using IPP 5.3 or higher.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Much faster (~4x faster) fixed-point variant of cvRemap has been added&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- MLL:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Python bindings for MLL have been added. There are no samples yet.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- HighGUI:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [Windows, 32bit] Added support for videoInput library. Hence, cvcam is [almost] not needed anymore&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [Windows, 32bit] FFMPEG can now be used for video decoding/encoding via ffopencv*.dll&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* [Linux] Added unicap support&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Improved internal video capturing and video encoding APIs&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- Documentation:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* OpenCV book has been published (sold separately :) see docs/index.htm)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;- New samples (opencv/samples):&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Many Octave samples&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* find_obj.cpp (SURF), bgfg_codebook.cpp (Codebook BG/FG segmentation), stereo_calib.cpp &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;(Stereo calibration and stereo correspondence)&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; Bug fixes: &lt;&lt;&lt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Many thanks to everybody who submitted bug reports and/or provided the patches!&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* added dma_unlisten to icvCloseCAM_DC1394 (thanks to Victor Benso)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* LMEDs algorithm for cvFindFundamentalMat estimation has been fixed&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Broken debug build of highgui in VS2005/2008 (SF #2056185, SF #1709435)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cvFindChessboardCorners memory leak and incorrect size checks&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(SF #1972896, SF #1910323)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* disabling GTK causes v4l runtime error (SF #2088102)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cvsetmousecallback bug (SF #2053529)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* libhighgui needed deprecated "img_convert" replacement (SF #2011753)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Segfault in createsamples caused by uninitialized variable (SF #1977989)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Data Alignment Issue in bgfg_gaussmix (SF #1961755)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* libpng need to be updated (SF #1952793)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cvCreateVideoWriter_Win32 - identifier not found (SF #1944254)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Bug in cvmorph.cpp (SF #1908844)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* dilate (cvDilate) works bogus with default kernel (SF #1887130)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* CvEM non-default constructor declared but not defined (SF #1830346)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cvFloodFill (in ver 1.0) Hangs (SF #1790565)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* double delete in CvImage (SF #1733437)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cvFilter2D anchor default value is not working properly (SF #1713779)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* cvCvtColor - Bug? in converting HSV2RGB (SF #1676344)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Invalid selection of the MKL-dll version in cvUseOptimized() (SF #1633017)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&gt;&gt;&gt; Known issues:&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* Borland compiler is not supported (but might work) in this update.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* 64-bit Windows is not supported (but might work) in this update.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;* SF bug tracker still contains over 50 records of open bugs. Many of them will be addressed in the next &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;update.&lt;br /&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-7270980060527025236?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/7270980060527025236/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=7270980060527025236' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7270980060527025236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7270980060527025236'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/10/opencv-11.html' title='OpenCV 1.1'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-6150265650537511761</id><published>2008-10-19T10:06:00.020+08:00</published><updated>2008-11-12T15:55:41.934+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-CvHistogram直方圖資料結構</title><content type='html'>CvHistogram可以提供直方圖的計算,並且可以支援多個維度的直方圖設計,但是在繪製直方圖圖形的時候就需要自己用繪圖函式來繪製,CvHistogram算是一個比較複雜的資料結構,由於它在維度小於二的可以用密集的資料結構,CvMatND來設計,可以當它的直方圖維度大於二的時候,就必須要用到稀疏矩陣,CvSparseMat的方式,下面就是用CvHistogram結構計算一維直方圖的例子&lt;br /&gt;&lt;br /&gt;CvHistogram一維設計&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"type is : %d\n"&lt;/span&gt;,Histogram1-&amp;gt;type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Low Bound is : %.f\n"&lt;/span&gt;,Histogram1-&amp;gt;thresh[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;][&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Up Bound is : %.f\n"&lt;/span&gt;,Histogram1-&amp;gt;thresh[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;][&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Bins are : %d\n"&lt;/span&gt;,((CvMatND *) Histogram1-&gt;bins)-&amp;gt;dim[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;].size);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nGray Level Values:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++)&lt;br /&gt;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.f \n"&lt;/span&gt;,((CvMatND *) Histogram1-&amp;gt;bins)-&amp;gt;data.fl[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(HistogramImage1,cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)(cvQueryHistValue_1D(Histogram1,i)/&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;)),CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxiWukKT9I/AAAAAAAABS4/w7q-u8Swfjs/s1600-h/Riverbank.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxiWukKT9I/AAAAAAAABS4/w7q-u8Swfjs/s400/Riverbank.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5259186607458242514" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxixvQqMKI/AAAAAAAABTA/mZB9skY0S-Q/s1600-h/pic_number_130.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxixvQqMKI/AAAAAAAABTA/mZB9skY0S-Q/s400/pic_number_130.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259187071501349026" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;跟前面直接用矩陣累加設計出的統計直方圖一樣,到最後還是要自己用繪圖函式自己畫,CvHistogram這個資料結構的特色,它可以設定要用幾個區塊來呈現,這邊設立為256個區塊,而實際上,它可以用比較模糊的方式設定直方圖的區域,也就是可以小於256個的區塊數,是利用切割成n等分的方式,然後它可以自行設定上界(Up Bound)以及下界(Low Bound),在灰階圖裡面數據的範圍為0~255,而CvHistogram資料結構可以設立為上界30,下界200這樣的方式縮小範圍,而0~29,201~266這範圍內的數據將不會被計算,下面是CvHistogram資料結構的內容,分別為CV_HIST_ARRAY及CV_HIST_SPARSE兩種&lt;br /&gt;&lt;br /&gt;1.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPxe-3MqXuI/AAAAAAAABSY/0WOAiF1ixsI/s1600-h/CvHistogram.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPxe-3MqXuI/AAAAAAAABSY/0WOAiF1ixsI/s400/CvHistogram.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5259182898923855586" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SPxhnIXLbGI/AAAAAAAABSw/T9zwtNSJ8rg/s1600-h/CvHistogram1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SPxhnIXLbGI/AAAAAAAABSw/T9zwtNSJ8rg/s400/CvHistogram1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5259185789749390434" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CvHistogram的type固定都為CV_HIST_MAGIC_VAL這的參數,與上面程式cvCreateHist()所設定的CV_HIST_ARRAY無關,這也許是OpenCV裡面對於CvHistogram這個結構設計不良的地方,而對於CvHistogram資料結構的參數,定義如下&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;#define CV_HIST_ARRAY 0&lt;br /&gt;#define CV_HIST_SPARSE 1&lt;br /&gt;#define CV_HIST_TREE CV_HIST_SPARSE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;因此,它的參數只有CV_HIST_ARRAY的多維矩陣CvMatND以及CV_HIST_SPARSE的稀疏矩陣CvSparseMat資料結構,而它的thresh是放上下界的資料,thresh2是放動態的維度上下界資料,而一般的直方圖數據資料都是放在bins裡面.而CvHistogram內的CvMatND結構則是在做快速初始化,bins以及mat都是使用同一個記憶體空間,而將直方圖資料的提取就要用到cvQueryHistValue_1D()這個函式了.&lt;br /&gt;&lt;br /&gt;接著是將直方圖的空間分區塊的方式實作,將它分為50塊,並且上界為30,下界為200&lt;br /&gt;&lt;br /&gt;CvHistogram結構區塊與上下界&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBins = &lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; HistogramBinWidth;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;30&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;200&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *HistogramImage1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint Point2;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramBins,CV_HIST_ARRAY,HistogramRange);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1 = cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramImage1-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HistogramBinWidth=&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;/HistogramBins;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Bolck Width is : %d\n"&lt;/span&gt;,HistogramBinWidth);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(&lt;code&gt;&amp;amp;&lt;/code&gt;Image1,Histogram1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Gray Level Values:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;HistogramBins;i++) &lt;br /&gt;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.f \n"&lt;/span&gt;,((CvMatND *) Histogram1-&amp;gt;bins)-&amp;gt;data.fl[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point1=cvPoint(i*HistogramBinWidth,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Point2=cvPoint((i+1)*HistogramBinWidth,(&lt;strong&gt;int&lt;/strong&gt;)cvQueryHistValue_1D(Histogram1,i)/&lt;span style="color:#cc33cc;"&gt;50&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvRectangle(HistogramImage1,Point1,Point2,CV_RGB(&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;127&lt;/span&gt;));&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;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Histogram"&lt;/span&gt;,HistogramImage1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxjIrvG_TI/AAAAAAAABTI/_b2ThRz7pOg/s1600-h/pic_number_131.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxjIrvG_TI/AAAAAAAABTI/_b2ThRz7pOg/s400/pic_number_131.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259187465692314930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因此,這邊就用cvRectangle()的方式來表達,對於CvHistogram這個資料結構,為什麼可以任意定義上下界以及區塊的個數呢？因為CvHistogram使用的是Look-up table(LUT)的方式,也就是查表法,開一個256大小空間的陣列,利用比例的縮放,縮放的數據存入Look-up table裡面,在利用索引的方式對應,而使用Look-up table最大的缺點為,無法取得很精確的數據,由於它是被比例縮放過的,因此除了範圍為256的可以求的完整的數值,LUT的用法會在後面使用到.&lt;br /&gt;&lt;br /&gt;對於其他維度的直方圖,它的做法如下&lt;br /&gt;&lt;br /&gt;三維直方圖擷取&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; Histogram3DBins[&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;] = {&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; HistogramRange1[&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; *HistogramRange[&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;]={&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;],&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;],&lt;code&gt;&amp;amp;&lt;/code&gt;HistogramRange1[&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;]};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; Print3DHistogram(CvHistogram *Histogram,&lt;strong&gt;int&lt;/strong&gt; BinSize);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvHistogram *Histogram1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"Riverbank.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *RedImage=cvCreateImage(cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *GreenImage=cvCreateImage(cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *BlueImage=cvCreateImage(cvGetSize(Image1),&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *ImageArray[&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;]={RedImage,GreenImage,BlueImage};&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSplit(Image1,BlueImage,GreenImage,RedImage,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Histogram1 = cvCreateHist(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,Histogram3DBins,CV_HIST_SPARSE,HistogramRange);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCalcHist(ImageArray,Histogram1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"3D Historgram Data\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Print3DHistogram(Histogram1,&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Riverbank"&lt;/span&gt;,Image1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; Print3DHistogram(CvHistogram *Histogram,&lt;strong&gt;int&lt;/strong&gt; BinSize)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;BinSize;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;BinSize;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;k&amp;lt;BinSize;k++)&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;&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;&lt;strong&gt;if&lt;/strong&gt;(cvQueryHistValue_3D(Histogram,i,j,k)&amp;gt;&lt;span style="color:#cc33cc;"&gt;10&lt;/span&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.f\n"&lt;/span&gt;,cvQueryHistValue_3D(Histogram,i,j,k));&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;}&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;&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;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPxjjh6XCaI/AAAAAAAABTQ/1ackSp74n6Q/s1600-h/pic_number_132.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPxjjh6XCaI/AAAAAAAABTQ/1ackSp74n6Q/s400/pic_number_132.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5259187926911617442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面是三個維度的統計直方圖,分別為R維度,G維度,B維度,並且分別被量化成256等分的區塊,同樣的,也是使用LUT的方法,由於這個統計直方圖非常的大,它所佔的區域為256*256*256的大小,而實際上累積的分佈只有一點點,所以說,對於高維度的統計直方圖就要用到稀疏矩陣,要不然會浪費大量的記憶體空間,但是對於多維度的圖表呈現,OpenCV最多也只能支援到一維的方式,二維的方式可以用OpenGL(glut)呈現,當然高的維度本來就很難用視覺化的方式呈現.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCreateHist()&lt;/strong&gt;&lt;br /&gt;初始化CvHistogram資料結構,可以選擇密集矩陣(CvMatND)CV_HIST_ARRAY以及稀疏矩陣(CvSparseMat)CV_HIST_SPARSE,第一個引數為維度的選擇,第二個引數為要將直方圖切割為多少區塊,第三個引數為選擇cvCreateHist()函數的參數或代號,第四個引數為每一個維度的上下界&lt;br /&gt;cvCreateHist(輸入int型別直方圖維度,輸入int型別直方圖區塊數,輸入參數或代號,輸入每個維度的上下界數據)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCalcHist()&lt;/strong&gt;&lt;br /&gt;計算直方圖累積數據,第一個引數為輸入目標IplImage圖形陣列資料結構,第二個引數輸出為CvHistogram資料結構&lt;br /&gt;cvCalcHist(輸入目標IplImage圖形陣列資料結構,輸出為CvHistogram資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvQueryHistValue_1D()&lt;/strong&gt;&lt;br /&gt;讀取CvHistogram資料結構一維空間的圖形直方圖資料,它在OpenCV的"cvcompat.h"函式庫被定義為&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define cvQueryHistValue_1D( hist, idx0 ) ((float)cvGetReal1D( (hist)-&gt;bins, (idx0)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;因此回傳的是float型別的資料,輸入CvHistogram資料結構,以及輸入一維資料結構的Index索引數據&lt;br /&gt;cvQueryHistValue_1D(輸入CvHistogram資料結構,輸入一維int型別數據索引)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvQueryHistValue_2D()&lt;/strong&gt;&lt;br /&gt;讀取CvHistogram資料結構二維空間的圖形直方圖資料,它在OpenCV的"cvcompat.h"函式庫被定義為&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define cvQueryHistValue_2D( hist, idx0, idx1 ) ((float)cvGetReal2D( (hist)-&gt;bins, (idx0), (idx1)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;回傳float型別的資料,第一個引數為輸入CvHistogram資料結構,第二個引數為輸入二維資料結構的x軸索引數據,第三個引數為y軸索引數據&lt;br /&gt;cvQueryHistValue_2D(輸入CvHistogram資料結構,輸入二維int型別x軸數據索引,輸入二維int型別y軸數據索引)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvQueryHistValue_3D()&lt;/strong&gt;&lt;br /&gt;讀取CvHistogram資料結構三維空間的圖形直方圖資料,它在OpenCV的"cvcompat.h"函式庫被定義為&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define cvQueryHistValue_3D( hist, idx0, idx1, idx2 ) ((float)cvGetReal3D( (hist)-&gt;bins, (idx0), (idx1), (idx2)))&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;回傳float型別的資料,第一個引數為輸入CvHistogram資料結構,第二個引數為輸入三維資料結構的x軸索引數據,第三個引數為輸入y軸索引數據,第四個引數為輸入z軸索引數據&lt;br /&gt;cvQueryHistValue_3D(輸入CvHistogram資料結構,輸入三維int型別x軸數據索引,輸入三維int型別y軸數據索引,輸入三維int型別z軸數據索引)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-6150265650537511761?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/6150265650537511761/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=6150265650537511761' title='4 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6150265650537511761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6150265650537511761'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/10/opencv-cvhistogram.html' title='OpenCV統計應用-CvHistogram直方圖資料結構'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HcQD5f5sLPc/SPxiWukKT9I/AAAAAAAABS4/w7q-u8Swfjs/s72-c/Riverbank.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-6475413396876809105</id><published>2008-10-11T15:45:00.014+08:00</published><updated>2008-10-20T22:08:33.285+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-極端值,cvReduce</title><content type='html'>在統計模型裡面,總是會有一些特別高或特別低的數值,這個數值已經脫離了統計分配的假設,不符合統計的模型,通常會有這種極大或是極小的極端值(outlier)有可能是因為量測誤差,或是在統計模型中那0.0001的機率發生,因此,在統計學裡,挑出極端值來做最精簡的量測也是很重要的,就好比一群低收入戶的人裡面出現了一位身價上億的人而拉高了一群人的平均所得,使得低收入戶的族群變成中高收入的族群,這邊要抓取那個最大最小值就用到了cvMinMaxLoc()的函式啦.在圖片裡面,也許很難有如此極端的事件產生,cvMinMaxLoc()可以處理一般的數據,亦可以處理圖片找出它最大最小值以及它的位置.&lt;br /&gt;&lt;br /&gt;cvMinMaxLoc()的實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; MinValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; MaxValue;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint MinLocation;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint MaxLocation;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetImageCOI(Image1,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvMinMaxLoc(Image1,&lt;code&gt;&amp;amp;&lt;/code&gt;MinValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MinLocation,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxLocation);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Min number is : %.f\n"&lt;/span&gt;,MinValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The position is : ( %d , %d )\n"&lt;/span&gt;,MinLocation.x,MinLocation.y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Max number is : %.f\n"&lt;/span&gt;,MaxValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The position is : (%d , %d )\n"&lt;/span&gt;,MaxLocation.x,MaxLocation.y);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPCmS-9SRYI/AAAAAAAABRU/xMDcrj4oyIY/s1600-h/pic_number_126.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPCmS-9SRYI/AAAAAAAABRU/xMDcrj4oyIY/s400/pic_number_126.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255883610209273218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的結果是抓出這張圖片最大最小值的數據,選擇綠色這個通道,雖然這已經不算是極端值的意義了,不過它仍然是可以對一般圖形做處理,cvMinMaxLoc()可以同時找出最大最小值,也可以指出最大值的位置跟最小值的位置,而cvMinMaxLoc()必須對單通道做處理因此必須要用,cvSetImageCOI選定顏色,也可以支援ROI,甚至,cvMinMaxLoc()可以用遮罩的方式實作,使用的方法如下&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *MaskImage1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto_Threshold.bmp"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; MinValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; MaxValue;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint MinLocation;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvPoint MaxLocation;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetImageCOI(Image1,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvMinMaxLoc(Image1,&lt;code&gt;&amp;amp;&lt;/code&gt;MinValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxValue,&lt;code&gt;&amp;amp;&lt;/code&gt;MinLocation,&lt;code&gt;&amp;amp;&lt;/code&gt;MaxLocation,MaskImage1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Min number is : %.f\n"&lt;/span&gt;,MinValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The position is : ( %d , %d )\n"&lt;/span&gt;,MinLocation.x,MinLocation.y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Max number is : %.f\n"&lt;/span&gt;,MaxValue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The position is : (%d , %d )\n"&lt;/span&gt;,MaxLocation.x,MaxLocation.y);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPCmvwaet4I/AAAAAAAABRc/julCFH32OXI/s1600-h/pic_number_127.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SPCmvwaet4I/AAAAAAAABRc/julCFH32OXI/s400/pic_number_127.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255884104521398146" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式也只對grotto_Threshold.bmp白色的部份做處理,從白色區域找出它的最大最小值以及它的位置,跟前面的程式差不多.&lt;br /&gt;&lt;br /&gt;cvReduce()為將矩陣維度降低為向量的維度,也就勢將該行或該列做加總,平均,找出最大,最小值,cvReduce()可使用的參數或代號如下&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;#define CV_REDUCE_SUM 0&lt;br /&gt;#define CV_REDUCE_AVG 1&lt;br /&gt;#define CV_REDUCE_MAX 2&lt;br /&gt;#define CV_REDUCE_MIN 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;而它的數據要從圖形縮成行或縮成列,則輸入的向量就必須要跟它的行或列相等長度,而且是一維的形式,下面這個是求出每一列的RGB值的平均數,並且用圖表的方式&lt;br /&gt;&lt;br /&gt;cvReduce()平均數向量&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *AVGImage=cvCreateImage(cvSize(Image1-&amp;gt;width,255),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *AVGVector=cvCreateMat(1,Image1-&amp;gt;width,CV_32FC3);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvReduce(Image1,AVGVector,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,CV_REDUCE_AVG);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Image1-&amp;gt;width;i++)&lt;br /&gt;&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;printf(&lt;span style="color:#cc0000;"&gt;"%f\t%f\t%f\t\n"&lt;/span&gt;,cvGet1D(AVGVector,i).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;],cvGet1D(SumVector,i).val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;],cvGet1D(SumVector,i).val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(i!=Image1-&amp;gt;width-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(AVGImage,cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(AVGVector,i).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]),cvPoint(i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(AVGVector,i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]),CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc0000;"&gt;255&lt;/span&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;cvLine(AVGImage,cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(AVGVector,i).val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]),cvPoint(i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(AVGVector,i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;).val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]),CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;cvLine(AVGImage,cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(AVGVector,i).val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]),cvPoint(i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(AVGVector,i+&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;).val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]),CV_RGB(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&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;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"AVG Image"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"AVG Image"&lt;/span&gt;,AVGImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPCnVKJEqvI/AAAAAAAABRk/0LF0_Q9Nl9Q/s1600-h/pic_number_128.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SPCnVKJEqvI/AAAAAAAABRk/0LF0_Q9Nl9Q/s400/pic_number_128.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255884747082869490" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;cvReduce()可以支援多通道,而AVGVector則是通道三的向量,然後圖表的呈現以cvLine()實作,cvReduce()第一個引數為目標要被統計的圖片,第二個引數為要被計算出來的向量,而第二個引數有一些特殊的規定,它的使用條件如下&lt;br /&gt;&lt;br /&gt;1.通道數必須與輸入圖片的數目相同&lt;br /&gt;2.所需要計算的列或欄的長度必須要與輸入圖片&lt;br /&gt;3.一定要用浮點數型別來輸入,如CV_32FC3,CV64FC3,CV_32FC1等,由於uchar型別在做像是CV_REDUCE_SUM時數據一定會超過,因此cvReduce()會做檢查驗證&lt;br /&gt;&lt;br /&gt;而且而CV_REDUCE_SUM則是在二值化的圖片的計算比較具有意義,它可以求出二值化圖片的投影向量,並且以圖表的方式呈現.下面就是以列投影以及欄投影的方式來做圖表的呈現.&lt;br /&gt;&lt;br /&gt;二值化圖形投影計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto_Threshold.bmp"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *RowProjectionImage=cvCreateImage(cvSize(Image1-&amp;gt;width,300),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *ColumnProjectionImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;300&lt;/span&gt;,Image1-&amp;gt;height),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *RowSumVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,Image1-&amp;gt;width,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ColumnSumVector=cvCreateMat(Image1-&amp;gt;height,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RowProjectionImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvReduce(Image1,RowSumVector,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,CV_REDUCE_SUM);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvReduce(Image1,ColumnSumVector,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_REDUCE_SUM);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Image1-&amp;gt;width;i++)&lt;br /&gt;&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;cvLine(RowProjectionImage,cvPoint(i,(&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(RowSumVector,i).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]/(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;*&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;)),cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),CV_RGB(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Image1-&amp;gt;height;i++)&lt;br /&gt;&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;cvLine(ColumnProjectionImage,cvPoint((&lt;strong&gt;int&lt;/strong&gt;)cvGet1D(ColumnSumVector,i).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]/(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;*&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;),i),cvPoint(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,i),CV_RGB(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;));&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;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto Threshold"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto Threshold"&lt;/span&gt;,Image1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Row Projection Image"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Row Projection Image"&lt;/span&gt;,RowProjectionImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Column Projection Image"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Column Projection Image"&lt;/span&gt;,ColumnProjectionImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SPCsamJUlrI/AAAAAAAABR0/3RkGXDU6bvw/s1600-h/pic_number_129.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SPCsamJUlrI/AAAAAAAABR0/3RkGXDU6bvw/s400/pic_number_129.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255890338057590450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式,由於是二值化的圖片,只有0跟255,所以必須要將累加的數值除以255才能知道它所累積的個數,在將該數目除以二平移,使他在圖表呈現上不會太大,對於投影的實作,可以藉由選取較高的區間,提出二值化裡面有意義的資料區塊,在人臉辨識可以藉由這種方法提取特定臉部器官的特徵.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvMinMaxLoc()&lt;/strong&gt;&lt;br /&gt;找出圖片或一組數據中最大值及最小值的數據,以及最大值及最小值的位置,第一個引數為輸入IplImage資料結構或CvMat資料結構,第二個引數為輸出最小值double型別數據,第三個引數為輸出最大值double型別數據,第四個引數為輸出最小值位置CvPoint資料結構,第五個引數為輸出最大值位置CvPoint資料結構.&lt;br /&gt;cvMinMaxLoc(輸入IplImage或CvMat資料結構,輸出double型別最小值數據,輸出double型別最大值數據,輸出最小值CvPoint資料結構,輸出最大值CvPoint資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvReduce()&lt;/strong&gt;&lt;br /&gt;將二維圖形縮減成列向量或欄向量,cvReduce()具有四個參數,分別為CV_REDUCE_SUM總和,CV_REDUCE_AVG平均,CV_REDUCE_MAX最大值,CV_REDUCE_MIN最小值,可以由多通道的輸入,但輸出的行向量或欄向量一定要符合圖形的長度.第一個引數為輸入目標IplImage資料結構或CvMat資料結構,第二個引數為輸出目標CvMat結構向量,第三個引數為縮減為列向量或欄向量,0為欄向量,1為列向量,第四個引數為cvReduce()的參數或代號.&lt;br /&gt;cvReduce(輸入IplImage或CvMat資料結構,輸出CvMat向量資料結構,輸入縮減欄向量或列向量代號,目標參數或代號)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-6475413396876809105?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/6475413396876809105/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=6475413396876809105' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6475413396876809105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6475413396876809105'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/10/opencv-cvreduce.html' title='OpenCV統計應用-極端值,cvReduce'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HcQD5f5sLPc/SPCmS-9SRYI/AAAAAAAABRU/xMDcrj4oyIY/s72-c/pic_number_126.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-7807107955424290048</id><published>2008-10-10T19:37:00.013+08:00</published><updated>2008-10-13T07:08:50.498+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-平均數與標準差</title><content type='html'>平均數跟標準差是統計學裡最基本的東西,cvAvg()為平均數的計算,也支援多通道的使用,而它使用的方法如下&lt;br /&gt;&lt;br /&gt;簡單cvAvg()實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar Scalar1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Scalar1 = cvAvg(Image1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Blue Channel Avg is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Green Channel Avg is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red Channel Avg is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SO9HopzyCqI/AAAAAAAABQs/Ea1ODIlUVNw/s1600-h/pic_number_121.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SO9HopzyCqI/AAAAAAAABQs/Ea1ODIlUVNw/s400/pic_number_121.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255498053908040354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;與cvSum()相同,而它與cvSum()唯一不同的地方為它支援Mask遮罩的操作,cvAvg()將黑白圖遮罩白色的部份做平均數的統計,使用方式如下&lt;br /&gt;&lt;br /&gt;簡單cvAvg()遮罩實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *MaskImage1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto_Threshold.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar Scalar1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Scalar1 = cvAvg(Image1,MaskImage1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Blue Channel Avg is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Green Channel Avg is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red Channel Avg is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SO9H4vtMUcI/AAAAAAAABQ0/II_h6fLbn-Q/s1600-h/pic_number_122.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SO9H4vtMUcI/AAAAAAAABQ0/II_h6fLbn-Q/s400/pic_number_122.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255498330368922050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;將之前洞穴的二值化黑白圖片當遮罩對應出白色部分做平均數的計算,而OpenCV也有另外一個算平均數的函式cvAvgSdv(),它可以同時算出平均數跟標準差,也支援Mask遮罩的實作,使用的方式如下&lt;br /&gt;&lt;br /&gt;簡單cvAvgSdv()實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar MeanScalar;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar StandardDeviationScalar;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvAvgSdv(Image1,&lt;code&gt;&amp;amp;&lt;/code&gt;MeanScalar,&lt;code&gt;&amp;amp;&lt;/code&gt;StandardDeviationScalar);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Blue Channel Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Blue Channel Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Green Channel Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Green Channel Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red Channel Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red Channel Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SO9IKOVjxrI/AAAAAAAABQ8/jp9YpmY8jw4/s1600-h/pic_number_123.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SO9IKOVjxrI/AAAAAAAABQ8/jp9YpmY8jw4/s400/pic_number_123.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255498630649071282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的是用cvAvgSdv()計算平均數跟標準差,也同樣是用CvScalar資料結構來做數值的接收,再來,就是Mask的部份&lt;br /&gt;&lt;br /&gt;簡單cvAvgSdv()遮罩實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *MaskImage1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"grotto_Threshold.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar MeanScalar;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar StandardDeviationScalar;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvAvgSdv(Image1,&lt;code&gt;&amp;amp;&lt;/code&gt;MeanScalar,&lt;code&gt;&amp;amp;&lt;/code&gt;StandardDeviationScalar,MaskImage1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Blue Channel Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Blue Channel Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Green Channel Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Green Channel Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red Channel Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red Channel Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"grotto_Threshold"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"grotto_Threshold"&lt;/span&gt;,MaskImage1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SO9IgZJJioI/AAAAAAAABRE/ZhXIIdg4bpg/s1600-h/pic_number_124.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SO9IgZJJioI/AAAAAAAABRE/ZhXIIdg4bpg/s400/pic_number_124.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255499011506932354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;也是跟cvAvg()一樣用單通道二值化影像做遮罩,計算平均數與標準差,也不限於圖形的輸入,實際上任何的資料數據都可以做輸入,下面就是任意一筆資料來做平均數跟標準差的計算&lt;br /&gt;&lt;br /&gt;cvMat資料結構計算平均數標準差&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;uchar Array[&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;7&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;9&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;,CV_8UC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array,Matrix1-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar MeanScalar;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar StandardDeviationScalar;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvAvgSdv(Matrix1,&lt;code&gt;&amp;amp;&lt;/code&gt;MeanScalar,&lt;code&gt;&amp;amp;&lt;/code&gt;StandardDeviationScalar);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Matrix1 Avg is : %.f\n"&lt;/span&gt;,MeanScalar.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Matrix1 Standard Deviation is : %.f\n"&lt;/span&gt;,StandardDeviationScalar.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SO9I2VC24mI/AAAAAAAABRM/AFZhgjwAGEQ/s1600-h/pic_number_125.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SO9I2VC24mI/AAAAAAAABRM/AFZhgjwAGEQ/s400/pic_number_125.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5255499388363924066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;實際上,很多的函式IplImage資料結構跟CvMat資料結構都是可以共用的,包括前面的cvCountNonZero(),cvSum(),cvAvg()及cvAvgSdv().&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvAvg()&lt;/strong&gt;&lt;br /&gt;計算IplImage資料結構或CvMat資料結構的平均數,支援Mask遮罩的運算,第一個引數輸入為IplImage資料結構或CvMat資料結構,第二個引數為IplImage資料結構單通道uchar型別的遮罩對應,輸出為CvScalar資料結構&lt;br /&gt;cvAvg(輸入IplImage資料結構或CvMat資料結構,輸入單通道uchar型別IplImage資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvAvgSdv()&lt;/strong&gt;&lt;br /&gt;計算IplImage資料結構或CvMat資料結構的平均數,標準差,支援Mask通道的計算,第一個引數為輸入IplImage資料結構或CvMat資料結構,第二個引數為輸出CvScalar平均數資料結構,第三個引數為輸出CvScalar標準差資料結構,第四個引數為IplImage資料結構單通道uchar型別遮罩的輸入&lt;br /&gt;cvAvgSdv(輸入IplImage資料結構或CvMat資料結構,輸出平均數CvScalar資料結構,輸出標準差CvScalar資料結構,輸入單通道uchar型別IplImage資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-7807107955424290048?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/7807107955424290048/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=7807107955424290048' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7807107955424290048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7807107955424290048'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/10/opencv-cvavgcvavgsdv.html' title='OpenCV統計應用-平均數與標準差'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SO9HopzyCqI/AAAAAAAABQs/Ea1ODIlUVNw/s72-c/pic_number_121.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-6747672901953200030</id><published>2008-10-07T21:02:00.008+08:00</published><updated>2008-10-10T21:00:53.842+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-總和,計算非零</title><content type='html'>再來就是一些計數的函式啦,下面簡單的介紹一張圖形,所有數值總和以及圖形上所有非0的計算,在一些圖形數值的量測方面,稍微具有一些實質的意義.&lt;br /&gt;&lt;br /&gt;簡單cvSum()使用&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#CC0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar Scalar1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Scalar1 = cvSum(Image1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Blue Channel Sum is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Green Channel Sum is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Red Channel Sum is : %.f\n"&lt;/span&gt;,Scalar1.val[&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#CC0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#CC0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SOwM3AyPp7I/AAAAAAAABQE/hFSDbGAzezY/s1600-h/grotto.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SOwM3AyPp7I/AAAAAAAABQE/hFSDbGAzezY/s400/grotto.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254589004477605810" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SOwNAR-6FCI/AAAAAAAABQM/f3cXx95fgc4/s1600-h/pic_number_118.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SOwNAR-6FCI/AAAAAAAABQM/f3cXx95fgc4/s400/pic_number_118.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254589163712943138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvSum()是計算所有圖片每個通道數據的總和,因此在這個通道為3的RGB圖,所有的總和都被計算在CvScalar資料結構上面了,cvSum()輸入為IplImage或CvMat資料結構,輸出為CvScalar的資料結構,裡面存放著RGB的總和數值,接著就是cvContNonZero()的使用.&lt;br /&gt;&lt;br /&gt;簡單cvCountNonZero()使用&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#CC0000;"&gt;"grotto_Threshold.jpg"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Thresholding Non Zero is : %d\n"&lt;/span&gt;,cvCountNonZero(Image1));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#CC0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#CC0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片：&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SOwNS2mrmNI/AAAAAAAABQU/apSqilZk7Jg/s1600-h/grotto_Threshold.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SOwNS2mrmNI/AAAAAAAABQU/apSqilZk7Jg/s400/grotto_Threshold.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254589482781087954" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SOwOCLFyGsI/AAAAAAAABQc/eDUu8C9rFFw/s1600-h/pic_number_119.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SOwOCLFyGsI/AAAAAAAABQc/eDUu8C9rFFw/s400/pic_number_119.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254590295734098626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvCountNonZero()為計算非0的個數,只能使用在單通道的圖形,而且對於這個函式在黑白圖的使用上會比較具有意義,由於黑白圖非0即1因此計算出非0的個數同時也算出了1的個數,而cvCountNonZero(),以及cvSum()也可以支援COI（Color Of Interesting）以及ROI（Region Of Interesting）的使用,使用方式如下&lt;br /&gt;&lt;br /&gt;cvCountNonZero()及cvSum()的ROI,COI&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#CC0000;"&gt;"grotto.jpg"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetImageROI(Image1,cvRect(&lt;span style="color:#CC33CC;"&gt;100&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;100&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;100&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;100&lt;/span&gt;));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetImageCOI(Image1,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Blue Channel Non Zero is : %d\n"&lt;/span&gt;,cvCountNonZero(Image1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Blue Channel Sum is : %.f\n"&lt;/span&gt;,cvSum(Image1).val[&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetImageCOI(Image1,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"\nGreen Channel Non Zero is : %d\n"&lt;/span&gt;,cvCountNonZero(Image1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Green Channel Sum is : %.f\n"&lt;/span&gt;,cvSum(Image1).val[&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetImageCOI(Image1,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"\nRed Channel Non Zero is : %d\n"&lt;/span&gt;,cvCountNonZero(Image1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"Red Channel Sum is : %.f\n"&lt;/span&gt;,cvSum(Image1).val[&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#CC0000;"&gt;"grotto(ROI)"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#CC0000;"&gt;"grotto(ROI)"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvResetImageROI(Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#CC0000;"&gt;"grotto"&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#CC0000;"&gt;"grotto"&lt;/span&gt;,Image1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SOwPU4qmLoI/AAAAAAAABQk/iCl9q6Dk74o/s1600-h/pic_number_120.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SOwPU4qmLoI/AAAAAAAABQk/iCl9q6Dk74o/s400/pic_number_120.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254591716717375106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;對於一個被選定COI的他會對於特定顏色做統計,cvCountNonZero()以及cvSum()亦是如此,而被選定ROI他會對於特定的區域做計算,因此上面的結果會是被選定的區域,加上被選定的顏色,他所計算出來的統計結果,而COI選定的顏色後,因為是單通道的,所以cvSum()計算出來的結果會被放在CvScalar資料結構val[0]的位置,這邊用cvSum(Image1).val[0]表示直接存取CvScalar資料結構val[0]的數據.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvSum()&lt;/strong&gt;&lt;br /&gt;計算所有通道數據的總和,計算出來的結果會回傳放在CvScalar資料結構上,如果是使用單通道或是COI的話會放在CvScalar資料結構val[0]上面.輸入的引數為IplImage資料結構或CvMat資料結構.&lt;br /&gt;cvSum(輸入IplImage或CvMat資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCountNonZero()&lt;/strong&gt;&lt;br /&gt;計算所有非0數據的總和,只支援單通道或是COI,輸入為IplImage資料結構或CvMat資料結構,輸出為int變數型別.&lt;br /&gt;cvCountNonZero(輸入IplImage或CvMat資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-6747672901953200030?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/6747672901953200030/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=6747672901953200030' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6747672901953200030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6747672901953200030'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/10/opencv-cvsumcvcontnonzero.html' title='OpenCV統計應用-總和,計算非零'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SOwM3AyPp7I/AAAAAAAABQE/hFSDbGAzezY/s72-c/grotto.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-7897285940871357129</id><published>2008-10-07T11:11:00.008+08:00</published><updated>2008-10-07T17:47:52.080+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV統計應用'/><title type='text'>OpenCV統計應用-基本統計直方圖</title><content type='html'>在統計學裡面,最基本影像處理的應用,就是統計直方圖了,它可以將一張圖片的色彩結構統計起來,對於一張圖片的R值,G值,B值或灰階做統計計算,或者是,轉換到另一個色彩空間,將圖形做量化及統計的計算,在OpenCV裡面,也有不少統計直方圖的計算,並且可以將它圖表化,呈現出統計的概況.&lt;br /&gt;&lt;br /&gt;基本統計直方圖計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; BlueHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; GreenHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; RedHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; GrayLevelHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"waterfall.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar Scalar1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;int&lt;/strong&gt; BlueColor,GreenColor,RedColor,GrayLevelColor;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Image1-&amp;gt;height;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Image1-&amp;gt;width;j++)&lt;br /&gt;&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;Scalar1=cvGet2D(Image1,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;BlueColor=(&lt;strong&gt;int&lt;/strong&gt;)Scalar1.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;GreenColor=(&lt;strong&gt;int&lt;/strong&gt;)Scalar1.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;RedColor=(&lt;strong&gt;int&lt;/strong&gt;)Scalar1.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;GrayLevelColor=(&lt;strong&gt;int&lt;/strong&gt;) (&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;299&lt;/span&gt;*RedColor+&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;587&lt;/span&gt;*GreenColor+&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;114&lt;/span&gt;*BlueColor);&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;BlueHistogramData[BlueColor]++;&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;GreenHistogramData[GreenColor]++;&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;RedHistogramData[RedColor]++;&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;GrayLevelHistogramData[GrayLevelColor]++;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Red\tGreen\tBlue\tGrayLevel\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;;i++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%d\t%d\t%d\t%d\t\n"&lt;/span&gt;,RedHistogramData[i],GreenHistogramData[i],BlueHistogramData[i],GrayLevelHistogramData[i]);&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;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"waterfall"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"waterfall"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SOsuMxoXVAI/AAAAAAAABPU/hjJKeF2U7_w/s1600-h/waterfall.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SOsuMxoXVAI/AAAAAAAABPU/hjJKeF2U7_w/s400/waterfall.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5254344187273761794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SOsu58R7_3I/AAAAAAAABPc/IAy3Vx9VdrU/s1600-h/pic_number_116.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SOsu58R7_3I/AAAAAAAABPc/IAy3Vx9VdrU/s400/pic_number_116.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254344963226599282" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式碼,就是將RGB值做統計,將R值,G值,B值累加在0~255的範圍裡,因此就可以知道這張圖的色彩分布的結構,灰階圖亦然,而OpenCV亦可以做到圖表的呈現的方式,利用的是繪圖函式來實作,用cvLine()或是cvRectangle()就可以做到統計值方圖的繪製,OpenCV在統計直方圖製作部分有一個CvHistogram的資料結構可以實作,而下面這個,則是直接將上面的程式碼修改繪製上去的統計值方圖製作.&lt;br /&gt;&lt;br /&gt;統計直方圖計算與繪製&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; BlueHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; GreenHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; RedHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; GrayLevelHistogramData[&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"waterfall.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *BlueHistogramImage,*GreenHistogramImage,*RedHistogramImage;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *GrayLevelHistogramImage;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BlueHistogramImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GreenHistogramImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RedHistogramImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GrayLevelHistogramImage=cvCreateImage(cvSize(&lt;span style="color:#cc33cc;"&gt;256&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;250&lt;/span&gt;),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BlueHistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GreenHistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RedHistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GrayLevelHistogramImage-&amp;gt;origin=&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvScalar Scalar1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;int&lt;/strong&gt; BlueColor,GreenColor,RedColor,GrayLevelColor;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Image1-&amp;gt;height;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Image1-&amp;gt;width;j++)&lt;br /&gt;&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;Scalar1=cvGet2D(Image1,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;BlueColor=(&lt;strong&gt;int&lt;/strong&gt;)Scalar1.val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&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;GreenColor=(&lt;strong&gt;int&lt;/strong&gt;)Scalar1.val[&lt;span style="color:#cc33cc;"&gt;1&lt;/span&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;RedColor=(&lt;strong&gt;int&lt;/strong&gt;)Scalar1.val[&lt;span style="color:#cc33cc;"&gt;2&lt;/span&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;GrayLevelColor=(&lt;strong&gt;int&lt;/strong&gt;) (&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;299&lt;/span&gt;*RedColor+&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;587&lt;/span&gt;*GreenColor+&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;114&lt;/span&gt;*BlueColor);&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;BlueHistogramData[BlueColor]++;&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;GreenHistogramData[GreenColor]++;&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;RedHistogramData[RedColor]++;&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;GrayLevelHistogramData[GrayLevelColor]++;&lt;br /&gt;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;;i++)&lt;br /&gt;&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;cvLine(BlueHistogramImage,cvPoint(i,BlueHistogramData[i]/&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;),cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(GreenHistogramImage,cvPoint(i,GreenHistogramData[i]/&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;),cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),CV_RGB(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(RedHistogramImage,cvPoint(i,RedHistogramData[i]/&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;),cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),CV_RGB(&lt;span style="color:#cc33cc;"&gt;255&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvLine(GrayLevelHistogramImage,cvPoint(i,GrayLevelHistogramData[i]/&lt;span style="color:#cc33cc;"&gt;10&lt;/span&gt;),cvPoint(i,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;),CV_RGB(&lt;span style="color:#cc33cc;"&gt;128&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;128&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;128&lt;/span&gt;));&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;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"waterfall"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"waterfall"&lt;/span&gt;,Image1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Blue Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Blue Histogram"&lt;/span&gt;,BlueHistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Green Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Green Histogram"&lt;/span&gt;,GreenHistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"Red Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"Red Histogram"&lt;/span&gt;,RedHistogramImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"GrayLevel Histogram"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"GrayLevel Histogram"&lt;/span&gt;,GrayLevelHistogramImage);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SOsvGeTySgI/AAAAAAAABPk/edR8naXbcXU/s1600-h/pic_number_117.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SOsvGeTySgI/AAAAAAAABPk/edR8naXbcXU/s400/pic_number_117.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5254345178519587330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在繪製圖形的時候,亦要開啟圖表的空間,IplImage資料結構,在將IplImage資料結構的origin設為1,為Window XP預設圖形起始點,這部份在"資料結構操作與運算-IplImage資料結構"有詳細的介紹,再來就是讀取RGB值做統計,以及使用cvLine()做繪製,cvLine()的繪製方法則是在"OpenCV繪圖的實作-cvLine,cvRectangle"有介紹到,而CvHistogram資料結構也是使用類似上面的原理,在OpenCV裡面,統計直方圖的部分還是需要自己動手畫,沒有很方便的函式可以直接實作出視覺化圖形的呈現.&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-7897285940871357129?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/7897285940871357129/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=7897285940871357129' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7897285940871357129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7897285940871357129'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/10/opencv.html' title='OpenCV統計應用-基本統計直方圖'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HcQD5f5sLPc/SOsuMxoXVAI/AAAAAAAABPU/hjJKeF2U7_w/s72-c/waterfall.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-5353596236372091403</id><published>2008-09-14T10:49:00.025+08:00</published><updated>2008-09-15T13:05:44.755+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-cvGEMM通用矩陣乘法</title><content type='html'>OpenCV提供了一個通用矩陣乘法的函式,cvGEMM(),代表的是GEneralized Matrix Multiplication,cvGEMM()可以處理線性代數方面許多的乘法運算,cvmMul()矩陣乘法這個函式就是從這裡來的,cvmMul()在"cvcompat.h"及"cxcore.h"這兩個函式庫被定義為&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define cvmMul(src1,src2,dst) cvMatMulAdd(src1,src2,0,dst)&lt;br /&gt;#define cvMatMul(src1,src2,dst) cvMatMulAdd((src1),(src2),NULL,(dst))&lt;br /&gt;#define cvMatMulAdd(src1,src2,src3,dst) cvGEMM((src1),(src2),1.,(src3),1.,(dst),0)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;先簡單的介紹cvmMul()跟cvMatMul()的用法&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyrkxaNICI/AAAAAAAABNM/TT19jM2VgrU/s1600-h/mat_number_101.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245756314206674978" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyrkxaNICI/AAAAAAAABNM/TT19jM2VgrU/s400/mat_number_101.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvmMul()及cvMatMul()的實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array1[]={&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array2[]={&lt;span style="color:#CC33CC;"&gt;4&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;6&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *B=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(B,array2,B-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"cvmMul():\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(A,B,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"\ncvMatMul():\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvMatMul(A,B,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#CC0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMysBHy9e3I/AAAAAAAABNU/ILmJfNUEF0Y/s1600-h/pic_number_112.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245756801252424562" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMysBHy9e3I/AAAAAAAABNU/ILmJfNUEF0Y/s400/pic_number_112.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;所以說cvmMul()跟cvMatMul()是相同的,而他們都源自於cvMatMulAdd()這個函式,cvMatMulAdd()這個函式的前身而是cvGEMM()定義而來的,因此cvGEMM()包含了許多乘法運算的應用,下面這個為cvmMul()跟cvMatMul()的計算方式&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMys6H3UFlI/AAAAAAAABNc/_L9Uc2aNNtc/s1600-h/mat_number_102.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245757780523226706" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMys6H3UFlI/AAAAAAAABNc/_L9Uc2aNNtc/s400/mat_number_102.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因此,cvmMul()跟cvMatMul()是簡單的乘法運算,而cvMatMulAdd()則是如何呢？下面就是cvMatMulAdd()的使用方法&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMytVvtWZYI/AAAAAAAABNk/IRm0WJR4BOc/s1600-h/mat_number_103.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245758255075321218" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMytVvtWZYI/AAAAAAAABNk/IRm0WJR4BOc/s400/mat_number_103.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvMatMulAdd()實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array1[]={&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array2[]={&lt;span style="color:#CC33CC;"&gt;4&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;6&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array3[]={-&lt;span style="color:#CC33CC;"&gt;10&lt;/span&gt;,-&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,-&lt;span style="color:#CC33CC;"&gt;20&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;10&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,int Channels);&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *B=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *C=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(B,array2,B-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(C,array3,C-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"cvMatMulAdd():\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvMatMulAdd(A,B,C,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#CC0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,int Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMytwKjlDRI/AAAAAAAABNs/PSt5OqS0p9U/s1600-h/pic_number_113.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245758708958694674" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMytwKjlDRI/AAAAAAAABNs/PSt5OqS0p9U/s400/pic_number_113.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvMatMulAdd()是簡單的相乘在相加的函式,只要符合矩陣大小的規格,它就可以對三個矩陣做相乘在相加的動作,對於上面的程式碼,它的計算方式如下&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMyuQ-XjRMI/AAAAAAAABN0/C6pvqMW8mwk/s1600-h/mat_number_104.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245759272622703810" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMyuQ-XjRMI/AAAAAAAABN0/C6pvqMW8mwk/s400/mat_number_104.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這是將矩陣相乘後的結果在加上另外一個矩陣,這跟cvGEMM()什麼關係呢？cvGEMM()函式裡面包含了很多種計算方式,而cvmMul(),cvMatMul(),cvMatMulAdd()則是用#define來擷取它的算法,而cvGEMM()的使用方式如下&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMyuu-8nWBI/AAAAAAAABN8/HDQC8vWErpE/s1600-h/mat_number_105.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245759788174235666" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMyuu-8nWBI/AAAAAAAABN8/HDQC8vWErpE/s400/mat_number_105.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;簡單cvGEMM()函式實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array1[]={&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array2[]={&lt;span style="color:#CC33CC;"&gt;4&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;6&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array3[]={-&lt;span style="color:#CC33CC;"&gt;10&lt;/span&gt;,-&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,-&lt;span style="color:#CC33CC;"&gt;20&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;10&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *B=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *C=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double alpha =&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;.&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double beta =&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;.&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(B,array2,B-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(C,array3,C-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"cvGEMM():\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvGEMM(A,B,alpha,C,beta,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#CC0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyvXsc-EsI/AAAAAAAABOE/NsWu6r5EPoU/s1600-h/pic_number_114.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245760487584305858" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyvXsc-EsI/AAAAAAAABOE/NsWu6r5EPoU/s400/pic_number_114.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因此,cvGEMM()利用#define的方式,將不必要的引數歸零或設為空或是將純量積設為1,所以才有cvmMul()及cvMulAdd()的變化,cvGEMM()的程式碼,它的數學運算方式如下所示&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMywOxPUa6I/AAAAAAAABOM/NUgZNZGtFaQ/s1600-h/mat_number_106.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245761433762032546" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMywOxPUa6I/AAAAAAAABOM/NUgZNZGtFaQ/s400/mat_number_106.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvGEMM()也可以做矩陣轉置的運算,它將矩陣轉置的定義如下&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define CV_GEMM_A_T 1&lt;br /&gt;#define CV_GEMM_B_T 2&lt;br /&gt;#define CV_GEMM_C_T 4&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;如果要轉置A矩陣的話就用CV_GEMM_A_T,如果要轉置A跟B矩陣的話就用CV_GEMM_A_T+CV_GEMM_B_T(1+2=3),如果要轉置A,B,C矩陣的話就要用CV_GEMM_A_T+CV_GEMM_B_T+CV_GEMM_C_T(1+2+4=7),它可以用參數來表示,也可以用參數代號表示,只要將參數代號的數值累加即可,參數代號用1,2,4這種方式是用類似linux權限控制規劃的方法,在數學上的意義來講就是2&lt;sup&gt;n&lt;/sup&gt;的加法可以表達出所有數字的組合,n=0,1,2...,在離散數學裡面可以找到這種計算規則,以下就是這個轉置運算的程式碼.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyzjgpiYkI/AAAAAAAABOk/GbboWM4HkKM/s1600-h/mat_number_107.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245765088620732994" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyzjgpiYkI/AAAAAAAABOk/GbboWM4HkKM/s400/mat_number_107.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvGEMM()轉置實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array1[]={&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array2[]={&lt;span style="color:#CC33CC;"&gt;4&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;6&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; array3[]={-&lt;span style="color:#CC33CC;"&gt;70&lt;/span&gt;,-&lt;span style="color:#CC33CC;"&gt;4&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;15&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;15&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;35&lt;/span&gt;,-&lt;span style="color:#CC33CC;"&gt;7&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;20&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *B=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *C=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double alpha =&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;.&lt;span style="color:#CC33CC;"&gt;5&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double beta =&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;.&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(B,array2,B-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(C,array3,C-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#CC0000;"&gt;"cvMatMulAdd():\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvGEMM(A,B,alpha,C,beta,ResultMatrix,CV_GEMM_A_T+CV_GEMM_B_T+CV_GEMM_C_T);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;3&lt;/span&gt;,&lt;span style="color:#CC33CC;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#CC0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#CC33CC;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#CC0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMyz9mqhUNI/AAAAAAAABOs/2BUB6HqmtFo/s1600-h/pic_number_115.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245765536912068818" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMyz9mqhUNI/AAAAAAAABOs/2BUB6HqmtFo/s400/pic_number_115.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這邊CV_GEMM_A_T+CV_GEMM_B_T+CV_GEMM_C_T的參數可以直接用7來代替,上面的程式碼將A,B,C三個矩陣都轉置了,而他的計算方式如下&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMy1JS6T0jI/AAAAAAAABO0/f_rrYc3bcFc/s1600-h/mat_number_108.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5245766837279642162" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMy1JS6T0jI/AAAAAAAABO0/f_rrYc3bcFc/s400/mat_number_108.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvMatMul()&lt;/strong&gt;&lt;br /&gt;與cvmMul()相同,做簡單的矩陣乘法運算,輸入與輸出的矩陣大小要符合矩陣運算的規格,第一個引數為輸入CvMat資料結構,第二個引數為輸入CvMat資料結構,第三個引數為輸出CvMat資料結構&lt;br /&gt;cvMatMul(輸入CvMat資料結構,輸入CvMat資料結構,輸出CvMat資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvMulAdd()&lt;/strong&gt;&lt;br /&gt;先相乘後相加的矩陣運算,輸入相乘與相加的矩陣及輸出的矩陣必須要符合矩陣運算規格,第一個引數為輸入CvMat相乘矩陣資料結構,第二個引數為輸入CvMat相乘矩陣資料結構,第三的引數為輸入CvMat相加矩陣資料結構,第四個引數為CvMat輸出資料結構&lt;br /&gt;cvMulAdd(輸入CvMat資料結構,輸入CvMat資料結構,輸入CvMat資料結構,輸出CvMat資料結構)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvGEMM()&lt;/strong&gt;&lt;br /&gt;矩陣乘法通用運算,具有純量積,矩陣相乘以及矩陣相加,矩陣轉置的功能,包含所有的矩陣運算,並且有一些函式是由cvGEMM()縮減而來如cvmMul(),cvMatMul(),cvMulAdd()等,可以藉由將一些數值設為空值縮減運算的式子,並且可以指定目標矩陣做轉置運算,轉置的規則則由CV_GEMM_A_T(1),CV_GEMM_B_T(2),CV_GEMM_C_T(4)的參數而來,如果要轉置B跟C矩陣則要用CV_GEMM_B_T+CV_GEMM_C_T參數代號則為6(2+4),其他轉置規則依此類推.第一個引數為輸入相乘CvMat資料結構,第二個引數為輸入相乘CvMat資料結構,第三個引數為輸入double型別相乘結構的純量積,第四個引數為輸入相加CvMat資料結構純量積,第五個引數為輸入double型別相加結構的純量積,第六個引數為輸出CvMat資料結構,第七個引數為輸入cvGEMM()的轉置矩陣參數&lt;br /&gt;cvGEMM(輸入CvMat相乘資料結構,輸入CvMat相乘資料結構,輸入double型別相乘純量積,輸入CvMat相加資料結構,輸入double型別相加純量積,輸出CvMat結果資料結構,目標參數或代號)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-5353596236372091403?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/5353596236372091403/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=5353596236372091403' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/5353596236372091403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/5353596236372091403'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/09/opencv-cvgemm.html' title='OpenCV線性代數-cvGEMM通用矩陣乘法'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HcQD5f5sLPc/SMyrkxaNICI/AAAAAAAABNM/TT19jM2VgrU/s72-c/mat_number_101.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-7221215638636115763</id><published>2008-09-11T15:06:00.017+08:00</published><updated>2008-09-14T11:49:25.077+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-正交投影向量計算</title><content type='html'>向量空間,為一個可被多個向量基底線性組合的向量集合,也就是有許多的向量基底它可以用任意數據的線性組合產生另外一個向量,存在的那個向量就被稱為是向量空間的一部分,在這邊,要用一個向量空間來計算另外一個向量的正交投影,正交投影表示的是存在向量空間的一個向量它是另外一個向量的投影向量,而且該向量減去它的投影向量會跟向量空間正交(垂直),存在於向量空間的那個向量就稱為正交投影向量(orthogonal projection vector)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMjY06RtfZI/AAAAAAAABMc/1xiJVZ8XuQI/s1600-h/%E6%AD%A3%E4%BA%A4%E6%8A%95%E5%BD%B1.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMjY06RtfZI/AAAAAAAABMc/1xiJVZ8XuQI/s400/%E6%AD%A3%E4%BA%A4%E6%8A%95%E5%BD%B1.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5244680169581280658" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由這張圖可以看出,W為一個向量空間,v為一個向量,而proj_v為v的正交投影向量,v-proj_v則會與W向量空間正交,正交投影向量的計算方式如下&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMja4zPq85I/AAAAAAAABMk/ShZOsBa1ax8/s1600-h/mat_number_98.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMja4zPq85I/AAAAAAAABMk/ShZOsBa1ax8/s400/mat_number_98.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5244682435436409746" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A為W空間向量基底的集合,為一個行向量(column vector)的矩陣,v則是要計算正交投影的目標向量,而它的程式計算,則是下面的方式&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMj2fcY7WYI/AAAAAAAABMs/zQ_ch2l6Vso/s1600-h/mat_number_99.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMj2fcY7WYI/AAAAAAAABMs/zQ_ch2l6Vso/s400/mat_number_99.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5244712786130065794" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;正交投影向量計算&lt;br /&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 102, 0);"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;float&lt;/span&gt; array1[]={&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,-&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,-&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;0&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;float&lt;/span&gt; array2[]={&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;3&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;void&lt;/span&gt; PrintMatrix(CvMat *Matrix,&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; Rows,&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; Cols,&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; Channels);&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,CV_32FC1);   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *v=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Transpose_A=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *MulTransposed_A=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *tempMatrix1=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *tempMatrix2=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;2&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *proj_v=cvCreateMat(&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(v,array2,v-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTranspose(A,Transpose_A);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvMulTransposed(A,MulTransposed_A,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvInvert(MulTransposed_A,MulTransposed_A);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(A,MulTransposed_A,tempMatrix1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(Transpose_A,v,tempMatrix2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(tempMatrix1,tempMatrix2,proj_v); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(proj_v,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;4&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;,&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;void&lt;/span&gt; PrintMatrix(CvMat *Matrix,&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; Rows,&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; Cols,&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;"&gt;for&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; i=&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;span style="font-weight:bold;"&gt;for&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; j=&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="font-weight:bold;"&gt;for&lt;/span&gt;(&lt;span style="font-weight:bold;"&gt;int&lt;/span&gt; k=&lt;span class="Apple-style-span" style="color: rgb(204, 51, 204);"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span class="Apple-style-span" style="color: rgb(204, 0, 0);"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMkT7YSQKOI/AAAAAAAABNE/QcP9YfxwtO0/s1600-h/pic_number_111.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMkT7YSQKOI/AAAAAAAABNE/QcP9YfxwtO0/s400/pic_number_111.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5244745151901870306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這裡用到了前面許多運算的函數,cvTranspose(),cvInvert(),cvmMul()以及cvMulTransposed(),cvMulTransposed()轉置相乘的乘積第一個引數為輸入CvMat矩陣向量,第二個引數為輸出CvMat矩陣向量,第三個引數為計算方式,分別為原矩陣乘以原矩陣轉置或是原矩陣轉置在乘以原矩陣的選擇,0為原矩陣與原矩陣轉置相乘,1為原矩陣轉置乘以原矩陣.正交投影的計算方法如下.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMkNd9PvzCI/AAAAAAAABM0/pvid-jbeQvk/s1600-h/mat_number_100.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMkNd9PvzCI/AAAAAAAABM0/pvid-jbeQvk/s400/mat_number_100.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5244738049357630498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvMulTransposed()&lt;/strong&gt;&lt;br /&gt;計算原矩陣與原矩陣轉置相乘,或是原矩陣轉置與原矩陣的乘積,因為原矩陣轉置相乘為對稱矩陣,因此可以用一些特殊算法來加快矩陣相乘的乘積,cvMulTransposed()第一個引數為輸入CvMat原矩陣資料結構,第二個引數為輸出CvMat資料結構,第三個引數為cvMulTransposed()這函式的參數,0為原矩陣與原矩陣轉置相乘,1為原矩陣轉置與原矩陣的乘積,第四個引數為輸入CvMat資料結構,將原矩陣與第四個引數的矩陣做相減,再做原矩陣轉置相乘原矩陣或是原矩陣相乘原矩陣轉置的運算&lt;br /&gt;cvMulTransposed(輸入CvMat原矩陣資料結構,輸出CvMat資料結構,0或1的參數,輸入CvMat矩陣相減資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-7221215638636115763?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/7221215638636115763/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=7221215638636115763' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7221215638636115763'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/7221215638636115763'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/09/opencv_11.html' title='OpenCV線性代數-正交投影向量計算'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_HcQD5f5sLPc/SMjY06RtfZI/AAAAAAAABMc/1xiJVZ8XuQI/s72-c/%E6%AD%A3%E4%BA%A4%E6%8A%95%E5%BD%B1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-2416322577602158653</id><published>2008-09-06T12:58:00.027+08:00</published><updated>2008-09-11T17:00:39.599+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-向量的表達,內積與外積運算</title><content type='html'>接下來就簡單的介紹向量,以及向量的計算了,在OpenCV內,向量的表達有很多種方式,向量是以CvMat資料結構為基準,實際上,矩陣本身就可以看成是一群的向量,它可以切割成行向量,列向量,在OpenCV內,甚至可以以通道為單位做為一個向量的表達,在一般的圖形裡,&amp;lt;R,G,B&amp;gt;格式的三通道本身就可以當做是一種向量的形式.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMIknGFt8xI/AAAAAAAABJ8/59T7xlDOtV4/s1600-h/mat_number_93.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMIknGFt8xI/AAAAAAAABJ8/59T7xlDOtV4/s400/mat_number_93.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242793170280772370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在下面就簡單的做內積跟外積的運算,並且用不同的方式來表達向量的運作.下面這個是用列向量的形式來做表達&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMItY3GnB8I/AAAAAAAABKU/OPyTerbsyqU/s1600-h/mat_number_96.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMItY3GnB8I/AAAAAAAABKU/OPyTerbsyqU/s400/mat_number_96.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242802821344462786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;列向量內積與外積的計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The DotProduct is : %.f\n\n"&lt;/span&gt;,cvDotProduct(Matrix1,Matrix2));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The CrossProduct is :\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCrossProduct(Matrix1,Matrix2,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIhSw4R0-I/AAAAAAAABJc/nQbzUhrpWkU/s1600-h/pic_number_108.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIhSw4R0-I/AAAAAAAABJc/nQbzUhrpWkU/s400/pic_number_108.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242789522454991842" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來就是以行向量的方式來表達,並做內積與外積的運算.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIrlweENvI/AAAAAAAABKM/ZzfUiSMG61U/s1600-h/mat_number_97.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIrlweENvI/AAAAAAAABKM/ZzfUiSMG61U/s400/mat_number_97.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242800843878840050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;行向量內積與外積的計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The DotProduct is : %.f\n\n"&lt;/span&gt;,cvDotProduct(Matrix1,Matrix2));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The CrossProduct is :\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCrossProduct(Matrix1,Matrix2,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIhnenj0DI/AAAAAAAABJk/bSfIrbUniOk/s1600-h/pic_number_109.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIhnenj0DI/AAAAAAAABJk/bSfIrbUniOk/s400/pic_number_109.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242789878330282034" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;接著是通道的方法,並且將通道的向量來做內外積的運算.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIjcCCXCGI/AAAAAAAABJ0/f6vn0luuiiY/s1600-h/mat_number_95.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIjcCCXCGI/AAAAAAAABJ0/f6vn0luuiiY/s400/mat_number_95.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242791880702756962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;以通道為單位的計算方式&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC3);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The DotProduct is : %.f\n\n"&lt;/span&gt;,cvDotProduct(Matrix1,Matrix2));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The CrossProduct is :\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvCrossProduct(Matrix1,Matrix2,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMIh7pBTkTI/AAAAAAAABJs/tWo746pWV50/s1600-h/pic_number_110.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SMIh7pBTkTI/AAAAAAAABJs/tWo746pWV50/s400/pic_number_110.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242790224720007474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;內積與外積的計算方式&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIcorgVpOI/AAAAAAAABJM/jRXlEVDldMg/s1600-h/mat_number_94.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5242784401411384546" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIcorgVpOI/AAAAAAAABJM/jRXlEVDldMg/s400/mat_number_94.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;從上面可以看的出來,向量的計算方式只有一些些微的數據有變化,在cvCreateMat()上要改變格式,在PrintMatrix()上要改變列印方式,其他的地方都是一樣,而輸出的結果也影響不大,在OpenCV上,向量的實作是實現在矩陣上,而它使用的方式也是很自由的,用這三種方式表達向量都是可行的.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvDotProduct()&lt;/strong&gt;&lt;br /&gt;向量內積的計算,第一個引數為輸入CvMat資料結構的向量,第二個引數為輸入CvMat資料結構的向量,輸入的向量每個維度的個數必須要相等,且必須具備為向量輸入的格式,輸出為一個double型別的數據為內積計算的結果.&lt;br /&gt;double cvDotProduct(輸入CvMat資料結構向量,輸入CvMat資料結構向量)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvCrossProduct()&lt;/strong&gt;&lt;br /&gt;向量外積的計算,必須要是三維向量,且必須要為向量具備的輸入格式,第一個引數為輸入CvMat三維向量資料結構,第二個引數為輸入CvMat三維向量資料結構第三個引數為輸出CvMat三維向量外積計算結果.&lt;br /&gt;cvCrossProduct(輸入CvMat三維向量資料結構,輸入CvMat三維向量資料結構,輸出CvMat三維向量資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-2416322577602158653?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/2416322577602158653/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=2416322577602158653' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/2416322577602158653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/2416322577602158653'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/09/opencv.html' title='OpenCV線性代數-向量的表達,內積與外積運算'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SMIknGFt8xI/AAAAAAAABJ8/59T7xlDOtV4/s72-c/mat_number_93.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-2543713191048807339</id><published>2008-09-03T21:21:00.015+08:00</published><updated>2008-09-15T23:55:20.022+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-cvNorm向量長度,距離計算</title><content type='html'>cvNorm()這個函數,可以用來做為特徵值比對的公式,也就是在資訊檢索這個領域內,將兩張圖形的特徵值擷取出來,利用紋理值擷取,統計直方圖,小波轉換,或是輪廓資訊等方法,在用裡面cvNorm()內建的CV_L1,CV_L2,CV_C參數來做圖形特徵值比對,cvNorm()的參數定義如下&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define CV_C 1&lt;br /&gt;#define CV_L1 2&lt;br /&gt;#define CV_L2 4&lt;br /&gt;#define CV_DIFF_C (CV_DIFF  CV_C)&lt;br /&gt;#define CV_DIFF_L1 (CV_DIFF  CV_L1)&lt;br /&gt;#define CV_DIFF_L2 (CV_DIFF  CV_L2)&lt;br /&gt;#define CV_RELATIVE_C   (CV_RELATIVE | CV_C)&lt;br /&gt;#define CV_RELATIVE_L1  (CV_RELATIVE | CV_L1)&lt;br /&gt;#define CV_RELATIVE_L2  (CV_RELATIVE | CV_L2)&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;CV_L1是一般的長度計算,CV_L2則是論文常用的歐幾里德距離,CV_C則是拿絕對值後的最大值,在圖形檢索比對這方面cvNorm()還算是不錯用的函式,cvNorm()還提供了遮罩的功能,可以將不必要的特徵資訊做掩蓋的功能,遮罩的部份就要參考前面"圖形的Mask遮罩實作"這地方,與前面圖形Mask使用原理相同.&lt;br /&gt;&lt;br /&gt;在線性代數的部分Norm,為向量長度的意思,最常見的長度計算方式為1-Norm將所有向量數據取絕對值的總和,2-Norm為歐機里德距離,將所有數據平方在開根號,∞-Norm為將所有向量數據絕對值後取對大的那個,當然,這分別代表著CV_L1,CV_L2,CV_C的使用,在下面則用簡單的方式做cvNorm()的長度計算.&lt;br /&gt;&lt;br /&gt;cvNorm()長度的計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"1-norm is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix2,NULL,CV_L1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"2-norm is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix2,NULL,CV_L2));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Infininte norm is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix2,NULL,CV_C));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIvg23s07I/AAAAAAAABLc/Gq-j755zYYQ/s1600-h/pic_number_106.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIvg23s07I/AAAAAAAABLc/Gq-j755zYYQ/s400/pic_number_106.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242805157744137138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvNorm()的輸出為一個double型別的數據,上面的程式可以簡單的看出來cvNorm()對長度的計算,要計算Matrix2的長度,則是要把第二個引數設置為空,而第二個引數的輸入則是代表著距離,在下面的程式碼範例會介紹到,對於長度的計算公式則是如下所示.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SL-_JXhyumI/AAAAAAAABIM/6Hpr4WEqtO4/s1600-h/mat_number_87.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SL-_JXhyumI/AAAAAAAABIM/6Hpr4WEqtO4/s400/mat_number_87.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242118658938026594" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來是長度計算Mask使用的範例,利用一個遮罩將不想被計算的數據給取消掉,0代表不想使用的數據,1代表要被計算的數據.&lt;br /&gt;&lt;br /&gt;cvNorm()遮罩與長度的計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;uchar MaskArray[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *MaskMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_8UC1);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(MaskMatrix,MaskArray,MaskMatrix-&amp;gt;step); &lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"1-norm is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix2,NULL,CV_L1,MaskMatrix));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"2-norm is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix2,NULL,CV_L2,MaskMatrix));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Infininte norm is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix2,NULL,CV_C,MaskMatrix));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIwEbvDNdI/AAAAAAAABLk/rMZloj8ow4I/s1600-h/pic_number_107.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIwEbvDNdI/AAAAAAAABLk/rMZloj8ow4I/s400/pic_number_107.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242805768935388626" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因此,實際上做長度計算的只有6跟-1這兩個數據,在這邊,遮罩的使用CvMat資料結構必須要用單通道非浮點數的數據型別,如CV_32FC1及CV_64FC1都是不可用來作遮罩矩陣的參數宣告.而矩陣也不可以用float及double的型別.遮罩長度的計算方式如下&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SL--xLmARvI/AAAAAAAABIE/tyO7iz_Rvso/s1600-h/mat_number_88.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SL--xLmARvI/AAAAAAAABIE/tyO7iz_Rvso/s400/mat_number_88.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242118243417605874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來,就是距離的計算了,它可以比較兩個向量的距離大小,也可以用許多向量的距離來做分數(Score)的參考目標,也就是說,在做圖形比對的時候,特徵值距離越小的兩張圖片某些特殊的特徵就越接近(看是用什麼方法擷取特徵值),因此,在一個龐大的圖形特徵資料庫中,將目標圖形的特徵值對每一筆資料做比對,可以藉由取得最小距離來找出最相似的圖形,距離的簡單例子就如下&lt;br /&gt;&lt;br /&gt;cvNorm()距離的計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step); &lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"1-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_DIFF_L1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"2-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_DIFF_L2));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Infininte norm distance is : %.1f\n\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_DIFF_C));&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Relative 1-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_RELATIVE_L1));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Relative 2-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_RELATIVE_L2));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Relative infininte norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_RELATIVE_C));&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMIwYjdEl5I/AAAAAAAABLs/QgayRWssPgA/s1600-h/pic_number_107-1.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SMIwYjdEl5I/AAAAAAAABLs/QgayRWssPgA/s400/pic_number_107-1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242806114604849042" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;同樣的,它跟長度的計算有點像,比較不同的地方是將兩個向量個別值做相減在對它做1-Norm,2-Norm或是Infininte-Norm的處理,而2-Norm則是論文常用的歐幾里德距離,CV_RELATIVE_L1,CV_RELATIVE_L2,CV_RELATIVE_C則是取它們相對差異的距離.以下則是它們的計算方式.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SL-_cb7pTZI/AAAAAAAABIU/pZkkb9ARka0/s1600-h/mat_number_89.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SL-_cb7pTZI/AAAAAAAABIU/pZkkb9ARka0/s400/mat_number_89.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242118986537717138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SM6FVJhdu1I/AAAAAAAABO8/DoF_Nw_0w-U/s1600-h/mat_number_90.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SM6FVJhdu1I/AAAAAAAABO8/DoF_Nw_0w-U/s400/mat_number_90.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5246277214313233234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來就是遮罩的部份了,實作方式也跟長度的做法差不多.&lt;br /&gt;&lt;br /&gt;cvNorm()遮罩與距離的計算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;uchar MaskArray[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *MaskMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_8UC1);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(MaskMatrix,MaskArray,MaskMatrix-&amp;gt;step); &lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"1-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_DIFF_L1,MaskMatrix));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"2-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_DIFF_L2,MaskMatrix));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Infininte norm distance is : %.1f\n\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_DIFF_C,MaskMatrix));&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Relative 1-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_RELATIVE_L1,MaskMatrix));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Relative 2-norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_RELATIVE_L2,MaskMatrix));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"Relative infininte norm distance is : %.1f\n"&lt;/span&gt;,cvNorm(Matrix1,Matrix2,CV_RELATIVE_C,MaskMatrix));&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIwxd5LGVI/AAAAAAAABL0/K9NLL6qt5gI/s1600-h/pic_number_107-2.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SMIwxd5LGVI/AAAAAAAABL0/K9NLL6qt5gI/s400/pic_number_107-2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242806542608832850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由上面看,有用到的Matrix1向量為&amp;lt;5,3&amp;gt;,Matrix2的向量為&amp;lt;6,-1&amp;gt;,因此Mask為0的向量數據都被忽略了,而Mask為1的被保留,計算的方式如下所示.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SL_EIJE32tI/AAAAAAAABIs/-7osv0CmPEs/s1600-h/mat_number_91.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SL_EIJE32tI/AAAAAAAABIs/-7osv0CmPEs/s400/mat_number_91.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242124135436901074" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SL_ES7om1qI/AAAAAAAABI0/F-Xi65xLAK0/s1600-h/mat_number_92.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SL_ES7om1qI/AAAAAAAABI0/F-Xi65xLAK0/s400/mat_number_92.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5242124320807245474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvNorm()&lt;/strong&gt;&lt;br /&gt;計算向量的長度或距離,分為1-Norm(CV_L1),2-Norm(CV_L2),∞-Norm(CV_C)等三種方法,也可以計算相對距離,分別為CV_RELATIVE_C,CV_RELATIVE_L1,CV_RELATIVE_L2,在做資訊檢索比對上有很大的用處.第一個跟第二個引數為輸入向量的CvMat資料結構,如果要計算長度的話第二個引數要為空,第三個引數為cvNorm()的參數,第四個引數為單通道CvMat資料結構的CV_8UC1參數(非浮點數型別)的遮罩矩陣,cvNorm()的輸出為一個double型別的數據,代表著向量的長度或距離.&lt;br /&gt;cvNorm(輸入CvMat資料結構,輸入CvMat資料結構或為空,參數或代號,輸入CvMat遮罩)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-2543713191048807339?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/2543713191048807339/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=2543713191048807339' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/2543713191048807339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/2543713191048807339'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/09/opencv-cvnorm1.html' title='OpenCV線性代數-cvNorm向量長度,距離計算'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HcQD5f5sLPc/SMIvg23s07I/AAAAAAAABLc/Gq-j755zYYQ/s72-c/pic_number_106.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-1628055709316144949</id><published>2008-08-19T12:00:00.021+08:00</published><updated>2008-08-21T21:07:17.945+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-線性映射,矩陣變換</title><content type='html'>線性映射(Linear transformation),是由向量為基礎的映射函式,在OpenCV內標準的向量表達方式為通道的向量,也就是今天為一組&amp;lt;r,g,b&amp;gt;三通道所組成的圖形,則圖形內的&amp;lt;r,g,b&amp;gt;個別值則代表一個向量,cvTransform()則是為此而做的轉換,下面則是簡單的一個通道向量的運算&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKuKEkzuEEI/AAAAAAAABFo/0J2yesyoCqM/s1600-h/mat_number_84.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKuKEkzuEEI/AAAAAAAABFo/0J2yesyoCqM/s400/mat_number_84.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236430802953048130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;簡單線性映射實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *x=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC3);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *T_x=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC4);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,Array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(x,Array2,x-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTransform(x,T_x,A);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(T_x,T_x-&amp;gt;rows,T_x-&amp;gt;cols,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,int Rows,&lt;strong&gt;int&lt;/strong&gt; Cols,&lt;strong&gt;int&lt;/strong&gt; Channels)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; k=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;k&amp;lt;Channels;k++)&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[k]);&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;&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKuGMEp9sYI/AAAAAAAABFY/azpBed_IXcI/s1600-h/pic_number_104.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5236426533714637186" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKuGMEp9sYI/AAAAAAAABFY/azpBed_IXcI/s400/pic_number_104.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKuF8wDU3RI/AAAAAAAABFQ/iq6ckSm1HRQ/s1600-h/mat_number_85.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5236426270485830930" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKuF8wDU3RI/AAAAAAAABFQ/iq6ckSm1HRQ/s400/mat_number_85.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A矩陣則是叫轉移矩陣(Transition Matrix),可以專門在做基底座標變換的運用,這邊要特別注意的是,cvTransform()它拿通道來代替向量,而不是拿矩陣來代替向量,事實上,矩陣也可以作為向量的表達,但不適用於cvTransform().這邊cvTransform()輸入,x矩陣為通道三,而A則一定要輸入通道一的矩陣,輸出的T_x矩陣為通道四,而對於一個向量而言,此種運算方式叫做線性映射,如果對於一個矩陣圖形的話,則叫做矩陣變換(Matrix Transformation).&lt;br /&gt;&lt;br /&gt;矩陣變換的部分,就拿RGB轉YCbCr的公式來實作,跟前面的線性映射不同的是,它直接拿通道三的矩陣來做色彩空間的轉換.&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SK1ckm8GL9I/AAAAAAAABGQ/fuzKdExeQ4M/s1600-h/mat_number_86.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SK1ckm8GL9I/AAAAAAAABGQ/fuzKdExeQ4M/s400/mat_number_86.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236943725699411922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;RGB轉YCbCr實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;2989&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5867&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1140&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;1687&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;3312&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;4183&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;.&lt;span style="color:#cc33cc;"&gt;0816&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;128&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;128&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *TransitionMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ShiftVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *Image1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"MineCar.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *GrayImage1=cvLoadImage(&lt;span style="color:#cc0000;"&gt;"MineCar.jpg"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *YCbCrImage1=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *YImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *CbImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;IplImage *CrImage=cvCreateImage(cvGetSize(Image1),IPL_DEPTH_8U,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(TransitionMatrix,Array1,TransitionMatrix-&amp;gt;step);  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(ShiftVector,Array2,ShiftVector-&amp;gt;step);  &lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTransform(Image1,YCbCrImage1,TransitionMatrix,ShiftVector);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSplit(YCbCrImage1,YImage,CbImage,CrImage,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"YImage"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"YImage"&lt;/span&gt;,YImage);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvNamedWindow(&lt;span style="color:#cc0000;"&gt;"GrayImage"&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvShowImage(&lt;span style="color:#cc0000;"&gt;"GrayImage"&lt;/span&gt;,GrayImage1);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvWaitKey(&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;原始圖片:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SK1elA4sezI/AAAAAAAABGY/IsoexocXp-k/s1600-h/MineCar.jpg"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SK1elA4sezI/AAAAAAAABGY/IsoexocXp-k/s400/MineCar.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5236945931687721778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SK1kGG5ClHI/AAAAAAAABGo/acy1b0GG-wQ/s1600-h/pic_number_105.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SK1kGG5ClHI/AAAAAAAABGo/acy1b0GG-wQ/s400/pic_number_105.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5236951997793604722" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由上面線性映射的基礎來對一個通道三個圖形做矩陣變換,這邊將RGB的圖片藉由公式轉成YCbCr的格式,這個部分就叫做色彩空間的轉換,Y代表的是亮度,也就是灰階值,Cb則是藍色的色差,Cr則為紅色的色差,因此,這邊直接拿cvLoadImage()讀取灰階圖形來跟Y值圖形來做比較.中間有用到通道分割的函式cvSplit()則是要參考前面資料結構"通道的分割,合併與混合"的部份,cvTransform()的第四個引數則是對轉移矩陣計算後的數值結果做平移的運算.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvTransform()&lt;/strong&gt;&lt;br /&gt;將圖形或矩陣做矩陣變換,矩陣變換的向量維度是以通道為基礎,也就是轉移矩陣會對通道向量做相乘而完成色彩空間的轉換,第四個引數則是對計算結果的向量做位移的調整,而轉移矩陣的m*n大小可以決定輸出通道的維度,這邊m代表輸入通道數,n代表輸出通道數.&lt;br /&gt;cvTransform(輸入CvMat或IplImage資料結構,輸出CvMat或IplImage資料結構,CvMat轉移矩陣資料結構,CvMat平移向量資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-1628055709316144949?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/1628055709316144949/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=1628055709316144949' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1628055709316144949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1628055709316144949'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/08/opencv.html' title='OpenCV線性代數-線性映射,矩陣變換'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SKuKEkzuEEI/AAAAAAAABFo/0J2yesyoCqM/s72-c/mat_number_84.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-572072954431383490</id><published>2008-08-16T13:20:00.017+08:00</published><updated>2008-12-10T01:09:21.389+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-cvSVBkSb奇異值倒回替代法</title><content type='html'>cvSVBkSb()為解線性系統解專用的,實際上它跟前面的cvSolve()的線性系統求解的奇異值法是一樣的東西,cvSolve()內部的CV_SVD參數它的計算方式實際上就是呼叫cvSVBkSb()這個函式,所以,用起來的方式差不多,在這邊簡單的做cvSVBkSb()的使用方法.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKfv160JCBI/AAAAAAAABEQ/vWQr-OEwj_c/s1600-h/mat_number_79.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKfv160JCBI/AAAAAAAABEQ/vWQr-OEwj_c/s400/mat_number_79.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5235416801441548306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;線性系統求解-奇異值倒回替代法&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;7&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;11&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;7&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;7&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;7&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *A=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *b=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *W=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *U=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *x=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(A,Array1,A-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(b,Array2,b-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSVD(A,W,U,V);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSVBkSb(W,U,V,b,x,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(x,x-&amp;gt;rows,x-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;在這邊,要用cvSVBkSb()之前就要先用到前面的cvSVD()了,在將cvSVD()奇異值分解的數值餵進cvSVBkSb()裡面解線性系統解,這邊奇異值倒回替代法用的是虛反矩陣的觀念,虛反矩陣則是在前面cvInvert()裡面有提到,而它的第四個引數為cvSVBkSb()的參數及代號,與cvSVD()相同,可輸入的參數為&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define CV_SVD_U_T        2&lt;br /&gt;#define CV_SVD_V_T        4&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;分別代表U矩陣跟V矩陣輸入是否為轉置,如果不需要任何轉置輸入則將參數代號預設為0,而此題的線性系統,驗證及計算的方式如下&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKf0nfYY1SI/AAAAAAAABFA/1aVWHaWFUrE/s1600-h/mat_number_80.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKf0nfYY1SI/AAAAAAAABFA/1aVWHaWFUrE/s400/mat_number_80.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5235422051117356322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKfwRmOGNZI/AAAAAAAABEg/eRSR_RXEc4g/s1600-h/mat_number_81.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKfwRmOGNZI/AAAAAAAABEg/eRSR_RXEc4g/s400/mat_number_81.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5235417276949607826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKfw4L2JFzI/AAAAAAAABEw/iGG-4vKFjFE/s1600-h/mat_number_82.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKfw4L2JFzI/AAAAAAAABEw/iGG-4vKFjFE/s400/mat_number_82.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5235417939884709682" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKfxKKnSpkI/AAAAAAAABE4/v0CttM0kPtE/s1600-h/mat_number_83.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKfxKKnSpkI/AAAAAAAABE4/v0CttM0kPtE/s400/mat_number_83.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5235418248791631426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SIvyxXk8jlI/AAAAAAAAAvY/22AgzV_j0-I/s1600-h/mat_number_36.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SIvyxXk8jlI/AAAAAAAAAvY/22AgzV_j0-I/s400/mat_number_36.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227538722450083410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvSVBkSb()&lt;/strong&gt;&lt;br /&gt;為線性系統求解的奇異值替代倒回法,對於一個無解的線性系統,使用奇異值替代倒回法可以求得近似解,但是使用cvSVBkSb()這個函式時必須要先做cvSVD()奇異值分解的計算,在將分解後的矩陣丟給cvSVBkSb()求線性系統的解,使用到的是虛反矩陣的概念,第一個引數為CvMat結構的W矩陣,第二個引數為CvMat結構的U矩陣,第三個引數為CvMat結構的V矩陣,前面的矩陣結構都必須經由cvSVD()奇異值分解計算而得,第四個引數為Ax的線性組合數據,第五個引數為x的解集合,第六個引數則是cvSVBkSb()的參數輸入,只有CV_SVD_U_T及CV_SVD_V_T或者是0(無參數)這三種.&lt;br /&gt;cvSVBkSb(CvMat資料結構W矩陣輸入,CvMat資料結構U矩陣輸入,CvMat資料結構V矩陣輸入,CvMat資料結構b矩陣輸入,CvMat資料結構線性系統解集合x矩陣,目標參數或代號)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-572072954431383490?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/572072954431383490/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=572072954431383490' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/572072954431383490'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/572072954431383490'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/08/opencv-cvsvbksb.html' title='OpenCV線性代數-cvSVBkSb奇異值倒回替代法'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SKfv160JCBI/AAAAAAAABEQ/vWQr-OEwj_c/s72-c/mat_number_79.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-8037232524587130459</id><published>2008-08-14T07:28:00.010+08:00</published><updated>2008-08-15T19:05:10.699+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-cvSVD奇異值分解(2)</title><content type='html'>這邊就要簡單介紹cvSVD()的所有參數及用法,cvSVD()在"cxcore.h"裡面的參數分別被定義為&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#009900;"&gt;#define CV_SVD_MODIFY_A 1&lt;br /&gt;#define CV_SVD_U_T 2&lt;br /&gt;#define CV_SVD_V_T 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;第一個CV_SVD_MODIFY_A是將A矩陣的空間做填充,用空間換取時間的方式做加速的運算,而後面的CV_SVD_U_T,及CV_SVD_V_T則是單純的將U跟V做轉置.接著下面的程式拿非奇異矩陣做奇異值分解並且加上cvSVD()的參數.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKVaEH3F9oI/AAAAAAAABCQ/75w4P-7b2ms/s1600-h/mat_number_75.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5234689168764171906" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKVaEH3F9oI/AAAAAAAABCQ/75w4P-7b2ms/s400/mat_number_75.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;非奇異矩陣奇異值分解&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;double&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *W=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *U=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V_T=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSVD(Matrix1,W,U,V,CV_SVD_MODIFY_A);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nW\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(W,W-&gt;rows,W-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nU\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(U,U-&amp;gt;rows,U-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nV\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(V,V-&amp;gt;rows,V-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nValid\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(U,W,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTranspose(V,V_T);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(ResultMatrix,V_T,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,ResultMatrix-&amp;gt;rows,ResultMatrix-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKVieBYOuOI/AAAAAAAABCw/3xiXdg0kLRI/s1600-h/pic_number_102.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKVieBYOuOI/AAAAAAAABCw/3xiXdg0kLRI/s400/pic_number_102.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234698409793730786" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面使用了CV_SVD_MODIFY_A,由上面的非奇異矩陣得知,無法求得他的Eign Value及Eigen Vector,但是可以求得它的奇異值以及它的分解矩陣,並且藉由矩陣相乘的方式計算回原矩陣.計算及驗證的方式如下&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKVaUwZfmHI/AAAAAAAABCY/SxsR_X86l54/s1600-h/mat_number_76.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5234689454523783282" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKVaUwZfmHI/AAAAAAAABCY/SxsR_X86l54/s400/mat_number_76.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKVag65ZzJI/AAAAAAAABCg/MYqV8YU99TQ/s1600-h/mat_number_77.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5234689663500405906" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKVag65ZzJI/AAAAAAAABCg/MYqV8YU99TQ/s400/mat_number_77.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKVarFkmutI/AAAAAAAABCo/iGMDCv9fjCU/s1600-h/mat_number_78.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5234689838164654802" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKVarFkmutI/AAAAAAAABCo/iGMDCv9fjCU/s400/mat_number_78.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而使用了CV_SVD_V_T這個參數則可以省略掉對V做cvTranspose()轉置的步驟.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKVaEH3F9oI/AAAAAAAABCQ/75w4P-7b2ms/s1600-h/mat_number_75.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5234689168764171906" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKVaEH3F9oI/AAAAAAAABCQ/75w4P-7b2ms/s400/mat_number_75.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvSVD()使用CV_SVD_V_T參數&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;double&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *W=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *U=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V_T=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSVD(Matrix1,W,U,V_T,CV_SVD_V_T);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nW\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(W,W-&amp;gt;rows,W-&amp;gt;cols);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nU\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(U,U-&amp;gt;rows,U-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nV_T\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(V_T,V_T-&amp;gt;rows,V_T-&amp;gt;cols);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nValid\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(U,W,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(ResultMatrix,V_T,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,ResultMatrix-&amp;gt;rows,ResultMatrix-&amp;gt;cols);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;      &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=0;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);        &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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}     &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKVizGu822I/AAAAAAAABC4/jyaihEjZTxI/s1600-h/pic_number_103.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKVizGu822I/AAAAAAAABC4/jyaihEjZTxI/s400/pic_number_103.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234698772008459106" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式碼跟前面的差別,就是直接在cvSVD()內部將V矩陣轉置,可以直接將奇異值分解做驗證,而CV_SVD_U_T亦是直接將U矩陣在內部轉置.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvSVD()&lt;/strong&gt;&lt;br /&gt;將任何的矩陣做奇異值分解,假如要分解的矩陣是m*n,則W矩陣CvMat資料結構輸入格式必須是m*n,U矩陣CvMat資料結構輸入格式必須是m*m,V矩陣CvMat資料結構輸入格式必須是n*n,cvSVD()第一個引數為輸入目標CvMat矩陣資料結構,第二個引數為輸出W矩陣CvMat資料結構,第三個引數為U矩陣CvMat資料結構,第四個引數為V矩陣CvMat資料結構,第五個引數為cvSVD()的參數,分別為CV_SVD_MODIFY_A,CV_SVD_U_T,CV_SVD_V_T.&lt;br /&gt;cvSVD(輸入CvMat資料結構,輸出W矩陣CvMat結構,輸出U矩陣CvMat結構,輸出V矩陣CvMat結構,目標參數或代號)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-8037232524587130459?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/8037232524587130459/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=8037232524587130459' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/8037232524587130459'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/8037232524587130459'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/08/opencv-cvsvd2.html' title='OpenCV線性代數-cvSVD奇異值分解(2)'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_HcQD5f5sLPc/SKVaEH3F9oI/AAAAAAAABCQ/75w4P-7b2ms/s72-c/mat_number_75.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-8416107616159382930</id><published>2008-08-11T16:08:00.041+08:00</published><updated>2008-08-16T13:08:47.044+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-cvSVD奇異值分解(1)</title><content type='html'>奇異值分解(Singular Value Decomposition,SVD),可以說是對角化應用的特例,它具有與Eigen Value,Eigen Vector相同的特性,分解後向量的矩陣乘積可以還原為原矩陣,而他可以對奇異矩陣(Singular Matrix)做分解,亦可以對非奇異矩陣做分解.奇異矩陣的定義就是不能計算為反矩陣的矩陣,包括方陣,以及非方陣的長方形矩陣.而奇異值分解的計算它的數學定義為&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKV51kSgeSI/AAAAAAAABDA/41sYZSwWZ7U/s1600-h/mat_number_74.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKV51kSgeSI/AAAAAAAABDA/41sYZSwWZ7U/s400/mat_number_74.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234724103069399330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;它將奇異矩陣轉置後相乘,藉由這個方法計算出對稱矩陣,在對對稱矩陣做SVD分解,由上面可知,原矩陣大小為m*n,而W(Sigma)矩陣的舉陣大小必須為m*n,U的矩陣大小必須為m*m,而V的矩陣大小為n*n,它可以藉由矩陣矩陣相乘的方式算回原矩陣.&lt;br /&gt;&lt;br /&gt;下面這個是拿2*3的奇異矩陣做奇異值分解&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKDKvblIdNI/AAAAAAAAA90/s5oihnizhqo/s1600-h/mat_number_72.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKDKvblIdNI/AAAAAAAAA90/s5oihnizhqo/s400/mat_number_72.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5233405683210679506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;奇異矩陣SVD分解&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;double&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *W=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *U=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V_T=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSVD(Matrix1,W,U,V);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nW\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(W,W-&amp;gt;rows,W-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nU\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(U,U-&amp;gt;rows,U-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nV\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(V,V-&amp;gt;rows,V-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nValid\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(U,W,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTranspose(V,V_T);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(ResultMatrix,V_T,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,ResultMatrix-&amp;gt;rows,ResultMatrix-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=0;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=0;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKKlOT4VOVI/AAAAAAAAA_w/b4FxKLkbn1g/s1600-h/pic_number_101.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKKlOT4VOVI/AAAAAAAAA_w/b4FxKLkbn1g/s400/pic_number_101.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5233927382231234898" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式,利用了前面奇異值分解公式說明的方式,cvSVD()的內部運算,先將矩陣做轉置在相乘,求得對稱矩陣,在將該矩陣做奇異值分解,而它的W,U,V矩陣的大小皆不相同,W將會是原矩陣大小2*3,V則是2*2,U則會是3*3,因此利用公式倒回運算,可以計算出原矩陣,計算以及驗證的公式如下.&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKKwGwuNDTI/AAAAAAAABAA/LbeAPws7WYM/s1600-h/mat_number_73.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKKwGwuNDTI/AAAAAAAABAA/LbeAPws7WYM/s400/mat_number_73.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5233939347162336562" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKNrGv31ifI/AAAAAAAABAo/5O9Liysd58s/s1600-h/mat_number_73-1.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKNrGv31ifI/AAAAAAAABAo/5O9Liysd58s/s400/mat_number_73-1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234144955608697330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKNtnK8MvII/AAAAAAAABB0/v-qYwW6HRoE/s1600-h/mat_number_73-2.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKNtnK8MvII/AAAAAAAABB0/v-qYwW6HRoE/s400/mat_number_73-2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234147711653821570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而對稱矩陣的奇異值分解,則是不需要再做轉置後相乘,直接做奇異值分解.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKDK-91kQpI/AAAAAAAAA98/hzSdrKunbzk/s1600-h/mat_number_70.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKDK-91kQpI/AAAAAAAAA98/hzSdrKunbzk/s400/mat_number_70.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5233405950104453778" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;對稱矩陣奇異值分解&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;double&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *W=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *U=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *V_T=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSVD(Matrix1,W,U,V);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nW\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(W,W-&amp;gt;rows,W-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nU\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(U,U-&amp;gt;rows,U-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nV\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(V,V-&amp;gt;rows,V-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nValid\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(U,W,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTranspose(V,V_T);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(ResultMatrix,V_T,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,ResultMatrix-&amp;gt;rows,ResultMatrix-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=0;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=0;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKQqrBTDi-I/AAAAAAAABCI/rHV81yItwNI/s1600-h/pic_number_100.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKQqrBTDi-I/AAAAAAAABCI/rHV81yItwNI/s400/pic_number_100.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234355585482460130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這是一個直接用對稱矩陣做奇異值分解的程式,奇異值分解很特別的地方,它對對稱矩陣做奇異值分解求得的結果為特徵值(Eigen Value)及特徵向量(Eigen Vector),但是相較於cvEigenVV()這兩個使用的是不同的演算法,而一般的矩陣則無法用cvSVD()求特徵值及特徵向量,上面的程式用cvSVD()分別求出它的W,U,V,在代回原公式做驗證,驗證的方法如下&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKZfXnZlM8I/AAAAAAAABDg/ecVjLK_V5Rk/s1600-h/mat_number_71.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SKZfXnZlM8I/AAAAAAAABDg/ecVjLK_V5Rk/s400/mat_number_71.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234976476182688706" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKZgx8jGEAI/AAAAAAAABEA/u27vHApsJDU/s1600-h/mat_number_71-1.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKZgx8jGEAI/AAAAAAAABEA/u27vHApsJDU/s400/mat_number_71-1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234978028047962114" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKZfzWuJHFI/AAAAAAAABDw/35vMGcKiokk/s1600-h/mat_number_71-2.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SKZfzWuJHFI/AAAAAAAABDw/35vMGcKiokk/s400/mat_number_71-2.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234976952741862482" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;驗證對稱矩陣奇異值分解&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKZgB3WxXXI/AAAAAAAABD4/aGU8BHrfh9Q/s1600-h/mat_number_71-3.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKZgB3WxXXI/AAAAAAAABD4/aGU8BHrfh9Q/s400/mat_number_71-3.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234977202020375922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-8416107616159382930?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/8416107616159382930/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=8416107616159382930' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/8416107616159382930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/8416107616159382930'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/08/opencv-cvsvd1.html' title='OpenCV線性代數-cvSVD奇異值分解(1)'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SKV51kSgeSI/AAAAAAAABDA/41sYZSwWZ7U/s72-c/mat_number_74.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-4936485882256424074</id><published>2008-08-03T05:32:00.026+08:00</published><updated>2008-12-10T01:09:24.830+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-cvEigenVV實作</title><content type='html'>cvEigenVV()為計算CvMat方陣的特徵值(Eigen Value)跟特徵向量(Eigen Vector)的函式,但是,OpenCV的Eigen Value跟Eigen Vector計算並不是一般性的用法,無法處理正常的特徵值跟特徵向量的計算,cvEigenVV()是使用到Jacobi Eigenvalue Algorithm的方法,輸入必須要對稱矩陣,輸入的對稱矩陣做Jacobi Transformation的轉換,這部份的資料就要參考數值分析(Numerical Recipes)的相關書籍了,而Jacobi Eigenvalue Algorithm有將Eigen Value重新Sort過,因此特徵值的排序會是由大到小排列,而不適用於很多矩陣對角化的解題應用.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKOpIKNUvEI/AAAAAAAABCA/PY7uNTOu6bU/s1600-h/mat_number_66.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SKOpIKNUvEI/AAAAAAAABCA/PY7uNTOu6bU/s400/mat_number_66.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5234213149578935362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;cvEigenVV()實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;double&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenValue_Row=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenValue=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenVector=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *EigenVector_Invert=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *ResultMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_64FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetZero(EigenValue);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvEigenVV(Matrix1,EigenVector,EigenValue_Row,DBL_EPSILON);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nThe EigenValue_Row is:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(EigenValue_Row,EigenValue_Row-&amp;gt;rows,EigenValue_Row-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nThe EigenVector is:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(EigenVector,EigenVector-&amp;gt;rows,EigenVector-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nThe EigenValue is:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSet2D(EigenValue,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,cvGet2D(EigenValue_Row,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSet2D(EigenValue,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,cvGet2D(EigenValue_Row,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSet2D(EigenValue,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,cvGet2D(EigenValue_Row,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(EigenValue,EigenValue-&amp;gt;rows,EigenValue-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvTranspose(EigenVector,EigenVector);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(EigenVector,EigenValue,ResultMatrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvInvert(EigenVector,EigenVector_Invert,CV_LU);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvmMul(ResultMatrix,EigenVector_Invert,ResultMatrix);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nTo validate Matrix\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(ResultMatrix,ResultMatrix-&amp;gt;rows,ResultMatrix-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKDMTKEeNpI/AAAAAAAAA-M/28WPC5xXugs/s1600-h/pic_number_99.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SKDMTKEeNpI/AAAAAAAAA-M/28WPC5xXugs/s400/pic_number_99.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5233407396497208978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;由上面可以知道Eigen Value的排列方式為&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SJfZLfT53EI/AAAAAAAAA70/h-WQ-gfZbVk/s1600-h/mat_number_67.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230888283620891714" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SJfZLfT53EI/AAAAAAAAA70/h-WQ-gfZbVk/s400/mat_number_67.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;而Eigen Vector的排列方式為&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJfZclCLkJI/AAAAAAAAA78/fj5FNzsB8P8/s1600-h/mat_number_68.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230888577214943378" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJfZclCLkJI/AAAAAAAAA78/fj5FNzsB8P8/s400/mat_number_68.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;因此,要驗證是否可行,利用&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJfZpoNF_PI/AAAAAAAAA8E/W6tkAkoSN7M/s1600-h/mat_number_69.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5230888801404321010" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJfZpoNF_PI/AAAAAAAAA8E/W6tkAkoSN7M/s400/mat_number_69.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;的方法將它還原為對稱矩陣,則必須要將輸出的列矩陣補0讓它成為對角矩陣,並且將Eigen Vector矩陣做轉置,帶入驗證公式,輸出結果為原對稱矩陣,因此可以證明此函式及輸入值無誤&lt;br /&gt;&lt;br /&gt;cvEigenVV()第一的引數為特徵向量(Eigen Vector)第二個引數為特徵值(Eigen Value)第三個引數為精確度,DBL_EPSILON為最小double型別精確度,而一般精確度的使用定義為&lt;br /&gt;&lt;span style="color:#009900;"&gt;&lt;br /&gt;#define FLT_EPSILON 1.19209290E-07F&lt;br /&gt;#define DBL_EPSILON 2.2204460492503131E-16&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;這可以來做浮點數的精確度比較運算使用.&lt;br /&gt;而他的使用方式就如同下所述&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;bool&lt;/strong&gt; IsEqual(&lt;strong&gt;double&lt;/strong&gt; x,&lt;strong&gt;double&lt;/strong&gt; y)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;if&lt;/strong&gt;(x-y&amp;lt;DBL_EPSILON)&lt;br /&gt;&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;&lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;true&lt;/strong&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;else&lt;/strong&gt;&lt;br /&gt;&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;&lt;strong&gt;return&lt;/strong&gt; &lt;strong&gt;false&lt;/strong&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;double型別則對照DBL_EPSILON參數,float型別則對照FLT_EPSILON,而cvEigenVV()則可以自行定義它的精確度比較運算的大小.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvEigenVV()&lt;/strong&gt;&lt;br /&gt;利用Jacobi Eigenvalue Algorithm法計算Eigen Value,Eigen Vector,輸入只能為對稱矩陣,輸出則是Eigen Value的列舉陣及Eigen Vector的列舉陣,第一個引數為要計算的CvMat資料結構對稱矩陣,第二個引數為CvMat資料結構的Eigen Value列舉陣,第三個引數是CvMat資料結構的Eigen Vector列舉陣,第四個引數為精確度比較運算的大小.&lt;br /&gt;cvEigenVV(輸入CvMat資料結構對稱矩陣,輸出CvMat資料結構的EigenValue列舉陣,輸出CvMat資料結構的EigenVector列舉陣,浮點型別精準度誤差比較數值)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-4936485882256424074?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/4936485882256424074/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=4936485882256424074' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/4936485882256424074'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/4936485882256424074'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/08/opencv-cveigenvv.html' title='OpenCV線性代數-cvEigenVV實作'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SKOpIKNUvEI/AAAAAAAABCA/PY7uNTOu6bU/s72-c/mat_number_66.JPG' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-8853776709383451978</id><published>2008-08-01T12:15:00.009+08:00</published><updated>2008-12-10T01:09:25.877+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-秩,線性系統求解(2)</title><content type='html'>在cvSolve()裡面,輸入的係數矩陣規定要方陣,那假如所求的線性系統不是方陣怎麼辦呢？那當然就是要用補0了方式填充成方陣,使用的方法請看以下程式碼.&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKWaRr4-XI/AAAAAAAAA2c/xbB4OxpyV3Y/s1600-h/mat_number_62.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKWaRr4-XI/AAAAAAAAA2c/xbB4OxpyV3Y/s400/mat_number_62.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229407495498824050" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;解線性方程式4&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *SolveSet=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSolve(Matrix1,Matrix2,SolveSet,CV_SVD);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(SolveSet,SolveSet-&amp;gt;rows,SolveSet-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKXj-qGKDI/AAAAAAAAA28/xDP3emWN6GY/s1600-h/pic_number_97.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKXj-qGKDI/AAAAAAAAA28/xDP3emWN6GY/s400/pic_number_97.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229408761701345330" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;線性系統判斷&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKWrLp2XDI/AAAAAAAAA2k/ut3Sew7kGnc/s1600-h/mat_number_63.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKWrLp2XDI/AAAAAAAAA2k/ut3Sew7kGnc/s400/mat_number_63.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229407785937427506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式是尾端補0,因為這個線性系統只存在兩個未知數,三個方程式,要給它弄成方陣,則只好假設有第三個未知數存在,但係數為0,而只要是需要補0的線性系統運算,全部都需要用CV_SVD來解,LU是無法解的.再來,下面是整欄補零的範例.&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKW1LzeZGI/AAAAAAAAA2s/8p_YnxP0E5M/s1600-h/mat_number_64.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKW1LzeZGI/AAAAAAAAA2s/8p_YnxP0E5M/s400/mat_number_64.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229407957776491618" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;解線性方程式5&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *SolveSet=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSolve(Matrix1,Matrix2,SolveSet,CV_SVD);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(SolveSet,SolveSet-&amp;gt;rows,SolveSet-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKXvffASUI/AAAAAAAAA3E/Wa3hSleptu4/s1600-h/pic_number_98.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKXvffASUI/AAAAAAAAA3E/Wa3hSleptu4/s400/pic_number_98.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229408959491754306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;線性系統判斷&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJKXAmM-I7I/AAAAAAAAA20/Mq8ouWM-lvM/s1600-h/mat_number_65.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJKXAmM-I7I/AAAAAAAAA20/Mq8ouWM-lvM/s400/mat_number_65.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229408153841312690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這個線性系統是四個未知數,三個方程式,很顯然的是無限解,用SVD的方法的話就會任意給一個可行解,而至於cvSolve()的另外一個參數CV_SVD_SYM,則是線性系統對對稱係數矩陣的加速算法,也是跟前面相關的程式碼同樣的用法,這邊不再累述.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvSolve()&lt;/strong&gt;&lt;br /&gt;為解線性方程式的函式,可以對唯一解,無解,無限解,而無限解的問題會給予一個答案,無解的問題則是用CV_SVD參數則可得到近似解,而無限解的問題則用cvSolve()參數可以得到可行解.第一個引數為CvMat係數矩陣,第二個引數為線性方程式的線性組合解,第三個引數為代數的解集合,第四個為解線性方程的參數輸入,分別為CV_LU,CV_SVD,CV_SVD_SYM,與求反矩陣的函式相同參數.&lt;br /&gt;cvSolve(CvMat係數矩陣結構,CvMat結構線性組合解,CvMat結構代數解集合,輸入計算參數或代號)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-8853776709383451978?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/8853776709383451978/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=8853776709383451978' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/8853776709383451978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/8853776709383451978'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/08/opencv-2.html' title='OpenCV線性代數-秩,線性系統求解(2)'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKWaRr4-XI/AAAAAAAAA2c/xbB4OxpyV3Y/s72-c/mat_number_62.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-6785464315653917601</id><published>2008-07-28T15:50:00.032+08:00</published><updated>2008-12-10T01:09:30.522+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-秩,線性系統求解(1)</title><content type='html'>線性系統求解,也就是求線性聯立方程式(System Of Linear Eguation)的解,而它的秩(Rank)OpenCV裡面是沒有函式可以計算的,可是它可以做為判斷線性系統求解的依據.秩的意義就是將矩陣簡化成列梯形矩陣,非0列的個數.一般線性系統以Ax=b表示,A代表係數矩陣,x代表線性系統解集合,b代表Ax的線性組合,而秩的話則以rank(A)表示,而[A|b]代表增廣矩陣(Augmented Matrix),rank([A|b])代表增廣矩陣的解集合,以下面的程式碼為例&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJEoGS6Ro3I/AAAAAAAAAzc/BQ_Z3DAsJoE/s1600-h/mat_number_48.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJEoGS6Ro3I/AAAAAAAAAzc/BQ_Z3DAsJoE/s400/mat_number_48.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229004730974446450" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;解線性方程式1&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *SolveSet=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSolve(Matrix1,Matrix2,SolveSet,CV_LU);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(SolveSet,SolveSet-&amp;gt;rows,SolveSet-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;gt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;gt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJI217zZ75I/AAAAAAAAA2E/wN6RT9juFEs/s1600-h/pic_number_94.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJI217zZ75I/AAAAAAAAA2E/wN6RT9juFEs/s400/pic_number_94.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229302417544834962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;係數矩陣(A),矩陣線性組合解(b),增廣矩陣([A|b])&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKcEwc6YrI/AAAAAAAAA3c/-32uRWRFdGc/s1600-h/mat_number_49.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJKcEwc6YrI/AAAAAAAAA3c/-32uRWRFdGc/s400/mat_number_49.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229413722870145714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;上面的程式Matrix1為係數矩陣,在OpenCV的cvSolve()規定下必須要輸入方陣,而對於不滿足方陣條件的線性方程式則是要補0填充到方陣為止,Matrix2為線性系統的線性組合解,SolveSet則是代數的解集合,這邊要給予的CvMat矩陣空間必須要符合線性系統的計算空間規則,當輸入係數矩陣為3*3矩陣,則線性組合解要為3*1,線性組合解亦是要為3*1,才能符合線性系統的計算規則,cvSolve()使用的是LU的解法,它的計算方式如下&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJEq-gPLpGI/AAAAAAAAAzs/1_CRmB1GTHI/s1600-h/mat_number_50.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJEq-gPLpGI/AAAAAAAAAzs/1_CRmB1GTHI/s400/mat_number_50.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229007895647724642" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJErLkizu2I/AAAAAAAAAz0/Dwq5SqvFNDA/s1600-h/mat_number_51.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJErLkizu2I/AAAAAAAAAz0/Dwq5SqvFNDA/s400/mat_number_51.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229008120142084962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;接著用帶入消去法求解&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJErhz63KlI/AAAAAAAAAz8/YokxpA5NfKU/s1600-h/mat_number_52.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJErhz63KlI/AAAAAAAAAz8/YokxpA5NfKU/s400/mat_number_52.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229008502226627154" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJErrqow2vI/AAAAAAAAA0E/vd38RRDcDeg/s1600-h/mat_number_53.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJErrqow2vI/AAAAAAAAA0E/vd38RRDcDeg/s400/mat_number_53.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229008671533488882" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;對於它的線性系統判斷為&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKazhws47I/AAAAAAAAA3M/2hPhgJxeNlc/s1600-h/mat_number_54.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKazhws47I/AAAAAAAAA3M/2hPhgJxeNlc/s400/mat_number_54.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229412327357211570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;再來是對於線性系統無限解的求法&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJFxsR9VwII/AAAAAAAAA1c/I7V9C5UL_Rc/s1600-h/mat_number_54-1.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJFxsR9VwII/AAAAAAAAA1c/I7V9C5UL_Rc/s400/mat_number_54-1.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229085647902720130" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;解線性方程式2&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={-&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *SolveSet=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSolve(Matrix1,Matrix2,SolveSet,CV_LU);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(SolveSet,SolveSet-&amp;gt;rows,SolveSet-&amp;gt;cols);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;gt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;gt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJI3HsP6V_I/AAAAAAAAA2M/s36DrLj0Vbs/s1600-h/pic_number_95.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJI3HsP6V_I/AAAAAAAAA2M/s36DrLj0Vbs/s400/pic_number_95.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229302722607077362" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;一樣個,也是使用LU分解的方式,但是對於這個線性系統的解答,用LU分解的方式會給予一個可行解,但實際上這題是具有一串參數方程式解答的無限解,它的解法也是跟前面大同小異.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SJFURftD4KI/AAAAAAAAA0c/Ar1z7ESs6B0/s1600-h/mat_number_55.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SJFURftD4KI/AAAAAAAAA0c/Ar1z7ESs6B0/s400/mat_number_55.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229053301898862754" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;用帶入消去法求解&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJFUlMaahkI/AAAAAAAAA0k/ALQSihFak40/s1600-h/mat_number_56.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJFUlMaahkI/AAAAAAAAA0k/ALQSihFak40/s400/mat_number_56.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229053640317765186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJFUwh9AQ2I/AAAAAAAAA0s/Ml0Lv1R0o0A/s1600-h/mat_number_57.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SJFUwh9AQ2I/AAAAAAAAA0s/Ml0Lv1R0o0A/s400/mat_number_57.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229053835078550370" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;線性系統判斷為&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKbE8gjzkI/AAAAAAAAA3U/ncDhQkagFtE/s1600-h/mat_number_58.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJKbE8gjzkI/AAAAAAAAA3U/ncDhQkagFtE/s400/mat_number_58.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229412626595040834" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;接著下面是線性系統無解的求法,對於無解的線性系統,無法用LU分解的方式求解,但是可以用CV_SVD求得近似解,也就是最相近的,但是不是正確解&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJFsDOLRJTI/AAAAAAAAA1E/pLLxXZjd5D0/s1600-h/mat_number_59.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SJFsDOLRJTI/AAAAAAAAA1E/pLLxXZjd5D0/s400/mat_number_59.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229079444954621234" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;解線性方程式3&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *SolveSet=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,CV_32FC1);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The CV_LU Solution:\n"&lt;/span&gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSolve(Matrix1,Matrix2,SolveSet,CV_LU);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(SolveSet,SolveSet-&amp;gt;rows,SolveSet-&amp;gt;cols);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The CV_SVD Solution:\n"&lt;/span&gt;); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSolve(Matrix1,Matrix2,SolveSet,CV_SVD);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(SolveSet,SolveSet-&amp;gt;rows,SolveSet-&amp;gt;cols);&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);        &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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}     &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJI3qYqtq_I/AAAAAAAAA2U/vSbB8-vOnHo/s1600-h/pic_number_96.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJI3qYqtq_I/AAAAAAAAA2U/vSbB8-vOnHo/s400/pic_number_96.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229303318646205426" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;用LU分解法來做,無解的話輸出結果會是全0,而SVD法則可以把數據帶進去,會得到近似的線性組合解.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJFvXkGJnQI/AAAAAAAAA1M/Jy3ZMYoNtOQ/s1600-h/mat_number_60.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJFvXkGJnQI/AAAAAAAAA1M/Jy3ZMYoNtOQ/s400/mat_number_60.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229083092971003138" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SIvyxXk8jlI/AAAAAAAAAvY/22AgzV_j0-I/s1600-h/mat_number_36.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SIvyxXk8jlI/AAAAAAAAAvY/22AgzV_j0-I/s400/mat_number_36.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227538722450083410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;接著為線性系統判斷&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJFvrDU_VlI/AAAAAAAAA1U/rPn6qzO7IPo/s1600-h/mat_number_61.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SJFvrDU_VlI/AAAAAAAAA1U/rPn6qzO7IPo/s400/mat_number_61.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5229083427772257874" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-6785464315653917601?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/6785464315653917601/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=6785464315653917601' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6785464315653917601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/6785464315653917601'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/07/opencv_9099.html' title='OpenCV線性代數-秩,線性系統求解(1)'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_HcQD5f5sLPc/SJEoGS6Ro3I/AAAAAAAAAzc/BQ_Z3DAsJoE/s72-c/mat_number_48.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-1423959950445608153</id><published>2008-07-28T06:56:00.009+08:00</published><updated>2008-12-10T01:09:32.330+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-行列式,Cramer's rule</title><content type='html'>再來就是簡單的介紹行列式的函式cvDet(),行列式的輸入CvMat資料結構必須要為方陣,對矩陣的內部做一些特殊運算,可以用來求反矩陣,判斷矩陣線性解,特徵值及特徵向量等應用,其他行列式的性質則不再這裡詳述.&lt;br /&gt;&lt;br /&gt;簡單行列式運算&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; Determinant;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array,Matrix1-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nThe Matrix is:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintMatrix(Matrix1,Matrix1-&amp;gt;rows,Matrix1-&amp;gt;cols);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"\nThe Determinant is:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Determinant=cvDet(Matrix1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.f\n"&lt;/span&gt;,Determinant);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; i=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;i&amp;lt;Rows;i++)&lt;br /&gt;&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;&lt;strong&gt;for&lt;/strong&gt;(&lt;strong&gt;int&lt;/strong&gt; j=&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;;j&amp;lt;Cols;j++)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"%.2f "&lt;/span&gt;,cvGet2D(Matrix,i,j).val[&lt;span style="color:#cc33cc;"&gt;0&lt;/span&gt;]);&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;printf(&lt;span style="color:#cc0000;"&gt;"\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0qMXs3YaI/AAAAAAAAAwQ/W4XXmvVOu3U/s1600-h/pic_number_92.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5227881134456005026" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0qMXs3YaI/AAAAAAAAAwQ/W4XXmvVOu3U/s400/pic_number_92.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_HcQD5f5sLPc/SI0-yessgWI/AAAAAAAAAwg/d3nN5EUkYkA/s1600-h/mat_number_39.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_HcQD5f5sLPc/SI0-yessgWI/AAAAAAAAAwg/d3nN5EUkYkA/s400/mat_number_39.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227903779401924962" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;這是一個4*4的矩陣,行列式的輸出為一個數據,當行列視為0則為不可逆矩陣(不具反矩陣),行列式也可以解線性系統的解,而用行列式解線性系統的方法叫做Cramer's rule,以下則由此方程式求x,y,z的解&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0-8JOEjmI/AAAAAAAAAwo/LmA7JAKFuzU/s1600-h/mat_number_40.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0-8JOEjmI/AAAAAAAAAwo/LmA7JAKFuzU/s400/mat_number_40.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227903945435024994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;行列式Cramer's rule&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array1[]={&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array2[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;};&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array3[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;5&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;8&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,-&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; x,y,z;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; Determinant;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; Determinant1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; Determinant2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;strong&gt;double&lt;/strong&gt; Determinant3;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix2=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix3=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix,Array,Matrix-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array1,Matrix1-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix2,Array2,Matrix2-&amp;gt;step);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix3,Array3,Matrix3-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Determinant=cvDet(Matrix);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Determinant1=cvDet(Matrix1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Determinant2=cvDet(Matrix2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Determinant3=cvDet(Matrix3);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x=Determinant1/Determinant;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y=Determinant2/Determinant;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;z=Determinant3/Determinant;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The equation solution is :\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"x = %.f\n"&lt;/span&gt;,x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"y = %.f\n"&lt;/span&gt;,y);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"z = %.f\n"&lt;/span&gt;,z);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;system(&lt;span style="color:#cc0000;"&gt;"pause"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;執行結果:&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0qY-t1M_I/AAAAAAAAAwY/qpXsCp9smmQ/s1600-h/pic_number_93.JPG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5227881351087469554" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0qY-t1M_I/AAAAAAAAAwY/qpXsCp9smmQ/s400/pic_number_93.JPG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在這裡Matrix為解集合的線性組合,而Matrix1為將線性組合的第一列與解集合做交換,Matrix2為第二列與解集合做交換,Matrix3為第三列與解集合做交換,在將Matrix,Matrix1,Matrix2,Matrix3解行列式,而x,y,z的解就分別是x=det(Matrix1)/det(Matrix),y=det(Matrix2)/det(Matrix),z=det(Matrix3)/det(Matrix).&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0_EftfflI/AAAAAAAAAww/O5-S5K-CGtA/s1600-h/mat_number_41.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0_EftfflI/AAAAAAAAAww/O5-S5K-CGtA/s400/mat_number_41.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227904088911347282" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0_KheCFPI/AAAAAAAAAw4/gOMl1PJ3s1g/s1600-h/mat_number_42.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0_KheCFPI/AAAAAAAAAw4/gOMl1PJ3s1g/s400/mat_number_42.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227904192462591218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SI0_RNV6rSI/AAAAAAAAAxA/qilOQKksTdk/s1600-h/mat_number_43.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SI0_RNV6rSI/AAAAAAAAAxA/qilOQKksTdk/s400/mat_number_43.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227904307318926626" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0_W7VJC-I/AAAAAAAAAxI/NDVWFeFHL-I/s1600-h/mat_number_44.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0_W7VJC-I/AAAAAAAAAxI/NDVWFeFHL-I/s400/mat_number_44.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227904405563050978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SI1AjLbiRFI/AAAAAAAAAxo/wax4fkz2Qk4/s1600-h/mat_number_45.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SI1AjLbiRFI/AAAAAAAAAxo/wax4fkz2Qk4/s400/mat_number_45.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227905715554894930" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/_HcQD5f5sLPc/SI1AqYwaRUI/AAAAAAAAAxw/ZevEJC1KJ50/s1600-h/mat_number_46.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_HcQD5f5sLPc/SI1AqYwaRUI/AAAAAAAAAxw/ZevEJC1KJ50/s400/mat_number_46.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227905839391196482" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/_HcQD5f5sLPc/SI1Av5Dbd5I/AAAAAAAAAx4/9rJHXHES5Jo/s1600-h/mat_number_47.JPG"&gt;&lt;img style="cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_HcQD5f5sLPc/SI1Av5Dbd5I/AAAAAAAAAx4/9rJHXHES5Jo/s400/mat_number_47.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5227905933960247186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cramer's rule在使用上執行效率並不會很好,一般都是以高斯消去法來解聯立的線性系統.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;cvDet()&lt;/strong&gt;&lt;br /&gt;計算CvMat資料結構的行列式值,回傳結果為double型別資料型態,但是在線性代數的定義上行列式的值為純量(Scale)&lt;br /&gt;double cvDet(CvMat資料結構)&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2791112373738607920-1423959950445608153?l=yester-place.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://yester-place.blogspot.com/feeds/1423959950445608153/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2791112373738607920&amp;postID=1423959950445608153' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1423959950445608153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2791112373738607920/posts/default/1423959950445608153'/><link rel='alternate' type='text/html' href='http://yester-place.blogspot.com/2008/07/opencv-cramers-rule.html' title='OpenCV線性代數-行列式,Cramer&apos;s rule'/><author><name>wa114040@gmail.com</name><uri>http://www.blogger.com/profile/09789688217343840149</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_HcQD5f5sLPc/SI0qMXs3YaI/AAAAAAAAAwQ/W4XXmvVOu3U/s72-c/pic_number_92.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2791112373738607920.post-3322342888637658968</id><published>2008-07-26T10:09:00.010+08:00</published><updated>2008-12-10T01:09:33.828+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV線性代數'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenCV'/><title type='text'>OpenCV線性代數-跡數,轉置,反矩陣</title><content type='html'>跡數(trace),也就是對角線數據的總和,轉置矩陣(Transpose Matrix),則是將矩陣數據列跟欄對調將橫的數據變成直的,反矩陣(Inverse Matrix)它的定義為與目標矩陣相乘可以得到單位矩陣,為一個可逆矩陣.&lt;br /&gt;&lt;br /&gt;跡數,轉置,反矩陣實作&lt;br /&gt;&lt;span style="color:#009900;"&gt;#include &amp;lt;cv.h&amp;gt;&lt;br /&gt;#include &amp;lt;highgui.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;void&lt;/strong&gt; PrintMatrix(CvMat *Matrix,&lt;strong&gt;int&lt;/strong&gt; Rows,&lt;strong&gt;int&lt;/strong&gt; Cols);&lt;br /&gt;&lt;br /&gt;CvScalar Trace;&lt;br /&gt;&lt;strong&gt;float&lt;/strong&gt; Array[]={&lt;span style="color:#cc33cc;"&gt;2&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;1&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;4&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;6&lt;/span&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;int&lt;/strong&gt; main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *Matrix1=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *TransposeMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CvMat *InverseMatrix=cvCreateMat(&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,&lt;span style="color:#cc33cc;"&gt;3&lt;/span&gt;,CV_32FC1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cvSetData(Matrix1,Array,Matrix1-&amp;gt;step);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf(&lt;span style="color:#cc0000;"&gt;"The Trace is:\n"&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nb
