Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Opencv matrix values display

Tags:

opencv

matrix

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!!!

like image 775
Robert Kirchhoff Avatar asked Sep 20 '12 12:09

Robert Kirchhoff


2 Answers

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;
}
like image 176
masad Avatar answered Oct 20 '22 18:10

masad


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.

like image 44
Froyo Avatar answered Oct 20 '22 19:10

Froyo