C++ OpenCV读取图像并使用整数值管理其像素(如matlab)

C++ OpenCV读取图像并使用整数值管理其像素(如matlab),c++,matlab,opencv,C++,Matlab,Opencv,在matlab中,当我使用imread函数时,图像的像素值存储在一个3D矩阵(uint8的)中。矩阵的值介于0和255之间。但在OpenCV中,imread函数将值存储在cv::Mat中。当我尝试查看像素值时,我会看到浮点值,当我尝试转换为整数时,我会看到较大的值 如何查看值介于0和255之间的cv::Mat组件(RGB),就像在Matlab中一样 提前谢谢 cv::Mat可用于任何类型的像素,如果使用imread,它将创建正确类型的cv::Mat 浮点图像是不寻常的-您确定源数据是浮点还是只是

在matlab中,当我使用imread函数时,图像的像素值存储在一个3D矩阵(uint8的)中。矩阵的值介于0和255之间。但在OpenCV中,imread函数将值存储在
cv::Mat
中。当我尝试查看像素值时,我会看到浮点值,当我尝试转换为整数时,我会看到较大的值

如何查看值介于0和255之间的
cv::Mat
组件(RGB),就像在Matlab中一样


提前谢谢

cv::Mat可用于任何类型的像素,如果使用imread,它将创建正确类型的cv::Mat

浮点图像是不寻常的-您确定源数据是浮点还是只是打印的值错误


您可以使用cvtcolor()将浮点图像转换为8位(CV8UC3)

我通常将图像存储在
IplImage*
类型中,而不是
cv::Mat
。如果我说
IplImage*frame=(以某种方式获取图像…
,那么我可以说
frame->imageData
来查看您感兴趣的值。这些值在单个数组中为RGB图像排列
[r1、b1、g1、r2、b2、g2、r3、b3、g3、…、r(高度*宽度)、b(高度*宽度)、g(高度*宽度)]
,我相信它们是按行排列的。

一个结果示例

我有这个:

Canny(test,edges,0.9*av[0],2*av[0],3,true);
    for(int i=0;i<edges.rows;i++){
        for(int j=0;j<edges.cols;j++){
            cv::Vec2w& elem = edges.at<cv::Vec2w>(i,j);
            std::cout << elem[0] << " , "<<elem[1] << std::endl;
        }
    }
Canny(测试,边缘,0.9*av[0],2*av[0],3,真);
对于(int i=0;i

这些是用于
IplImage
。不知道是否适用于Mat。
C=(0或1或2)
用于颜色通道。

您需要的是
边缘。at(i,j)
,而不是cv::Vec2w或cv::Vec2i。

我怀疑他打印的值是错误的。@msdark:要访问行
y
和列
x
处像素的蓝色部分,需要使用类似于
无符号字符b=mat.at(y,x)[0]
(图像在opencv中按BGR顺序加载)。例如,我有一个灰度图像,我尝试使用Vec3b、Vec2i和Vec2f。使用Vec3b,我可以看到Vec2i(20200385111632856665)的(v,z)值对于Vec2f来说,Vec2i.cv::Mat的浮点版本与iplimage的格式相同,像素颜色的顺序没有定义,这取决于读取它们的来源。许多相机都会生成BGR,特别是在windows上
int red = (int)((uchar*)pImg->imageData)[y*((int)pImg->widthStep)+x*3+C];