整理一下在 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
