2012-09-20 95 views
7

這裏是問題:我用OpenCV v.2.4.2加載灰度圖像。 現在我想知道位置(0,0)像素的值。 我試過了:Opencv矩陣值顯示

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 ...)?

謝謝!

+0

您正在使用(0,1)而不是(0,0)? – count0

回答

4

你在這裏犯了兩個錯誤。

讀取圖像時,您將指定1作爲輸入參數。如imread所解釋的,該功能可以以三種不同格式讀取圖像。

CV_LOAD_IMAGE_UNCHANGED(< 0)裝入爲是圖像(包括Alpha通道如果存在的話) CV_LOAD_IMAGE_GRAYSCALE(0)加載圖像作爲強度一個
CV_LOAD_IMAGE_COLOR(> 0)加載在RGB格式的圖像

你的情況下,你將不得不使用CV_LOAD_IMAGE_GRAYSCALE作爲第二個參數

在接下來的步驟中使用的是:image.at<unsigned>(0,1);這不科爾迴應任何事情。你使用<unsigned>但編譯器說「UNSIGNED?UNSIGNED是什麼?」

我相信一個更好的方法是使用正確的標籤,如CV_LOAD_IMAGE_COLORCV_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; 
} 
+0

對,沒問題,這是有效的,但你有沒有試過這個實際產出?在我的情況下,我得到像素(0,0)的-89。當圖像是8位無符號時,這怎麼可能?接下來我想問你爲什麼使用uchar? –

+0

ofcourse我試過了。我不知道你爲什麼沒有正確地得到輸出。我已經使用了UCHAR,原因與上面註釋中的@ count0所解釋的相同,也就是說它可以表示0到255之間的值。 – masad

+1

您不能以這種方式使用imread。第二個參數是一個標誌,它可以是0,> 0或<0,具體取決於您想要讀取圖像灰度,3通道顏色還是原樣。您無法準確指定類型。它只是在特定情況下運行,因爲CV_8U == 0 – Sassa

0

你可以嘗試找出OpenCV的做代表它有一個更好的主意,用什麼類型:

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

還檢查了該discussion約元素訪問。

+0

嗯,我知道深度和通道,但是如果我知道矩陣是用於通常圖像8位和無符號整數以便矩陣是CV_8UC1,那麼應該將哪個參數傳遞到Mat :: at?完全在這裏:image.at (0,1); –

+0

CV_8UC1意味着一個8位無符號單通道,所以這將是'unsigned char',代表0到255之間的值。無符號整數表示0到65536之間的值,它們是CV_16UC1。 – count0

0

首先,沒有通用的方法來獲得像素值這種方式。這意味着如果您打算使用at,則必須指定正確的值類型。在這種情況下,您應該執行a=image.at<uchar>(0,1);,因爲您將圖像轉換爲8位無符號灰度(單通道)。

因爲OpenCV使用BGR作爲通道順序,所以您也應該使用CV_BGR2GRAY而不是RGB2GRAY。

你也可以讀你的形象從一開始灰度和再次使用uchar

Mat image = imread("00001.jpg",0); // note the 0 flag 
int a=image.at<uchar>(0,1); 
printf("%d ",a); 
1

有一個簡單的方法來做到這一點。

具有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]; 
    } 
} 

瞭解更多關於此blogpost