是否有OpenCV函数将蒙版下的所有像素复制到数组中?

时间:2019-07-13 01:11:39

标签: opencv

我想在OpevCV的遮罩区域中找到中间颜色。 OpenCV是否具有获取图像和蒙版的功能,并且仅将蒙版= 0的图像中的像素放入数组或Mat中?

3 个答案:

答案 0 :(得分:1)

我不知道有任何OpenCV函数可以根据掩码值创建向量,我过去编写了自己的函数来做到这一点,

或者,如果您的数据为uint8,则可以计算直方图并找到其中值。

答案 1 :(得分:1)

您应该使用Mat类的以下功能通过使用Mask将所有像素复制到另一个Mat中:

Mat rst;
img.copyTo(rst, mask);

答案 2 :(得分:0)

Post现在已经很老了,但是-由于OpenCV中仍然没有可用的功能-我为我的应用实现了它。也许对任何人都有用...

cv::Mat extractMaskedData(cv::Mat data, cv::Mat mask)
{
    CV_Assert(mask.size()==data.size());
    CV_Assert(mask.type()==CV_8UC1);

    const bool isContinuous = data.isContinuous() && mask.isContinuous();
    const int nRows = isContinuous ? 1 : data.rows;
    const int nCols = isContinuous ? data.rows * data.cols : data.cols;

    const size_t pixelBitsize = data.channels() * (data.depth() < 2 ? 1 : data.depth() < 4 ? 2 : data.depth() < 6 ? 4 : 8);

    cv::Mat extractedData(0, 1, data.type());

    uint8_t* m;
    uint8_t* d;
    for (size_t i = 0; i < nRows; ++i) {
        m = mask.ptr<uint8_t>(i);
        d = data.ptr(i);
        for (size_t j = 0; j < nCols; ++j) {
            if(m[j]) {
                const cv::Mat pixelData(1, 1, data.type(), d + j * pixelBitsize);
                extractedData.push_back(pixelData);
            }
        }
    }

    return extractedData;
}

它返回cv::Mat(1,n,data.type()),其中nmask中非零元素的数量。

可以通过使用特定于图像类型的d指针(例如,cv::Vec3f的{​​{1}}代替通用CV_32FC3uint8_t* d来优化。