【问题标题】:Is there an OpenCV function to copy all pixels under a mask into an array?是否有一个 OpenCV 函数可以将掩码下的所有像素复制到一个数组中?
【发布时间】:2019-10-16 23:18:16
【问题描述】:

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

【问题讨论】:

    标签: opencv


    【解决方案1】:

    我不知道有任何 OpenCV 函数可以从掩码值创建向量,我在过去编写了自己的函数来执行此操作,您可以这样做。

    如果您的数据是 uint8,您也可以计算直方图并从中找出中位数。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        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 用于CV_32FC3,而不是通用uint8_t* dconst cv::Mat pixelData(1, 1, data.type(), d + j * pixelBitsize);

        【讨论】:

          猜你喜欢
          • 2019-10-20
          • 1970-01-01
          • 1970-01-01
          • 2014-11-14
          • 1970-01-01
          • 2021-04-04
          • 2021-12-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多