這裏是問題:我用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 ...)?
謝謝!
這裏是問題:我用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 ...)?
謝謝!
你在這裏犯了兩個錯誤。
讀取圖像時,您將指定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_COLOR
或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;
}
你可以嘗試找出OpenCV的做代表它有一個更好的主意,用什麼類型:
cout << image.depth() << ", " << image.channels() << endl;
還檢查了該discussion約元素訪問。
嗯,我知道深度和通道,但是如果我知道矩陣是用於通常圖像8位和無符號整數以便矩陣是CV_8UC1,那麼應該將哪個參數傳遞到Mat :: at?完全在這裏:image.at ??????>(0,1); –
CV_8UC1意味着一個8位無符號單通道,所以這將是'unsigned char',代表0到255之間的值。無符號整數表示0到65536之間的值,它們是CV_16UC1。 – count0
首先,沒有通用的方法來獲得像素值這種方式。這意味着如果您打算使用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);
有一個簡單的方法來做到這一點。
墊具有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。
您正在使用(0,1)而不是(0,0)? – count0