7

这是问题所在:我使用 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 ...)的像素值?

谢谢!!!

4

4 回答 4

4

你在这里犯了两个错误。

读取图像时,您指定 1 作为输入参数。正如imread所解释的,该函数可以读取三种不同格式的图像。

CV_LOAD_IMAGE_UNCHANGED (<0) 按原样加载图像(包括 alpha 通道,如果存在) CV_LOAD_IMAGE_GRAYSCALE (0) 以强度 1 加载图像
CV_LOAD_IMAGE_COLOR (>0) 以 RGB 格式加载图像

对于您的情况,您将不得不CV_LOAD_IMAGE_GRAYSCALE用作第二个参数

在您使用的下一步中:image.at<unsigned>(0,1);它不对应任何东西。您使用<unsigned>但编译器说“未签名?未签名什么???”

我相信更好的方法是使用正确的标签,如CV_LOAD_IMAGE_COLORor CV_LOAD_IMAGE_GRAYSCALE。在下面的示例中,我将图像读入一个通道 ( CV_LOAD_IMAGE_GRAYSCALE),它会自动将其转换为灰度。

#include <cv.h>
#include <highgui.h>

#include <iostream>

using namespace std;
using namespace cv;

int main()
{
    Mat gImg = imread("img.png", CV_LOAD_IMAGE_GRAYSCALE);

    uchar val;
    val = gImg.at<uchar>(0,0);

    cout << (int)val << endl;

    imshow("showImg",gImg);
    cvWaitKey(0);

    return 1;
}
于 2012-09-20T14:02:05.770 回答
1

有一个简单的方法可以做到这一点。

MatMat.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];
     }
 }

阅读这篇博文的更多内容。

于 2012-09-20T18:32:43.060 回答
0

您可以尝试找出 opencv 用什么来表示它,以便更好地了解要使用的类型:

cout << image.depth() << ", " << image.channels() << endl;

另请查看有关元素访问的讨论。

于 2012-09-20T12:36:56.553 回答
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);
于 2012-09-20T15:49:40.063 回答