1. 程式人生 > >OpenCV操作基本矩陣運算

OpenCV操作基本矩陣運算

最近兩週做的專案是要將matlab裡面的演算法轉變為C語言,matlab處理矩陣運算實在太牛B了,幾個簡單的字元就代表了很多的操作,為了專案的需要,又不能影響軟體執行速度,因此我在工程中使用了OpenCV的庫進行矩陣操作。好在有這個使用比較方便的開源庫啊!

在matlab中,可以隨意給一個變數(通常都是突然出現的)傳遞任意維數的矩陣,這下可苦了我們這些做“翻譯”工作的程式設計師了。閒話少說,還是介紹一下我使用矩陣的理解吧。

OpenCV中,可以將一個矩陣和一個數組(或是指標)關聯起來,這樣對矩陣進行運算,關聯的陣列的元素值就會改變。有時候可以比較方便的用指標進行後續的操作。

舉個例子吧:

CvMat *temp;

float a[9];

temp = cvCreatMat(3,3,CV_32FC1);(這個不能少)

cvInitMatHeader(temp,3,3,CV_32FC1,a,CV_ATUO_STEP);(這裡矩陣形式可以有很多)

(上次這個地方描述有錯誤,這裡內容關聯的時候,temp最好使用CvMat型別的引用即CvMat temp,cvInitMatHeader(&temp,3,3,CV_32FC1,a,CV_ATUO_STEP);,向上面說的那樣,也可以得到正確的結果,不過有記憶體洩漏,因為cvInitMatHeader的返回值是一個CvMat*,相當於分配了兩次空間,最後cvReleaseMat的時候就容易記憶體洩漏,這是在工程實際執行中測試發現的。不過不知道cvReleaseMat兩次能不能解決記憶體洩漏,太麻煩了就沒有實驗。

)

這樣陣列a與矩陣temp就關聯起來了,如果該矩陣進行一些操作後,如果矩陣裡面元素的值改變了,那麼a陣列對應的元素值也會改變。

操作完了之後,如果cvReleaseMat(temp);矩陣空間釋放了,但是a陣列的值還是存在的,不受影響。

還有一個比較好用的函式,cvReduce,可以對應matlab裡面的[log, index] = sum(ans);(min(ans))之類的操作,不過cvReduce的功能要少一些,只能求出每行(列)最大(最小或平均等)值,無法給出index項,如果需要index還需要另外自己進行判斷。