问题
here's the problem: I load an grayscale Image with OpenCV v.2.4.2. Now I want to know for example value of pixel at position (0,0). I've tried:
Mat image=imread("00001.jpg",1);
cvtColor(image,image,CV_RGB2GRAY);
int a=image.at<unsigned>(0,1);
printf("%d ",a);
This actually doesn't work. How to get the pixel value with any data type (CV_8U, CV_32S ...)?
Thanks!!!
回答1:
You are making two mistakes here.
While reading the image, you are specifying 1 as input arguments. As explained for imread, the function can read image in three different formats.
CV_LOAD_IMAGE_UNCHANGED (<0) loads the image as is (including the alpha channel if present) CV_LOAD_IMAGE_GRAYSCALE ( 0) loads the image as an intensity one
CV_LOAD_IMAGE_COLOR (>0) loads the image in the RGB format
for your case you will have to use CV_LOAD_IMAGE_GRAYSCALE
as the second argument
In the next step where you are using: image.at<unsigned>(0,1);
which does not correspond to anything. you use <unsigned>
but the compiler says "UNSIGNED? UNSIGNED what???"
I believe a better way to do this is to use correct labels like CV_LOAD_IMAGE_COLOR
or CV_LOAD_IMAGE_GRAYSCALE
. In the example below, I am reading the image into one channel (CV_LOAD_IMAGE_GRAYSCALE
), which automatically converts it to 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;
}
回答2:
There is an easy way to do this.
Mat has Mat.data gives a pointer which refers to the original data matrix.
To get pixel values of nth row and mth column,
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];
}
}
So, this is about a colored image. for grayscale images,
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];
}
}
Read more on this blogpost.
回答3:
You could try to find out what opencv did represent it with to have a better idea what type to use:
cout << image.depth() << ", " << image.channels() << endl;
Also check out this discussion about element access.
回答4:
First of all, there is no generic way to get the pixel value this way. Meaning you always have to specify the correct type of of your values if you are going to use at
. In this case, you should do a=image.at<uchar>(0,1);
since you convert your image to 8-bit unsigned grayscale (1-channel).
You should also probably use CV_BGR2GRAY instead of RGB2GRAY since OpenCV uses BGR as as the channel order.
You could also read your image as grayscale from the start and use uchar
again:
Mat image = imread("00001.jpg",0); // note the 0 flag
int a=image.at<uchar>(0,1);
printf("%d ",a);
来源:https://stackoverflow.com/questions/12512632/opencv-matrix-values-display