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!!!
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;
}
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With