这就是问题:我用OpenCV v.2.4.2加载灰度图像。 现在我想知道例如位置(0,0)处的像素值。 我试过了:
Mat image=imread("00001.jpg",1);
cvtColor(image,image,CV_RGB2GRAY);
int a=image.at<unsigned>(0,1);
printf("%d ",a);
这实际上不起作用。如何获取任何数据类型的像素值(CV_8U,CV_32S ......)?
感谢!!!
答案 0 :(得分:1)
有一种简单的方法可以做到这一点。
Mat Mat.data 会给出一个指向原始数据矩阵的指针。
要获取第n行和第m列的像素值,
Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR);
unsigned char *input = (unsigned char*)(img.data);
int i,j,r,g,b;
for(int i = 0;i < img.cols;i++){
for(int j = 0;j < img.rows;j++){
b = input[img.cols * j + i ] ;
g = input[img.cols * j + i + 1];
r = input[img.cols * j + i + 2];
}
}
所以,这是关于彩色图像。对于灰度图像,
Mat img = imread("filename.jpg",CV_LOAD_IMAGE_COLOR);
Mat g;
cvtColor(img, g, CV_BGR2GRAY);
unsigned char *input = (unsigned char*)(g.data);
int i,j,r,g,b;
for(int i = 0;i < img.cols;i++){
for(int j = 0;j < img.rows;j++){
g = input[img.cols * j + i];
}
}
详细了解blogpost。
答案 1 :(得分:0)
您可以尝试找出opencv代表它的内容,以便更好地了解要使用的类型:
cout << image.depth() << ", " << image.channels() << endl;
另请查看有关元素访问的discussion。
答案 2 :(得分:0)
首先,没有以这种方式获取像素值的通用方法。这意味着如果要使用at
,则必须始终指定正确的值类型。在这种情况下,您应该a=image.at<uchar>(0,1);
,因为您将图像转换为8位无符号灰度(1通道)。
你也应该使用CV_BGR2GRAY而不是RGB2GRAY,因为OpenCV使用BGR作为频道顺序。
您还可以从头开始将图像读取为灰度,然后再次使用uchar
:
Mat image = imread("00001.jpg",0); // note the 0 flag
int a=image.at<uchar>(0,1);
printf("%d ",a);