我试图弄清楚 Vec3b 如何为 Opencv 工作(但我认为这更多是关于基本 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 的代码都无法使用?