我想弄清楚Vec3b如何爲Opencv工作(但我認爲它更多的是關於基本C++的問題)。
源代碼如下(簡化):瞭解如何在C++中真實情況下將類變量存儲在內存中
template<typename _Tp, int m, int n> class CV_EXPORTS Matx
{
public:
// constructors, methods and operators
...
_Tp val[m*n]; //< matrix elements
};
// inherits from Matx
template<typename _Tp, int cn> class CV_EXPORTS Vec : public Matx<_Tp, cn, 1>
{
public:
// constructors, methods and operators
...
};
typedef Vec<uchar, 3> Vec3b;
例如我可以用它來從圖像讀取BGR的三聯體(像素):
int main(int argc, char** argv)
{
Vec3b* data= (Vec3b*)inputImage.data;
// access the 10th pixel
data[10] = Vec3b(0,0,255);
}
告訴我,如果我已經正確理解它。
inputImage.data是一個字節數組,包含BGR值和每行末尾的偏移量;因爲val是Matx的唯一數據成員,所以我們可以確定Vec3b是一組三個字節,所以當我考慮第10個指針時,我可以從第31個字節開始訪問或修改三個字節。
只有兩個問題:
1)爲什麼我們確信數據存儲在內存中的方式?僅僅因爲val是唯一的變量?
2)如果1.是真的,你不認爲這是一種危險的技術,因爲只添加第二個變量會使幾乎所有使用Vec2b的代碼不可用?