把OpenCV Mat當乙個普通陣列來用

2021-08-04 19:13:34 字數 1531 閱讀 5533

最近在移植matlab影象處理演算法,要將這個演算法移植到opencv當中去,因為matlab對於陣列的操作非常簡單,而c++裡面的陣列就沒那麼好用,於是就想到了要用opencv的mat。

在網上,關於opencv,關於mat的文章,**都非常多,但是都是相對簡單的應用,當做乙個影象資料來用,用到的格式也基本都是cv_8u和cv_8uc3型別。

cv_8uc就是建立單通道的影象,在讀取影象的時候就用image.at(i,j)來進行畫素值讀取。cv_8uc3就是建立三通道影象,讀取影象的時候就用image.at(i,j)[k]來進行讀取。除了這兩種形式,基本上就有了。但確實,mat型別還有很多態別和應用。

首先來講一下如何建立乙個三維的矩陣,如果此刻我要建立乙個6×6×6的矩陣,那就應該mat matarray(6,6,cv_8uc(6),稍微解釋一下這個型別,8是8 bits的意思,就是char型,然後這裡的u是unsigned的意思,看這個型別的樣子跟cv_8uc3很像,那為什麼這裡要把6用括號括起來呢。我們轉到cv_8uc3的定義去看一下。

#define cv_8uc1 cv_maketype(cv_8u,1)

#define cv_8uc2 cv_maketype(cv_8u,2)

#define cv_8uc3 cv_maketype(cv_8u,3)

#define cv_8uc4 cv_maketype(cv_8u,4)

#define cv_8uc(n) cv_maketype(cv_8u,(n))

我們在types_c.h標頭檔案中看到了這個定義,從這個定義裡面我們可以看到opencv將常用的一些型別進行了定義,其餘的進行另一類定義。我們讀取cv_8uc3的時候是image.at(i,j)[k]這樣來進行讀取的,那cv_8uc(6)這個是怎麼讀取的呢,那我們轉到的定義看一下。

typedef vecvec2b;

typedef vecvec3b;

typedef vecvec4b;

在core.hpp標頭檔案中,有以上的定義,同樣,我們平常用的vec的乙個縮寫,那我們要訪問cv_8uc(6)的話,就直接用vec這樣的形式去訪問就行了,也就是image.at>(i,j)[k]

上面講到的都是uchar型別的,只能是8 bits的無符號整形,那我要用int型,float型或者有符號型的呢,那這裡就需要用到cv_32fc,cv_64sc之類的型別。相關的定義在opencv的types_c.h和core.hpp中都有。

mat matarray30x30; 

matarray30x30.create(30,30,cv_32sc(81));

上面是建立乙個30×30的81維向量。

乙個普通的週末

每個星期天都是讓人開心的日子,睡到自然醒,穿著拖鞋不緊不慢的溜達去吃個早餐,手上就差個鳥籠了.回來後看 顫慄航班 著實被震撼了一把,記得當年911的時候還覺得有點幸災樂禍,嘿嘿,你美國也有今天。直到今天,通過我那可憐小驢汗流浹背辛苦拉了乙個通宵的盜版拷貝,終於,我在這件事情上昇華了,嘿嘿。我發自內心...

當乙個軟體開啟乙個文字時

當乙個軟體開啟乙個文字時,它要做的第一件事是決定這個文字究竟是使用哪種字符集的哪種編碼儲存的。軟體一般採用三種方式來決定文字的字符集和編碼 檢測檔案頭標識,提示使用者選擇,根據一定的規則猜測 最標準的途徑是檢測文字最開頭的幾個位元組,開頭位元組 charset encoding,如下表 ef bb ...

當Google Adsense優化成為乙個職業

搜尋引擎優化服務現在已經普遍了,很多大型的公司也開始重視優化並且尋找相關的服務,國內也有相應的專業公司成立起來,這個行業或者說產業已經逐漸形成。google adsense在中國的普及又催生了另外乙個職業,google adsense優化,正是由於google adsense的複雜計算方式,使得go...