图像操作后 OpenCV Mat::data 为零

Posted

技术标签:

【中文标题】图像操作后 OpenCV Mat::data 为零【英文标题】:OpenCV Mat::data is zero after image operation 【发布时间】:2014-05-27 18:57:38 【问题描述】:

我在 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:

感谢您的帮助!

【问题讨论】:

目前还不清楚您的问题到底是什么。 Mat::data 数组 ... 为 0 是什么意思?是指针NULL?所有的值都为零吗?另外,您要解决的问题是什么?我相信有比使用嵌套循环更好的解决方案。 【参考方案1】:

我想您已经检查过您的 image.png(在转换为灰度之后)包含高于 220 的值?

您可能想尝试将cvtColor 作为非就地操作执行,因为它可能无法正确支持就地转换(请参阅https://***.com/a/15345586/19254)。例如,您可以这样做:

Mat dst;
cvtColor(src, dst, CV_RGB2GRAY);

...然后在dst 上执行threshold。或者,您可以在开始时以灰度模式将图像读入内存(imread 的第二个参数可以是CV_LOAD_IMAGE_GRAYSCALE),在这种情况下,不需要调用cvtColor

在每次调用之间,您可以imwrite 将您的图像保存到磁盘,以找出哪个步骤未按预期工作。

【讨论】:

以上是关于图像操作后 OpenCV Mat::data 为零的主要内容,如果未能解决你的问题,请参考以下文章

openCV 读取保存图像

OpenCV Mat 到数组访问

OpenCV3 image.depth() 为零

opencv cv::mat::data是什么数据类型?

Opencv图像基本操作——读取显示截取图像属性颜色通道边界填充图像融合

OpenCV——改变图像大小