整理一下在 OpenCV 2.4.4 的版本中如何對矩陣的元素賦值

以下程式碼範例皆已使用命名空間,也就是 using namespace cv;

 

 

(一)對整個矩陣賦值

可直接使用 Scalar() 給值

如下範例

Mat mat = Mat(3, 4, CV_32FC2) // 建立一個二維矩陣,大小為 3*4,型態為雙通道 float 浮點數

mat = Scalar(2.5, 3.5) // 呼叫 Scalar(),參數數量對應矩陣有幾的通道

以上結果使得 mat 中每個元素的值都是 (2.5, 3.5)

 

 

(二)對矩陣中的元素賦值

有時候因為某種原因而需要矩陣中的元素賦予不同的值

這時就不能使用 Scalar()

因為 Scalar() 的回傳值型態是 Mat

先看單通道

如以下範例

Mat mat = Mat(12, 1, CV_32FC1) // 建立一個一維矩陣,大小為 12,型態為單通道 float 浮點數

for(i=0; i<3; i++)

  for(j=0; j<4; j++)

    mat.at<float>(3*j+i) = (float)(i+j+2.0);

使用 Mat::at 來存取矩陣中某個元素

後 <> 中放的是變數型態,如 float 浮點數就放 float

但如果是雙通道呢?

表示矩陣中的每個元素都會有兩個值

直覺上會聯想到用 [0] 和 [1] 來存取元素中每個通道的值

所以以上範例變成

Mat mat = Mat(12, 1, CV_32FC2) // 建立一個一維矩陣,大小為 12,型態為雙通道 float 浮點數

for(i=0; i<3; i++)

  for(j=0; j<4; j++){

    mat.at<float>(3*j+i)[0] = (float)(i+j+2.0);

    mat.at<float>(3*j+i)[1] = (float)(i+j+3.0);

  }

這樣編譯不會過哦!

編譯器會跟你說:「float[int]」 做為陣列下標類型無效

因此 <> 中不能放 float,那該怎麼辦?

網路上有一篇整理頗詳細的文章可參考

雙通道以上的矩陣,有另外的寫法

以此範例 <> 中改成 Vec2f 即可

同理,若矩陣型態是三通道 double 浮點數 (CV_64FC3)

Vec2f 即替換成 Vec3d

文章標籤
全站熱搜
創作者介紹
創作者 fantasymew 的頭像
fantasymew

小孫的狂想世界

fantasymew 發表在 痞客邦 留言(0) 人氣(20,457)