问题在于:我使用OpenCV v.2.4.2加载了一张灰度图像。现在我想知道例如位置(0,0)处像素的值。我已经尝试过:
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)处像素的值。我已经尝试过:
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等)获取像素值?
谢谢!!!
#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;
}
有一种简单的方法可以做到这一点。
Mat 有 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];
}
}
了解更多关于此博客文章的内容。
你可以尝试找出OpenCV使用的表示方式,以便更好地确定要使用的数据类型:
cout << image.depth() << ", " << image.channels() << endl;
同时也请查看关于元素访问的讨论。
unsigned char
,表示值从 0..255。无符号整数将表示值从 0..65536,这将是 CV_16UC1。 - count0at
,你必须始终指定正确类型的值。在这种情况下,你应该这样做:a = image.at<uchar>(0,1);
,因为你将图像转换为8位无符号灰度(1通道)。uchar
:Mat image = imread("00001.jpg",0); // note the 0 flag
int a=image.at<uchar>(0,1);
printf("%d ",a);