Opencv矩阵值显示
问题是:我用OpenCV v.2.4.2加载灰度图像。 现在我想知道位置(0,0)处像素的值。 我试过: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)处
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,要么是谢谢你纠正了我的错误,鲍勃。我现在就编辑答案。