我正在尝试使用 OpenCV v3.0 在 Visual Studio 2013 中测试一些运动估计(这可能是我的第一个错误!)。我在尝试使用 createOptFlow_DualTVL1() 和 createOptFlow_Farneback() 时遇到未处理的异常,然后为了测试,尝试了 cv::accumulate(),这引发了相同的异常。
似乎 OpenCV 无法写入我正在传递这些函数的 Mat 对象。我无法读取实际的 cvException,因为我没有 PDB 文件,因为我自己没有编译这个版本。那可能是我的下一站,但在我这样做之前我想我会看看以前是否有人见过这种行为。
这是一个最小的工作示例:
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/video/tracking.hpp>
#include <opencv2/videoio/videoio.hpp>
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <string>
#include <regex>
using namespace std;
using namespace cv;
int main(int argc, const char** argv)
{
VideoCapture captureDevice;
std::string videoname = "example.mp4";
captureDevice.open(videoname);
//setup image files used in the capture process
Mat currFrame, dst;
captureDevice >> currFrame;
accumulate(currFrame, dst, cv::noArray());
imshow("outputCapture", dst);
//pause for 33ms
waitKey(33);
return 0;
}
最佳答案
dst
应与 currFrame
大小相同,类型为 CV_32FC3
。
因此,在调用 accumulate
-
dst.create(currFrame.size(), CV_32FC3);
由于dst
是float类型,需要将其转换为uchar才能显示。为此,如下所示进行转换 -
Mat dst_disp;
dst.convertTo(dst_disp, CV_8UC3);
imshow("outputCapture",dst_disp );
此外,当您在 dst
中累积更多帧时,您将需要根据缓存在 dst
中的帧数(假设为 N
)进行归一化>。简单地说,将dst
除以N
,然后将结果转换成CV_8UC3
并显示。例如,如果您在 dst
中累积了 1000 帧,请执行以下操作,
// Accumulate 1000 frames
for(int i = 0; i < 1000; i++)
accumulate(currFrame, dst, cv::noArray());
// Normalize
dst = dst/ 1000;
// Display the frame
Mat dst_disp;
dst.convertTo(dst_disp, CV_8UC3);
imshow("outputCapture",dst_disp );
否则,您可能会得到一张全白的图像。
更新
来自@berak 下面的评论。
对于规范化,只需使用
dst.convert(dst_disp, CV_8UC3, 1.0/N);
上面示例中的 N
将为 1000。
关于c++ - 写入 InputOutputArray 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26615609/