Android - OpticalFlow:calcOpticalFlowPyrLK & goodFeaturesToTrack 返回相同的点

Posted

技术标签:

【中文标题】Android - OpticalFlow:calcOpticalFlowPyrLK & goodFeaturesToTrack 返回相同的点【英文标题】:Android - OpticalFlow: calcOpticalFlowPyrLK & goodFeaturesToTrack return same points 【发布时间】:2012-11-05 15:16:03 【问题描述】:

我正在开发一款 android 视频稳定应用程序! 我遇到了一些与 goodfeaturestotrack 和 calcOpticalFlowPyrLK 函数相关的问题,因为最终输出是相同的点! 我用谷歌搜索了每个网站,但我无法解决它! 我的代码有什么问题?

mRgba1 = new Mat(height, width, CvType.CV_8UC4);
mRgba2 = new Mat(height, width, CvType.CV_8UC4);
mGray1 = new Mat(mRgba1.size(), CvType.CV_8UC1);
mGray2 = new Mat(mRgba2.size(), CvType.CV_8UC1);
mView = new Mat(height, width, CvType.CV_8UC4);
initial = new MatOfPoint();
status = new MatOfByte();
err = new MatOfFloat();
mask = new Mat(mRgba1.size(), CvType.CV_8UC1);
prevPts = new MatOfPoint2f();
nextPts = new MatOfPoint2f();
Imgproc.goodFeaturesToTrack(mGray1, initial, maxCorners, 0.01, 0.01);
initial.convertTo(prevPts, CvType.CV_32FC2);
Video.calcOpticalFlowPyrLK(mGray1, mGray2, prevPts, nextPts, status, err, winSize, 5, optical_flow_termination_criteria, 0, 1);

然后,当我向他们展示时:

Point[] pointp = prevPts.toArray();
Point[] pointn = nextPts.toArray();
for (Point px : pointp) 
 Core.circle(mView, px, 15, circleColor); 
for (Point py : pointn) 
 Core.circle(mView, py, 5, line_color); 

我在同一个位置有 2 个不同的圆圈,这不好:(

【问题讨论】:

嗨。代码的运行速度有多快?我的相机只有 3 fps。 嗨,我正在做同样的事情,我收到断言失败错误“OpenCV 错误:断言失败 ((npoints = prevPtsMat.checkVector(2, CV_32F, true)) >= 0) in void cv::calcOpticalFlowPyrLK(cv::InputArray, cv::InputArray, cv::InputArray, cv::InputOutputArray, cv::OutputArray, cv::OutputArray, cv::Size, int, cv::TermCriteria, int, double ),文件 /builds/master_pack-android/opencv/modules/video/src/lkpyramid.cpp,第 1110 行"任何帮助 【参考方案1】:

我认为问题在于视频捕获一遍又一遍地传递相同的图像。 您是否尝试克隆视频捕捉垫! 另外要尝试的另一件事是,calcOpticalFlowPyrLK 有 3 种不同的调用方式。我建议使用这个

Video.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts, status, err, winSize, maxLevel)

:D

TermCriteria termcrit = new TermCriteria(TermCriteria.MAX_ITER|TermCriteria.EPS,25,0.03);
        Video.calcOpticalFlowPyrLK(temp3, temp2, prevPts, nextPts, status, err, winSize, 5);
        //Video.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts, status, err)
        //Video.calcOpticalFlowPyrLK(temp3, temp2, prevPts, nextPts, status, err, winSize, 5, termcrit, 0, 1);

【讨论】:

欢迎来到 Stack Overflow!本节用于解答。如果您还有其他问题,请点击 按钮进行提问。 是的,他的问题是他没有正确处理(prevImg,nextImg,prevPts,nextPts)。 只是为了澄清。如果您有类似的内容:mGray1 = mGray2; 将其更改为:mGray1 = mGray2.clone();

以上是关于Android - OpticalFlow:calcOpticalFlowPyrLK & goodFeaturesToTrack 返回相同的点的主要内容,如果未能解决你的问题,请参考以下文章

ANDROID_MARS学习笔记_S02重置版_001_HanderLooperMessageThreadThreadLocal

Android自学日记使用DatePicker以及TimePicker显示当前日期和时间

Android工具类篇 超详细的时间工具类

Android java以24小时格式获取当前时间

Android攻城狮datePicke&timePicker

光流中的 velX 和 velY(如何添加它们)