gpt4 book ai didi

c++ - cvCalcOpticalFlowHS() opencv 抛出异常

转载 作者:行者123 更新时间:2023-11-28 03:35:50 26 4
gpt4 key购买 nike

嘿,我正在尝试整理openCV的光流功能,但由于某种原因我在visual studio中遇到异常:

Optical_flow.exe 中 0x772615de 处的未处理异常:Microsoft C++ 异常:内存位置 0x0036f334 处的 cv::Exception..

通过断点,我发现错误出在 cvCalcOpticalFlowHS 函数中。

我正在使用 openCV 2.1

#include <cv.h>
#include <highgui.h>
using namespace cv;

int init() {
return 0;
}

int main(int argc, char **args) {
CvCapture* capture = cvCaptureFromFile("Video/Wildlife.wmv");
double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

CvSize size;
size.width = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
size.height = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);

CvVideoWriter* writer = cvCreateVideoWriter("result.avi", 0, fps,size, 1);

IplImage* curFrame = cvQueryFrame(capture);

Mat u = Mat(size, CV_32FC2);
Mat v = Mat(size, CV_32FC2);

CvTermCriteria IterCriteria;
IterCriteria.type = CV_TERMCRIT_ITER | CV_TERMCRIT_EPS;
IterCriteria.max_iter = 500;
IterCriteria.epsilon = 0.01;

while(1) {
IplImage* nextFrame = cvQueryFrame(capture);

if(!nextFrame) break;

u = Mat::zeros(size, CV_32FC2);
v = Mat::zeros(size, CV_32FC2);

/* Do optical flow computation */
cvCalcOpticalFlowHS(&curFrame, &nextFrame, 0, &u, &v, 0.01, IterCriteria);

cvWriteFrame(writer, curFrame);

curFrame = nextFrame;
}

cvReleaseVideoWriter(&writer);
cvReleaseCapture(&capture);

return 0;
}

有人以前见过这个问题或看到我犯的错误吗?

最好的问候

雷姆科

最佳答案

来自 the documentation , curFrame 和 nextFrame 应该是 8 位单 channel 。您目前只是从加载的文件中提取这些内容,而没有根据需要检查/转换它们。你能确认输入的类型正确吗?

您还混合了 C++ 风格的 cv::Mat 和 C 风格的 IplImage*。我建议您升级到更新版本的 OpenCV(最近发布了 2.4),并尝试坚持使用 C++ 或 C 风格的方法。

另请注意,此光流法已被归类为过时,建议使用 calcOpticalFlowPyrLK()对于稀疏特征或 calcOpticalFlowFarneback()用于密集特征。

下面是一些演示 calcOpticalFlowFarneback() 的示例代码,我相信您正在努力实现这一目标。它从网络摄像头而不是文件中获取数据。

#include <opencv2/opencv.hpp>

using namespace cv;

void drawOptFlowMap(const cv::Mat& flow,
cv::Mat& cflowmap,
int step,
const cv::Scalar& color
)
{
for(int y = 0; y < cflowmap.rows; y += step)
for(int x = 0; x < cflowmap.cols; x += step)
{
const cv::Point2f& fxy = flow.at<cv::Point2f>(y, x);
cv::line(cflowmap,
cv::Point(x,y),
cv::Point(cvRound(x+fxy.x),cvRound(y+fxy.y)),
color);
cv::circle(cflowmap, cv::Point(x,y), 2, color, -1);
}
}

int main(int argc, char **args) {

VideoCapture cap(0); // open the default camera
if(!cap.isOpened()) // check if we succeeded
return -1;

Mat newFrame, newGray, prevGray;


cap >> newFrame; // get a new frame from camera
cvtColor(newFrame, newGray, CV_BGR2GRAY);
prevGray = newGray.clone();

double pyr_scale = 0.5;
int levels = 3;
int winsize = 5;
int iterations = 5;
int poly_n = 5;
double poly_sigma = 1.1;
int flags = 0;

while(1) {
cap >> newFrame;
if(newFrame.empty()) break;
cvtColor(newFrame, newGray, CV_BGR2GRAY);

Mat flow = Mat(newGray.size(), CV_32FC2);

/* Do optical flow computation */
calcOpticalFlowFarneback(
prevGray,
newGray,
flow,
pyr_scale,
levels,
winsize,
iterations,
poly_n,
poly_sigma,
flags
);

drawOptFlowMap(flow, newFrame, 20, CV_RGB(0,255,0));

namedWindow("Output",1);
imshow("Output", newFrame);
waitKey(1);

prevGray = newGray.clone();
}

return 0;
}

以上代码与OpenCV自带的fback.cpp示例代码非常相似。

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

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