C++ 使用superres从多个图像创建超分辨率图像

C++ 使用superres从多个图像创建超分辨率图像,c++,opencv,C++,Opencv,我有一系列图像,从中提取一张卡片。完成此过程后,卡将正确对齐并投影回平面(透视图)。但是质量太低,无法读取该卡上的文本。因此,我尝试使用superres模块来提高分辨率,但是文档很浅,我还没有找到如何将多个图像传递给算法 我试图实现一个定制的FrameSource,它基本上是一个std::vector的适配器,但由于某种原因,我得到了一个segfault class InterFrameSource : public superres::FrameSource { std::vector&l

我有一系列图像,从中提取一张卡片。完成此过程后,卡将正确对齐并投影回平面(
透视图
)。但是质量太低,无法读取该卡上的文本。因此,我尝试使用superres模块来提高分辨率,但是文档很浅,我还没有找到如何将多个图像传递给算法

我试图实现一个定制的
FrameSource
,它基本上是一个
std::vector
的适配器,但由于某种原因,我得到了一个segfault

class InterFrameSource : public superres::FrameSource {
  std::vector<cv::Mat> frames;
  std::vector<cv::Mat>::iterator iter;

public:
  InterFrameSource(std::vector<cv::Mat> _frames) : frames(_frames)
  {
    reset();
  }

  virtual void nextFrame(OutputArray _frame)
  {
    _frame.getMatRef().setTo(*iter);
    ++iter;
  }

  virtual void reset() {
    iter = frames.begin();
  }
};
class InterFrameSource:public superres::FrameSource{
向量帧;
std::vector::iter;
公众:
帧间源(标准::向量_帧):帧(_帧)
{
重置();
}
虚拟空下一帧(输出阵列_帧)
{
_frame.getMatRef().setTo(*iter);
++iter;
}
虚拟无效重置(){
iter=frames.begin();
}
};
编辑
cv::Mat
都是CPU专用的。

好的,两天后我终于拿到了。我需要反转复制逻辑:

virtual void nextFrame(OutputArray _frame)
{
  if (iter == frames.end()) return;

  iter->copyTo(_frame);
  ++iter;
}

你从来没有检查过iter==end()?是的,你是对的,但是segfault发生在第一次调用时,向量中有元素,但是调用很好!嗨,你能分享一下你用来将视频转换成帧的完整代码吗?我正在努力使超分辨率的代码工作,但我似乎无法找出它,这可能会有所帮助。对不起,这是一个旧的项目,我没有在手的源代码了。但是如果我没记错的话,我只是在这个问题中结合了两个源代码片段(只需将原始问题中的
nextFrame
替换为更新的)。