我正在用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++;
}
代码片段很奇怪。它不应该编译。 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()
。