我在OpenCV C ++中遇到了问题。 我从文件中读取图像并使用阈值函数来获取二进制图像。 之后我想访问阈值图像的像素值。
问题: 阈值图像的Mat :: data数组为0。
我用 阈值(src,img,220,255,CV_THRESH_BINARY); 与src和img beig cv :: Mat。
在img :: data ="之后调用"
这是我的代码:
// read image source
Mat src = imread("image.png", CV_LOAD_IMAGE_COLOR);
if(src.empty())
{
return -1;
}
cvtColor(src,src,CV_RGB2GRAY);
threshold(src, src, 220, 255, CV_THRESH_BINARY );
int line[1200];
int lineCount = 0;
for(int i=src.rows; i>src.rows/2; i-=10)
{
uchar* rowi = src.ptr(i-1);
int columnCount = 0;
// begin on the left of the image
for(int j=0; j<src.cols; j++)
{
uchar grayscale = src.at<uchar>(rowi[j]);
// write data to array
line[columnCount] = grayscale;
columnCount++;
}
}
我认为问题可能是关于cv :: Mat引用和复制Mat :: data:
感谢您的帮助!
答案 0 :(得分:0)
我想你已经检查过你的image.png(在转换为灰度后)包含的值高于220?
您可能希望尝试将cvtColor
作为非就地操作执行,因为它可能无法正确支持就地转换(请参阅https://stackoverflow.com/a/15345586/19254)。你可以这样做:
Mat dst;
cvtColor(src, dst, CV_RGB2GRAY);
...然后在threshold
上执行dst
。或者,您可以以灰度模式将图像读入内存(imread
的第二个参数可以是CV_LOAD_IMAGE_GRAYSCALE
),在这种情况下,cvtColor
调用不是必需的。
在每次通话之间,您可以imwrite
将您的图像转换为磁盘,以便找出哪个步骤无法正常工作。