我在下面的代码中有一个错误:-
int main() {
cv::Mat image = imread("file.jpg", CV_LOAD_IMAGE_GRAYSCALE);
uint8_t* pixelPtr = (uint8_t*)image.data;
int cn = image.channels();
for(int i = 0; i < image.rows; i++)
{
for(int j = 0; j < image.cols; j += cn)
{
typedef Scalar_<uint8_t> bgrPixel;
bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0]; // B
bgrPixel.val[1] = pixelPtr[i*image.cols*cn + j*cn + 1]; // G
bgrPixel.val[2] = pixelPtr[i*image.cols*cn + j*cn + 2]; // R
// do somethin
}
}
}
VS10 在 val[0] 下划线,并表示非静态成员引用必须相对于特定对象。但它是 - 它是相对于 bgrPixel 的,不是吗?
更长的解释:
以下行:
typedef Scalar_<uint8_t> bgrPixel;
声明一个别名 - brgPixel
- 可以用来代替Scalar_<uint8_t>
- 它实际上只是节省了键入,并使代码更干净,更易于阅读。此外 - 在其他情况下 - 它允许您通过修改typedef
来更改该类型,而不是对变量类型 iteself 进行查找/替换。
它不做的是声明该类型的任何变量。
因此,您可以删除typedef
并仅声明一个变量:
Scalar_<uint8_t> bgrPixel;
bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0];
或者,您可以使用typedef
作为变量类型:
typedef Scalar_<uint8_t> bgrPixel;
bgrPixel pPixel;
pPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0];