在matlab中,当我使用imread函数时,图像的像素值存储在3d矩阵(uint8)中。矩阵的值介于0到255之间。但是在OpenCV中,imread函数将值存储在cv::Mat
中。当我试图看到像素的值时,我看到浮点值,当我尝试转换为整数时,我有很大的值。
如何在Matlab中看到值为0到255的cv::Mat
组件(RGB)?
提前致谢!
答案 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。