c++ - 写入 InputOutputArray 抛出异常

标签 c++ opencv

我正在尝试使用 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/

相关文章:

c++ - 使用 mingw 将静态库 (.a) 链接到 exe

c++ - 图像处理 : Algorithm Improvement for 'Coca-Cola Can' Recognition

python - VideoCapture 在 Python OPENCV [Linux] 中始终返回 False

c++ - EnumWindows( ) 没有找到一些顶层窗口?

c++ - 是否可以使用 Clang 3.1 和 VC11 Beta header 编译 C++ 源代码?

C++ UDP套接字数据包排队

c++ - CGAL union 误解

opencv - 如何将坐标从霍夫变换(rho,theta)转换回图像(x,y)?

c++ - cv::connectedComponents 与 cv::findContours 的实现和速度差异

c++ - 无法编辑外部变量