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

时间:2011-03-13 23:52:02

标签: c++ matlab opencv

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

如何在Matlab中看到值为0到255的cv::Mat组件(RGB)?

提前致谢!

5 个答案:

答案 0 :(得分:1)

cv :: Mat可以与任何类型的像素一起使用,如果使用imread,它将创建一个正确类型的cv :: Mat。

浮点图像不常见 - 您确定源数据是浮点数还是仅打印错误值?

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

答案 1 :(得分:1)

int red = (int)((uchar*)pImg->imageData)[y*((int)pImg->widthStep)+x*3+C];

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

答案 2 :(得分:0)

我通常将图片存储在IplImage*类型而不是cv::Mat中。如果我说IplImage* frame = (get image somehow...),那么我可以说frame->imageData来查看您感兴趣的值。这些值是针对单个数组[r1, b1, g1, r2, b2, g2, r3, b3, g3, ..., r(height*width), b(height*width), g(height*width)]中的RGB图像排列的,我相信它们是按行安排。

答案 3 :(得分:0)

结果的一个例子

我有这个:

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;
        }
    }

edge(cv :: Mat)变量存储cv :: Canny函数(二进制图像)的结果..当我尝试使用cv :: Vec2w看到像素的值时,我得到结果: 6408,2058 1817年,7433年 1540,282 5386,1024 15,4867 768,275 1285,512 2,0 0,0 1,256 与cv :: Vec2

0,0 0,0 0,0 0,0 0,-256 255,-256 0,0 0,0

使用cv :: Vec2i

0,0 0,0 -16777216,-16776961 0,0 0,-256 -1,65535 0,-16777216 65535,0 0,0

依旧......

但是例如,如果我写这个图像(imwrite(“image.pgm”,edge))然后用armadillo读取(图像是单通道二进制图像)我得到的结果是矩阵( nx1)的值介于0和255之间..我知道..两个库的格式不同,但是......我习惯:二进制图像在一个通道中的值总是为0和255 ....

答案 4 :(得分:0)

你需要的是edges.at<cv::Vec2b>(i,j),而不是cv :: Vec2w或cv :: Vec2i。