我知道 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 彩色图像。
我是一名优秀的程序员,十分优秀!