显示Opencv矩阵值

时间:2012-09-20 12:32:40

标签: opencv matrix

这就是问题:我用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 ......)?

感谢!!!

3 个答案:

答案 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);