gpt4 book ai didi

c++ - OpenCV - 具有自定义前景/背景模型的 GrabCut

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:53:22 26 4
gpt4 key购买 nike

我想使用在 OpenCV 上实现的 GrabCut 算法。

documentation所示这是函数签名:

void grabCut(
InputArray img,
InputOutputArray mask,
Rect rect,
InputOutputArray bgdModel, // *
InputOutputArray fgdModel, // *
int iterCount,
int mode=GC_EVAL)

mode 参数,指示如何初始化算法,使用rect(矩形边界框)或使用ma​​sk (一个矩阵,其值对应于前景/背景区域的用户绘画。

我已经有了 FG 和 BG 的颜色模型,所以理想情况下我不需要提供 mask 或矩形,而是使用这些模型作为初始化(我想防止 OpenCV 计算新模型和请改用我的)。我看到 bgdModelfgdModel 参数以某种方式包含此模型信息。不幸的是,文档没有提供任何关于模型信息如何存储在那里的细节

是否可以使用现有数据填充这些模型并使用mode=GC_EVAL运行该方法?,如果可以,我该怎么做需要对模型进行编码?

最佳答案

在 opencv/sources/modules/imgproc/src/grabcut.cpp 中,您可以查看模型 (GMM) 的编码方式:

GMM::GMM( Mat& _model )
{
const int modelSize = 3/*mean*/ + 9/*covariance*/ + 1/*component weight*/;
if( _model.empty() )
{
_model.create( 1, modelSize*componentsCount, CV_64FC1 );
_model.setTo(Scalar(0));
}
else if( (_model.type() != CV_64FC1) || (_model.rows != 1) || (_model.cols != modelSize*componentsCount) )
CV_Error( CV_StsBadArg, "_model must have CV_64FC1 type, rows == 1 and cols == 13*componentsCount" );

model = _model;

coefs = model.ptr<double>(0);
mean = coefs + componentsCount;
cov = mean + 3*componentsCount;

for( int ci = 0; ci < componentsCount; ci++ )
if( coefs[ci] > 0 )
calcInverseCovAndDeterm( ci );
}

因此,对于每个模型,您都需要一个 1 x 65 双倍的 cv::Mat(componentsCount 等于 5)。每个分量有 3 个均值,因为它是在 RGB 色彩空间中计算的。使用 GC_EVAL 确实会使模型完好无损,但我从未尝试过使用预计算模型。

关于c++ - OpenCV - 具有自定义前景/背景模型的 GrabCut,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23806064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com