这是问题所在:我使用 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 ...)的像素值?
谢谢!!!
你在这里犯了两个错误。
读取图像时,您指定 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_COLOR
or 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;
}
有一个简单的方法可以做到这一点。
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];
}
}
阅读这篇博文的更多内容。
您可以尝试找出 opencv 用什么来表示它,以便更好地了解要使用的类型:
cout << image.depth() << ", " << image.channels() << endl;
另请查看有关元素访问的讨论。
首先,没有通用的方法可以通过这种方式获取像素值。这意味着如果您要使用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);