【发布时间】:2019-10-16 23:18:16
【问题描述】:
我想在 OpevCV 的蒙版区域中找到中间颜色。 OpenCV 是否具有获取图像和掩码的函数,并且仅将图像中 mask != 0 的像素放入数组或Mat?
【问题讨论】:
标签: opencv
我想在 OpevCV 的蒙版区域中找到中间颜色。 OpenCV 是否具有获取图像和掩码的函数,并且仅将图像中 mask != 0 的像素放入数组或Mat?
【问题讨论】:
标签: opencv
我不知道有任何 OpenCV 函数可以从掩码值创建向量,我在过去编写了自己的函数来执行此操作,您可以这样做。
如果您的数据是 uint8,您也可以计算直方图并从中找出中位数。
【讨论】:
您应该使用 Mat 类的以下函数通过 Mask 将所有像素复制到另一个 Mat 中:
Mat rst;
img.copyTo(rst, mask);
【讨论】:
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()),其中n 是mask 中非零元素的数量。
可以通过使用图像类型特定的d 指针进行优化(例如cv::Vec3f 用于CV_32FC3,而不是通用uint8_t* d 和const cv::Mat pixelData(1, 1, data.type(), d + j * pixelBitsize);。
【讨论】: