Opencv矩阵值显示

Opencv矩阵值显示,opencv,matrix,Opencv,Matrix,问题是:我用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); Mat image=imread(“00001.jpg”,1); CVT颜色(图像、图像、CV_RGB2GRAY); int a=图像在(0,1)处

问题是:我用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);
Mat image=imread(“00001.jpg”,1);
CVT颜色(图像、图像、CV_RGB2GRAY);
int a=图像在(0,1)处;
printf(“%d”,a);
这实际上不起作用。如何使用任何数据类型(CV_8U、CV_32S…)获取像素值


谢谢

您可以尝试找出opencv用什么来表示它,以便更好地了解使用哪种类型:

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

cout您在这里犯了两个错误

读取图像时,指定1作为输入参数。如前所述,该函数可以读取三种不同格式的图像

CV_加载_图像_未更改(0)以RGB格式加载图像

对于您的情况,您必须使用
CV\u LOAD\u IMAGE\u GRAYSCALE
作为第二个参数

在下一步中使用:
image.at(0,1)与任何内容都不对应。您使用
但是编译器说“未签名?未签名什么?”

我认为更好的方法是使用正确的标签,如
CV\u LOAD\u IMAGE\u COLOR
CV\u LOAD\u IMAGE\u GRAYSCALE
。在下面的示例中,我将图像读入一个通道(
CV\u LOAD\u image\u 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;
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
Mat gImg=imread(“img.png”,CV\u LOAD\u IMAGE\u灰度);
乌查尔瓦尔;
val=在(0,0)处的框架;

cout首先,没有通用的方法以这种方式获取像素值。这意味着如果要使用
at
,您必须始终指定正确的值类型。在这种情况下,您应该执行
a=image.at(0,1);
,因为您将图像转换为8位无符号灰度(1通道)

您可能还应该使用CV_BGR2GRAY而不是RGB2GRAY,因为OpenCV使用BGR作为通道顺序

您也可以从一开始就将图像读取为灰度,然后再次使用
uchar

Mat image = imread("00001.jpg",0);    // note the 0 flag
int a=image.at<uchar>(0,1);
printf("%d ",a);
Mat image=imread(“00001.jpg”,0);//注意0标志
int a=图像在(0,1)处;
printf(“%d”,a);

有一种简单的方法可以做到这一点

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\u LOAD\u IMAGE\u COLOR);
无符号字符*输入=(无符号字符*)(img.data);
int i,j,r,g,b;
for(int i=0;i
这是关于彩色图像的。对于灰度图像

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];
     }
 }
Mat img=imread(“filename.jpg”,CV\u LOAD\u IMAGE\u COLOR);
matg;
CVT颜色(img、g、CV_bgr2灰色);
无符号字符*输入=(无符号字符*)(g.data);
int i,j,r,g,b;
for(int i=0;i

阅读更多相关内容。

您使用的是(0,1)而不是(0,0)?我知道深度和通道,但如果我知道矩阵用于常见的图像8位和无符号整数,那么矩阵是CV_8UC1,我应该将哪个参数传递到Mat::at?正好传递到这里:image.at(0,1)CV_8UC1表示8位无符号单通道,即
无符号字符
,表示0..255之间的值。无符号整数表示0..65536之间的值,即CV_16UC1。好的,这是可行的,但您尝试过这实际输出的内容吗?在我的例子中,像素(0,0)的值为-89。当图像为8位未签名图像时,这怎么可能?接下来我想问你为什么使用uchar?当然我已经尝试过了。我不知道你为什么不能正确获得输出。我使用uchar的原因与@count0在上面的注释中解释的完全相同,即它可以表示0到255之间的值。你不能使用imread这样。第二个参数是一个标志,它要么是0,>0,要么是谢谢你纠正了我的错误,鲍勃。我现在就编辑答案。