所谓mask,就是我们常常说到的掩膜,在opencv中,利用掩膜,我们可以完成对图像ROI的局部操作;可以对图像进行滤波;可以在进行特征匹配的绘制时仅选取匹配较好的点进行绘制。总之,掩膜的很大一种用途是对Mat的元素进行精确的部分选中操作。
然而,在不同的函数中mask的数据类型不同,现举两个例子:
1.drawMatches中的mask
void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
InputArray img2, const std::vector<KeyPoint>& keypoints2,
const std::vector<DMatch>& matches1to2, InputOutputArray outImg,
const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1),
const std::vector<char>& matchesMask=std::vector<char>(), int flags=DrawMatchesFlags::DEFAULT );
该函数用于绘制特征匹配结果,他的mask的类型是
vector<char>
因此我们这样初始化mask:
vector<char> mask;
2.findFundamentalMat、findHomography中的mask
cv::Mat cv::findFundamentalMat( InputArray _points1, InputArray _points2,
OutputArray _mask, int method, double param1, double param2 )
可见,mask是一个OutputArray类型的变量,应为一个1×n或n×1的Mat变量。
之前在编程时把两个函数的mask用法搞混了,半天没发现错在哪儿…一看函数的定义才反应过来…