**:
在以下兩個場景中使用 opencv 時,我們必須事先知道矩陣元素的資料型別:
但面對一大堆**,我們有時並不清楚當前的矩陣元素究竟是什麼型別,這篇文章就是以cv::mat
類為例來解決這個問題。
cv::mat 類的物件有乙個成員函式type()
用來返回矩陣元素的資料型別,返回值是int
型別,不同的返回值代表不同的型別。opencv reference manual 中對type()
的解釋如下所示:
mat::type實際的**如下所示:
c++: int mat::type() const
the method returns a matrix element type. this is an identifier compatible with the cvmat type system, like cv_16sc3 or 16-bit signed 3-channel array, and so on.
cv::mat haha = cv::mat::zeros(3,3,cv_64f);
int hahatype = haha.type();
std::cout
<<"hahatype = "
c1c2
c3c4
cv_8u08
1624
cv_8s19
1725
cv_16u210
1826
cv_16s311
1927
cv_32s412
2028
cv_32f513
2129
cv_64f614
2230
表頭的 c1, c2, c3, c4 指的是通道(channel)數,比如灰度影象只有 1 個通道,是 c1;jpeg格式 的 rgb 彩色影象就是 3 個通道,是 c3;png 格式的彩色影象除了 rgb 3個通道外,還有乙個透明度通道,所以是 c4。大家還會發現 7 怎麼沒有被定義型別,這個可以看 opencv 原始碼,有如下所示的一行,說明 7 是用來給使用者自定義的:
#define cv_usrtype1 7
如果僅僅是為了在數值計算前明確資料型別,那麼看到這裡就可以了;如果是要使用at
方法訪問資料元素,那麼還需要下面一步。因為以單通道為例,at
方法接受的是uchar
這樣的資料型別,而非cv_8u
。在已知通道數和每個通道資料型別的情況下,指定給at
方法的資料型別如下表所示:
c1c2
c3c4
c6uchar
uchar
cv::vec2b
cv::vec3b
cv::vec4b
short
short
cv::vec2s
cv::vec3s
cv::vec4s
intint
cv::vec2i
cv::vec3i
cv::vec4i
float
float
cv::vec2f
cv::vec3f
cv::vec4f
cv::vec6f
double
double
cv::vec2d
cv::vec3d
cv::vec4d
cv::vec6d
至此,我們就可以像《opencv for matlab users (2)》中演示的一樣採用如下方式訪問影象(矩陣)了
cv::vec3b vec3b = img.at(0,0);
uchar vec3b0 = img.at(0,0)[0];
uchar vec3b1 = img.at(0,0)[1];
uchar vec3b2 = img.at(0,0)[2];
std::cout
<<"vec3b = "
std::cout
<<"vec3b0 = "
<<(int)vec3b0
<<"vec3b1 = "
<<(int)vec3b1
<<"vec3b2 = "
<<(int)vec3b2<數值具體型別
取值範圍
cv_8u
8 位無符號整數
(0…..255)
cv_8s
8 位符號整數
(-128…..127)
cv_16u
16 位無符號整數
(0……65535)
cv_16s
16 位符號整數
(-32768…..32767)
cv_32s
32 位符號整數
(-2147483648……2147483647)
cv_32f
32 位浮點數
(-flt_max ………flt_max,inf,nan)
cv_64f
64 位浮點數
(-dbl_max ……….dbl_max,inf,nan)
vec 類的定義
template
class vec : public matx<_tp, n, 1> ;
typedef vec2> vec2b;
typedef vec3> vec3b;
typedef vec4> vec4b;
typedef vec vec2s;
typedef vec vec3s;
typedef vec vec4s;
typedef vec vec2i;
typedef vec vec3i;
typedef vec vec4i;
typedef vec vec2f;
typedef vec vec3f;
typedef vec vec4f;
typedef vec vec6f;
typedef vec vec2d;
typedef vec vec3d;
typedef vec vec4d;
typedef vec vec6d;
確定opencv矩陣元素型別
在以下兩個場景中使用 opencv 時,我們必須事先知道矩陣元素的資料型別 但面對一大堆 我們有時並不清楚當前的矩陣元素究竟是什麼型別,這篇文章就是以cv mat類為例來解決這個問題。cv mat 類的物件有乙個成員函式type 用來返回矩陣元素的資料型別,返回值是int型別,不同的返回值代表不同的...
OpenCv矩陣元素的訪問技巧
本文 cvmat矩陣資料結構是opencv的基礎資料型別,對於影象處理這種密級型運算,經常需要訪問,修改,設定其元素的值。opencv提供了很多優良的函式,能夠很簡單的實現上述功能。在 學習opencv 一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主...
OpenCv矩陣元素的訪問技巧
原文 cvmat矩陣資料結構是opencv的基礎資料型別,對於影象處理這種密級型運算,經常需要訪問,修改,設定其元素的值。opencv提供了很多優良的函式,能夠很簡單的實現上述功能。在 學習opencv 一書中,作者分別就簡單的方法,麻煩的方法,和恰當的方法對相關函式進行了講解,講得比較清晰。本文主...