forC循环中的OpenCV cv :: Mat“+ =”

问题描述 投票:0回答:1

我正在用C ++编写一个简单的ghost-trail效果。我将cv::Mat图像添加到std::vector中,我有一个可以访问图像的功能,更改不透明度并添加两个,这有效:

void ghostEffect(std::vector<cv::Mat> &srcImages, cv::Mat &dstImage)
{
    static int currFrame = 0;
    dstImage = srcImages[currFrame%srcImages.size]*0.5+srcImages[(currFrame+1)%srcImages.size]*0.5;
    currFrame++;
}

我想使用for()循环迭代向量中的许多图像,但是当我这样做时,我得到一个seg错误。想知道我做错了什么?

void ghostEffect(std::vector<cv::Mat> &srcImages, cv::Mat &dstImage)
{
    static int currFrame = 0;
    for (int i = 0; i < srcImages.size; i++)
    {
        dstImage += srcImages[(currFrame+i)%srcImages.size]*(1/srcImages.size);
    }
    currFrame++;
}
c++ opencv
1个回答
0
投票

代码片段很奇怪。它不应该编译。 std::vector::size是一种方法,因此你的循环将i与方法std::vector::size的地址进行比较,该方法可能比矢量大小大得多。

如果向量大小大于1,则表达式1/srcImages.size()的结果总是为零,因为int类型的参数产生int类型。

我想你必须像下面这样编写函数代码:

void ghostEffect(std::vector<cv::Mat> &srcImages, cv::Mat &dstImage)
{
    static int currFrame = 0;
    for (int i = 0; i < srcImages.size(); i++)
    {
        dstImage += srcImages[(currFrame+i)%srcImages.size()]*(1.0/srcImages.size());
    }
    currFrame++;
}

第一个片段是幸运的巧合,直到currFrame超过矢量大小。用srcImages.size替换srcImages.size()

© www.soinside.com 2019 - 2024. All rights reserved.