gpt4 book ai didi

c++ - calcopticalflowpyrlk 断言失败

转载 作者:太空宇宙 更新时间:2023-11-03 22:50:33 24 4
gpt4 key购买 nike

我正在尝试在 Ubuntu 上的 opencv 2.4.12 中使用以下代码进行视频稳定,我使用 calcopticalflowpyrlk,它会引发断言失败错误:错误如下:

OpenCV 错误:断言失败 ((npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0) in cv::calcOpticalFlowPyrLK,文件主页...\opencv\modules\video\src\lkpyramid.cpp,第 845 行

代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <iostream>
#include <stdlib.h>

#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>


using namespace cv;
using namespace std;




int main()
{

int rows = 240;
int cols = 240;
int i = 1;

VideoCapture cap(0);

Mat Canvass;
Canvass.create(rows, cols * 2, CV_8UC3);




for(;;)
{Mat prev,cur;

Mat prev_gray,cur_gray, aligned;
Mat TT(2, 3, CV_64F);

vector <Point2f> cur_corner, cur_corner2, prev_corner2;
vector <Point2f> prev_corner;
Mat prev_grey;
vector <uchar> status;
vector <float> err;
double dx, dy, da;

const int max_no_of_corners = 20000;
const double quality_of_corners = 0.00001;
const double min_dist_bw_corners = 5;
const int search_window_size = 80;
const int pyramid_level = 5;

Mat cur_warped;
int rows = 240;
int cols = 240;


if(i == 1)
{ //capture the prev frame,resize,grayscale and display it
for (int x = 0; x < 10;x++)
{ cap >> prev; }

resize(prev, prev,Size(240,240));
cvtColor(prev,prev_gray,CV_BGR2GRAY);
prev.copyTo(Canvass(Range::all(), Range(0,cols)));
//capture the current frame,resize and grayscale it
cap>>cur;
resize(cur,cur,Size(240,240));
cvtColor(cur,cur_gray,CV_BGR2GRAY);
i++;
}
else{
cap>>cur;
resize(cur,cur,Size(240,240));
cvtColor(cur,cur_gray,CV_BGR2GRAY);
cvtColor(prev,prev_gray,CV_BGR2GRAY);
//display the previous image in canvass
cur.copyTo(Canvass(Range::all(), Range(0,cols)));

}

///find corner points here

goodFeaturesToTrack(prev_grey, prev_corner, max_no_of_corners, quality_of_corners, min_dist_bw_corners);

//usecalcopticalflowpyrlk
calcOpticalFlowPyrLK(prev_gray, cur_gray, prev_corner, cur_corner, status, err, Size(10,10),2);

//weed out bad matches
for (int t = 0; t < status.size(); t++) {
if (int(status[t])) {

cur_corner2.push_back(cur_corner[t]);
prev_corner2.push_back(prev_corner[t]);
}
}



//estimate transform
Mat T;
T = estimateRigidTransform(prev_corner2, cur_corner2,false);

if (T.data == NULL)
{cout<<"No transform found"<<endl;
cur.copyTo(Canvass(Range::all(), Range(cols,cols * 2)));
cur.copyTo(prev);
}
else{
cout<<"transform found "<<endl;
// decompose T
dx = T.at<double>(0, 2);
dy = T.at<double>(1, 2);
da = atan2(T.at<double>(1, 0), T.at<double>(0, 0));
da = -da;
//da = 0;
TT.at<double>(0, 0) = cos(da);;
TT.at<double>(0, 1) = -sin(da);
TT.at<double>(1, 0) = sin(da);
TT.at<double>(1, 1) = cos(da);
TT.at<double>(0, 2) = -dx;// / scale;
TT.at<double>(1, 2) = -dy;// / scale;
//TT.copyTo(Transform);

//warp
warpAffine(cur, cur_warped, TT, cur.size(),INTER_NEAREST|WARP_INVERSE_MAP);
cur.copyTo(prev);
cur_warped.copyTo(Canvass(Range::all(), Range(cols,(cols * 2))));
}

imshow( "Output",Canvass);
waitKey(1);
}

}

我认为 calcopticalflowpyrlk 中的 vector 数据类型可能存在一些问题,但我已经通过文档对其进行了验证,但我仍然遇到此错误。我该如何摆脱它?

最佳答案

你能显示和检查prev_corner.size()cur_corner.size()吗?根据断言,这些 vector 似乎是空的。如果是这种情况 - 只需检查您是否有足够的特征点来寻找对应关系。

顺便说一句,您还应该在调用 estimateRigidTransform() 之前检查匹配项的数量;如果我没记错的话 - 它至少需要 3 个对应关系(估计 6 个自由度)。

关于c++ - calcopticalflowpyrlk 断言失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38721313/

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