surf演算法c語言編寫要做嵌入式開發不要c和基

時間 2021-12-19 17:27:50

1樓:資料**

surf借鑑了sift中簡化近似的思想,將doh中的高斯二階微分模板進行了近似簡化,使得模板對影象的濾波只需要進行幾個簡單的加減法運算,並且,這種運算與濾波模板的尺寸有關。實驗證明surf演算法較sift演算法在運算速度上要快3倍左右。

1 積分影象

surf演算法中要用到積分影象的概念。借助積分影象,影象與高斯二階微分模板的濾波轉化為對積分影象的加減運算。積分影象(integral image)的概念是由viola和jones提出來的,而將類似積分影象用於盒子濾波是由simard等人提出。

積分影象中任意一點(i,j)的值為ii(i,j)為原影象左上角到任意點(i,j)相應的對角線區域灰度值的總和即:

公式中,i(x`,y`)表示原影象中點(i`,j`)的灰度值,ii(x,y)可以由下面兩公式迭代計算得到:

公式中,s(x,y)表示一列的積分,且s(i,-1)=0,ii(-1,j)=0.求積分影象,只需對原影象的所有畫素素進行一遍掃瞄。下面的**為c++語言的實現

poutimage[0][0] = pinimage[0][0];

for(int x = 1, x < nwidth; i++)

for(int y=1; y< nheight ;y++)

}如圖表示,在求取視窗w內的像元灰度和時,不管視窗w的大小如何,均可利用積分影象的4個對應點(i1,j1)(i2,j2)(i3,j3)(i4,j4)的值計算的到。也就是說,求取視窗w內的像元灰度和與視窗的尺寸是無關的。視窗w內的像元的灰度和為

sum(w)= ii(i4,j4) -ii(i2,j2) - ii(i3,j3) + ii(i1,j1)

下面看以截圖,相信都可以看懂

關於矩形區域內畫素點的求和應該是一種簡單重複性運算,採用這種思路總體上提高了效率。為什麼這麼說呢?假設一幅**共有n個畫素點,則計算n個位置的積分圖總共的加法運算有n-1次(注意:

可不是次哦,要充分利用遞推思想),將這些結果儲存在乙個跟原圖對應的矩陣m中。當需要計算影象中某個矩形區域內的所有畫素之和是直接像查表一樣,調出a,b,c,d四點的積分圖值,簡單的加減法(注意只需要三次哦)即可得到結果。反之,如果採用*****的方式直接在原影象中的某個矩形區域內求和,你想想,總共可能的矩形組合有多少?

 !!且對於一幅影象n那是相當大啊,所以2^n

那可是天文數字,而且這裡面絕大部分的矩形有重疊,重疊意味著什麼?在算求和的時候有重複性的工作,其實我們是可以有效的利用已經計算過的資訊的。這就是積分圖法的內在思想:

它實際上是先計算n個互不重疊(專業點說是不相交)的矩形區域內的畫素點求和,充分利用這些值(已有值)計算未知值,有點類似遞推的味道...這就完全避免了重複求和運算。

這樣就可以進行2種運算:

(1)任意矩形區域內畫素積分。由影象的積分圖可方便快速地計算影象中任意矩形內所有畫素灰度積分。如下圖2.3所示,點1的積分影象ii1的值為(其中sum為求和) :

ii1=sum(a)

同理,點2、點3、點4的積分影象分別為:

ii2=sum(a)+sum(b);      ii3=sum(a)+sum(c);    ii4=sum(a)+sum(b)+sum(c)+sum(d);

矩形區域d內的所有畫素灰度積分可由矩形端點的積分影象值得到:

sum(d)=ii1+ii4-(ii2+ii3)            (1)

(2) 特徵值計算

矩形特徵的特徵值是兩個不同的矩形區域畫素和之差,由(1)式可以計算任意矩形特徵的特徵值,下面以圖2.1中特徵原型a為例說明特徵值的計算。

如圖2.4 所示,該特徵原型的特徵值定義為:

sum(a)-sum(b)

根據(1)式則有:sum(a)=ii4+ii1-(ii2+ii3);    sum(b)=ii6+ii3-(ii4+ii5);

所以此類特徵原型的特徵值為:

(ii4-ii3)-(ii2-ii1)+(ii4-ii3)-(ii6-ii5)

另示:運用積分圖可以快速計算給定的矩形之所有象素值之和sum(r)。假設r=(x,y,w,h),那麼此矩形內部所有元素之和等價於下面積分圖中下面這個式子:

sum(r) = ii(x+w,y+h)+ii(x-1,y-1)-ii(x+w,y-1)-ii(x-1,y+h)

由此可見,矩形特徵特徵值計算只與此特徵端點的積分圖有關,而與影象座標值無關。對於同一型別的矩形特徵,不管特徵的尺度和位置如何,特徵值的計算所耗費的時間都是常量,而且都只是簡單的加減運算。其它型別的特徵值計算方法類似。

2樓:匿名使用者

同求大神們的回答 !剛學10天哈哈 了解一下

學習opencv是c語言版還是c++版? 20

c++寫的opencv程式怎麼實現在android平台?

3樓:匿名使用者

tutorial裡有啊~~在qt裡載入opencv庫並且搭好安卓的開發平台就可以用了

4樓:匿名使用者

使用ndk可以在android裡使用c++。

去下乙個android-ndk

然後去裝乙個

5樓:

您好,c++程式不能在

android平台上執行,您需要使用編譯器對其進行編譯。打包成apk格式的

c語言編寫軟體,C語言編寫乙個軟體?

依然特雷西 1 首先開啟pelles c,建立乙個新的專案檔案。2 然後輸入簡單的框架。3 接著用switch函式完成加減乘除操作。4 檢查輸入之後就可以計算結果了。這裡需要新增的 如下,之後便可以執行了。5 這裡我們輸入乙個例子。 難!你這賭開大了。並不是用c不能寫出介面來,其實,windows下...

編寫c語言程式,實現分數的約分,編寫c語言程式,實現分數的約分

perject 見習魔法師 給的就是啊,不過演算法屬於最基本的。支援 芙瑤凌 經理 四級 提到的輾轉相除法,稍加改動如下 turboc2編譯通過的噢,關於輾轉相除法見參考資料 昨晚提交的程式有個問題啊,不好意思 汗顏 現在就改過來 include include main printf n i n ...

C語言如何編寫驅動,C語言編寫晶元驅動的方法

這問題問的,你想直接拿c語言寫驅動這顯然是完成不了的,你使用的是什麼環境?linux windows這些區別好大的,驅動光c語言也是完成不了的,必須還得有一定的組合語言知識。準備好相應晶元的技術手冊。根據技術手冊,配置對應時鐘暫存器。如需要中斷,配置中斷相關暫存器。完成對應的isr中斷服務程式。實現...