在超分辨率文档中,输出下一帧所需的代码是:void superres::SuperResolution::nextFrame(OutputArray frame)
输入帧源必须通过以下方式设置:void superres::SuperResolution::setInput(const Ptr<FrameSource>& frameSource)
我有一段从视频中获取帧的代码:
#include "opencv2/opencv.hpp"#include "iostream"using namespace cv;using namespace std;int main(int, char**){ VideoCapture cap ( "video1.mp4" ); // 打开默认摄像头 if( ! cap.isOpened () ) // 检查是否成功打开 return -1; /* Mat edges; */ namedWindow ( "Video" , 1 ); double frnb ( cap.get ( CV_CAP_PROP_FRAME_COUNT ) ); std::cout << "帧总数 = " << frnb << endl; for(;;) { Mat frame; double fIdx; std::cout << "请输入帧索引? "; std::cin >> fIdx; if ( fIdx < 0 || fIdx >= frnb ) break; cap.set ( CV_CAP_PROP_POS_FRAMES , fIdx ); bool success = cap.read(frame); if ( ! success ) { cout << "无法读取帧 " << endl; break; } /* cap >> frame; // 从摄像头获取新帧 */ imshow("Video", frame); if ( waitKey (0) == 27 ) break; } // 摄像头会在VideoCapture析构函数中自动去初始化 return 0;}
鉴于此,我可以使用frame
变量作为setInput
方法的参数,但如何初始化生成输出的OutputArray frame
呢?
回答:
我认为你不能将frame
用作setInput
的参数,而且你不需要初始化OutputArray frame
。
查看这个示例:
FrameSource的创建方式如下:
121. frameSource = createFrameSource_Video(inputVideoName);
然后,outputArray frame的使用方式如下:
142. Mat result; // 无需初始化,只需声明 144. MEASURE_TIME(superRes->nextFrame(result));