gpt4 book ai didi

c++ - OpenCV 的 calcOpticalFlowPyrLK 抛出异常

转载 作者:太空狗 更新时间:2023-10-29 20:05:03 31 4
gpt4 key购买 nike

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

OpenCV Error: Assertion failed (mytype == typ0 || (CV_MAT_CN(mytype) == CV_MAT_CV(type0) && ((1 << type0) & fixedDepthMask) != 0)) in unknown function, file ......\src\opencv\modules\core\src\matrix.cpp, line 1421

我正在解析的视频被分成 300 张图像,标记为“caml00000.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;
}

关于这个异常,我唯一读到的是它是在垫子采用不同格式时引起的,但是我已经尝试读取静态图像(参见上面关于“kitty.jpg”的代码),但我仍然得到同样失败的断言。有什么想法吗?

最佳答案

换行vector<char> featuresFound;vector<uchar> featuresFound;vector<int> err;Mat err;

我无法解释为什么,但这就是必须要做的。

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

关于c++ - OpenCV 的 calcOpticalFlowPyrLK 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623128/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com