我想在OpevCV的遮罩区域中找到中间颜色。 OpenCV是否具有获取图像和蒙版的功能,并且仅将蒙版= 0的图像中的像素放入数组或Mat
中?
答案 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())
,其中n
是mask
中非零元素的数量。
可以通过使用特定于图像类型的d
指针(例如,cv::Vec3f
的{{1}}代替通用CV_32FC3
和uint8_t* d
来优化。