OpenCV 的 calcOpticalFlowPyrLK 抛出异常

OpenCV's calcOpticalFlowPyrLK throws exception

本文关键字:抛出异常 calcOpticalFlowPyrLK OpenCV      更新时间:2023-10-16

我一直在尝试用OpenCV形成一个小的光流例子一段时间了。除了函数调用calcOpticalFlowPyrLK之外,一切都正常,它在控制台窗口中打印以下失败的断言:

OpenCV错误:Assertion failed (mytype == typ0 || (CV_MAT_CN(mytype) == CV_MAT_CV(type0) &&((1 & lt; & lt;type0),fixedDepthMask) != 0))在未知函数中,文件......srcopencvmodulescoresrcmatrix.cpp,第1421行

我正在解析的视频被分成300个图像,标记为"caml00001.jpeg","caml00001.jpeg",…"caml00299.jpeg"。下面是我写的代码:

#include <cv.h>
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
using namespace std;
int main( int argc, char** argv ){
    char buff[100];
    int numFrames=300;
    char fileFormat[]="images/caml%05d.jpeg";
    string winname="Test Window";
    vector<Mat> imgVec(numFrames);
    auto itrImg=begin(imgVec);
    auto itrEnd=end(imgVec);
    vector<Point2f> featuresPrevious;
    vector<Point2f> featuresCurrent;
    namedWindow( winname, CV_WINDOW_AUTOSIZE );
    int fileNum=0;
    while(itrImg!=itrEnd){
        Mat& imgRef=*itrImg; //get this frame's Mat from the vector iterator
        //Calculate the name of the file;
        sprintf(buff,fileFormat,fileNum);
        string fileName=buff;
        //string fileName="kitty.jpg"; //attempted using a static picture as well
        cout << fileName << endl;
        Mat cImage=imread(fileName, CV_LOAD_IMAGE_GRAYSCALE);
        cImage.convertTo(imgRef, CV_8U); //also tried CV_8UC1
        featuresPrevious=std::move(featuresCurrent);
        goodFeaturesToTrack(imgRef,featuresCurrent,30, 0.01, 30); //calculate the features for use in next iteration
        if(!imgRef.data){ //this never executes, so there isn't a problem reading the files
            cout << "File I/O Problem!" << endl;
            getchar();
            return 1;
        }
        if(fileNum>0){
            Mat& lastImgRef=*(itrImg-1); //get the last frame's image
            vector<Point2f> featuresNextPos;
            vector<char> featuresFound;
            vector<int> err;
            calcOpticalFlowPyrLK(lastImgRef,imgRef,featuresPrevious,featuresNextPos,featuresFound,err); //problem line 
            //Draw lines connecting previous position and current position
            for(size_t i=0; i<featuresNextPos.size(); i++){
                if(featuresFound[i]){
                    line(imgRef,featuresPrevious[i],featuresNextPos[i],Scalar(0,0,255));
                }
            }
        }
        imshow(winname, imgRef);
        waitKey(1000/60); //not perfect, but it'll do
        ++itrImg;
        ++fileNum;
    }
    waitKey(0);
    return 0;
}

我所读到的关于这个异常的唯一一件事是,当Mats以不同的格式引起的,但是我试着读取静态图像(参见上面关于"kitty.jpg"的代码),我仍然得到相同的失败断言。什么好主意吗?

vector<char> featuresFound;改为vector<uchar> featuresFound;, vector<int> err;改为Mat err;

我不能解释为什么,但这是必须要做的。

编辑:正如@Sluki在评论中所说,err vector必须存储在浮点精度std::vector或cv::Mat中。