cv::Mat.data 总是返回相同的值

Posted

技术标签:

【中文标题】cv::Mat.data 总是返回相同的值【英文标题】:cv::Mat.data always returns the same value 【发布时间】:2019-04-08 16:19:03 【问题描述】:

我有一张红色图片 - 仅用于测试。 RGB 颜色为 (217/18/36)。

我执行以下代码:

void QuaterImage(Mat& SrcImage, Mat& DestImage, bool Downsample) 
    int newWidth = 0, newHeight = 0;
    int newOrigWidth = 0, newOrigHeight = 0;

    if (SrcImage.cols % 2 > 0)  newOrigWidth = SrcImage.cols - 1;  else  newOrigWidth = SrcImage.cols; 
    if (SrcImage.rows % 2 > 0)  newOrigHeight = SrcImage.rows - 1;  else  newOrigHeight = SrcImage.rows; 

    if (SrcImage.depth() != CV_8U)  return; 

    newHeight = newOrigHeight / 2;
    newWidth = newOrigWidth / 2;

    DestImage = Mat(newWidth, newHeight, SrcImage.type());
    int r = 0, c = 0;
    uchar* DataPtr = SrcImage.ptr<uchar>(0);

    std::cout << std::to_string(*DataPtr) << std::endl;
    return;

它总是返回“205”。

如果我将图像更改为完全黄色,它会返回完全相同的值。怎么可能?

问候, 一月

【问题讨论】:

你只考虑bmp的第一个字节,真的是你想要的吗? 请发帖minimal reproducible example。你在这里重新定义SrcImage 嗨,postet 函数。我知道,我目前只访问第一个字节。这不是我想要的 - 但目前,我正在寻找错误......如果那是固定的,我会继续。最后,我喜欢设计一个函数,它可以尽可能快地对一半宽度和一半高度的图像进行下采样。因此,我只想对核心图像中的一个像素取四个像素的平均值。 不,我只剪切了计算新宽度和新高度的部分。您可以删除该部分,因为它直到现在才使用。指针的赋值和输出完全一样。 也许你只是想要这个:***.com/questions/10431919/… 【参考方案1】:

好的,对不起,我明白了。你看不到它。我为SrcImageDestImage 提供了相同的图像,所以DestImage = Mat(newWidth, newHeight, SrcImage.type()); 覆盖了图像。在该行之前,值是正确的。

对不起……

【讨论】:

对于未来的错误,它是 Mat(height, width, ...) 顺序

以上是关于cv::Mat.data 总是返回相同的值的主要内容,如果未能解决你的问题,请参考以下文章

当返回指向本地数组的指针时,为啥它总是相同的值?

决策树总是为不同的输入返回相同的值

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

DB2 AS400 Java 函数总是返回相同的值

Java ArrayList Contain 总是返回 false,尽管它包含相同的值

检查每行C++的数组行中是不是总是有相同的值