OpenCV cv :: Mat" + ="在for循环中

时间:2018-03-04 06:47:44

标签: c++ opencv

我正在使用C ++进行简单的鬼影效果。我正在将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++;
}

1 个答案:

答案 0 :(得分: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()