我知道OpenCV仅支持二进制掩码。
但是我需要做一个覆盖,其中有一个灰度蒙版,它指定覆盖的透明度。
例如。如果蒙版中的像素为50%白色,则应表示该像素的cv::addWeighted
操作为alpha = beta = 0.5,gamma = 0.0。
现在,如果没有opencv库函数,您建议哪种算法最有效?
最佳答案
我做了这样的修复。
typedef double Mask_value_t;
typedef Mat_<Mask_value_t> Mask;
void cv::addMasked(const Mat& src1, const Mat& src2, const Mask& mask, Mat& dst)
{
MatConstIterator_<Vec3b> it1 = src1.begin<Vec3b>(), it1_end = src1.end<Vec3b>();
MatConstIterator_<Vec3b> it2 = src2.begin<Vec3b>();
MatConstIterator_<Mask_value_t> mask_it = mask.begin();
MatIterator_<Vec3b> dst_it = dst.begin<Vec3b>();
for(; it1 != it1_end; ++it1, ++it2, ++mask_it, ++dst_it)
*dst_it = (*it1) * (1.0-*mask_it) + (*it2) * (*mask_it);
}
我尚未使用断言优化此代码,也未使其变得安全。
工作假设:所有Mat和Mask的大小相同,Mat是正常的三 channel 彩色图像。