我正在使用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++;
}
答案 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()
。